求助:调试TEA5767收音模块选什么的问题

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 22, 距离下一级还需 178 积分
论坛徽章:0
小女子求教!!!!
最近想在自己的板子(mini2440)上加入一个调频收音机模块,就选了TEA5767收音机模块,开发板是Linux操作系统,2.6.32.2内核,在网上找了一个2.4内核的驱动程序,想稍微修改一下就用,可是编译的时候出了不少错,将里将就的排除了那些错误,能编译了,然后以模块化的方式加载进开发板内核,出了很多的错误啊,让我云里雾里,错误如下:
[root@FriendlyARM /]# modprobe fm_driver
FM Radio TEA5767HN driver for i.MX21, Gary.
Unable to handle kernel NULL pointer dereference at virtual address
pgd = c3acc000
[] *pgd=33ac8031, *pte=, *ppte=
Internal error: Oops: 17 [#1]
last sysfs file: /sys/devices/virtual/vc/vcs4/dev
Modules linked in: fm_driver(+)
CPU: 0& & Not tainted&&(2.6.32.2-FriendlyARM #3)
PC is at strcmp+0x18/0x40
LR is at kset_find_obj+0x40/0x74
pc : [&c014f6a0&]& & lr : [&c014b71c&]& & psr: a0000013
sp : c3a55eb0&&ip : c3800f40&&fp : c3a55ebc
r10: bf003000&&r9 : &&r8 : c0503660
r7 : c3807940&&r6 : &&r5 : c392cb44&&r4 : c3838c60
r3 : c3800f40&&r2 : &&r1 : &&r0 :
Flags: NzCv&&IRQs on&&FIQs on&&Mode SVC_32&&ISA ARM&&Segment user
Control: c000717f&&Table: 33acc000&&DAC:
Process modprobe (pid: 733, stack limit = 0xc3a54270)
Stack: (0xc3a55eb0 to 0xc3a56000)
5ea0:& && && && && && && && && && && && & c3a55edc c3a55ec0 c014b71c c014f698
5ec0: bf000980 bff4 c3a55efc c3a55ee0 c4b6ec
5ee0: bfa18b7 c04f4 c3a55f1c c3a55f00 c024f760 c018758c
5f00: a18b7 bf000a78 c3a5f34 c3a55f20 bf00302c c024f73c
5f20: a18b7 c3a55f7c c3a55f38 c003032c bf00
5f40: 01a84 000a18b7 bf000a78 01a84 000a18b7 bf000a78
5f60: 310c8 c3a00 c3a55fa4 c3a55f80 c30300
5f80: c009b6b0 c009b5a0 000b61ea 000c8 0fa8
5fa0: cea 000c8 a18b7
5fc0: 000b61ea 000c8 b61ea be943f71 000b61ea
be9439bc d3c24 c0
Backtrace:
[&c014f688&] (strcmp+0x0/0x40) from [&c014b71c&] (kset_find_obj+0x40/0x74)
[&c014b6dc&] (kset_find_obj+0x0/0x74) from [&c01875d4&] (driver_register+0x58/0x
r7:c04ff3030 r5:bf:bf000980
[&c018757c&] (driver_register+0x0/0x15c) from [&c024f760&] (i2c_register_driver+
r7:c04ffa18b7 r4:bf000980
[&c024f72c&] (i2c_register_driver+0x0/0x9 from [&bf00302c&] (tea5767hn_init+0x
2c/0xb4 [fm_driver])
r7:c3a54000 r6:bf000a78 r5:000a18b7 r4:00001a84
[&bf003000&] (tea5767hn_init+0x0/0xb4 [fm_driver]) from [&c003032c&] (do_one_ini
tcall+0x3c/0x1c
r5:000a18b7 r4:00001a84
[&c00302f0&] (do_one_initcall+0x0/0x1c from [&c0070344&] (sys_init_module+0xd0
[&c0070274&] (sys_init_module+0x0/0x204) from [&c0030f20&] (ret_fast_syscall+0x0
r7::000ad008 r5:000cb61ea
Code: e24cb004 e3a0c000 e7dc0002 (e7d13002)
---[ end trace 88fb99f5c01581db ]---
Segmentation fault
搞不懂该怎么去排错,google和baidu都找过,可能是本人能力不够,没查出些什么线索,希望大家给点指导和意见啊
有搞过收音机驱动开发的GG、前辈们,希望能传些资料给我,呵呵,小女子在此拜谢了。。。邮箱:,
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 88, 距离下一级还需 112 积分
论坛徽章:0
struct i2c_driver的struct device_driver的const char *name的定义有问题
这种问题根这call back提示找,不是很难的
[&c014f688&] (strcmp+0x0/0x40) from [&c014b71c&] (kset_find_obj+0x40/0x74)
[&c014b6dc&] (kset_find_obj+0x0/0x74) from [&c01875d4&] (driver_register+0x58/0x
r7:c04ff3030 r5:bf:bf000980
[&c018757c&] (driver_register+0x0/0x15c) from [&c024f760&] (i2c_register_driver+
r7:c04ffa18b7 r4:bf000980
[&c024f72c&] (i2c_register_driver+0x0/0x9 from [&bf00302c&] (tea5767hn_init+0x
2c/0xb4 [fm_driver])
FM驱动,涉及到音频,如果完全自己调试,非常有难度的
小富即安, 积分 2555, 距离下一级还需 2445 积分
论坛徽章:1
yhl2007kaka
& & 这收音机模块用的是啥芯片,到厂商网站上,应该有2。6的驱动的
白手起家, 积分 22, 距离下一级还需 178 积分
论坛徽章:0
goldenfort
& & 芯片是PHILIPS公司生产的TEA5767,你是说在它的官网会有它的驱动吗?我去找找看,多谢了~~~~
巨富豪门, 积分 26747, 距离下一级还需 13253 积分
论坛徽章:1
回复&&goldenfort
& & 芯片是PHILIPS公司生产的TEA5767,你是说在它的官网会有它的驱动吗?我去找找看 ...
yhl2007kaka 发表于
11:30 video for linux上面应该有的。
丰衣足食, 积分 967, 距离下一级还需 33 积分
论坛徽章:0
2.6.32\drivers\media\radio\radio-tea5764.c 应该相差不大吧
小富即安, 积分 2555, 距离下一级还需 2445 积分
论坛徽章:1
yhl2007kaka
& & 我昨天在nxp&&的网站上没有找到
白手起家, 积分 22, 距离下一级还需 178 积分
论坛徽章:0
& & 呵呵,多谢啦!我看看去,就是不知道行不行。。。。
白手起家, 积分 22, 距离下一级还需 178 积分
论坛徽章:0
goldenfort
& & 恩恩恩,好像是没有。。。
富足长乐, 积分 5530, 距离下一级还需 2470 积分
论坛徽章:0
用google搜索“TEA5767 linux driver”,就可以找到对应的驱动,比如:
应该对你有帮助。
同时也可以找到对应的Application Note:
APPLICATION NOTE: Low voltage FM stereo radio with TEA5767/68
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处> TEA5767 收音模块TEA5767 收音模块已有 432903个资源相关资源下载专区上传者其他资源其它热门资源本周本月全部文档信息资源大小:9.61MB上 传 者: () 上传日期:资源类型:应用文档资源积分:1分评
论:下载次数:3参与讨论:标&&&&签:分&&&&享:文档简介TEA5767&收音模块,常用于MP3、手机,里面有英文手册。中文手册,代码,很完整,自己买一个模块就可以做一个属于自己的数控收音机了文件列表.BMP----|000005.BMP----|000010.BMP----|000024.BMP----|000025.BMP----|000027.BMP----|000039.BMP----|000059.BMP----|000068.BMP----|000074.BMP----|000078.BMP----|000092.BMP----|000108.BMP----|000109.BMP----|000113.BMP----|000122.BMP----|Thumbs.db.dep----|lcd_lib.o.d----|main.o.d----|twi_i2c.o.d.deps----|ControlResource.Po----|DCU99Editor.Po----|DuplexEditor.Po.eclipseme.tmp----|emulation----|----|PhoneBook.jad----|----|PhoneBook.jarverified----|classes----|----|com----|----|----|north----|----|----|----|phonebook----|----|----|----|----|model----|----|----|----|----|----|Account.class----|----|----|----|----|----|ApplicationException.class----|----|----|----|----|----|Index.class----|----|----|----|----|----|Model$AccountFilter.class----|----|----|----|----|----|Model$IndexFilter.class----|----|----|----|----|----|Model.class----|----|----|----|----|----|Preference.class----|----|----|----|----|----|UserModel.classui----|ConfirmationDialog.class----|DetailInfoUI.class----|Dialog.class----|DialogListener.class----|IndexFunctionUI$ListIndex.class----|IndexFunctionUI.class----|ListMerchantGroupUI.class----|ListPhoneUI.class----|LoginUI.class----|MerchantGroupDetailInfoUI.class----|NewPhoneUI.class----|SearchPhoneUI.class----|Title.class----|UIController$1.class----|UIController$EventID.class----|UIController.class----|WaitCanvas$1.class----|WaitCanvas.class----|WelcomeUI.classPhoneBookMIDlet.class.myeclipse----|CVS----|----|Repository----|----|Root.settings----|CVS----|----|Entries----|----|Repository----|----|Rootorg.eclipse.core.resources.prefs.svn----|prop-basepropstext-base----|readme.txt.svn-basetmp----|prop-basepropstext-baseall-wcpropsdir-prop-baseentriesformat.tmp_versions----|dw4002.modTEA5767----|M8+LCD3310. Online calibration of Nyquist-rate analog-to-digital converters.pdf..dir.dat.DS_Store._.DS_Store._CotEditor_346._MacOS_Setup._PortVaR.actionScriptProperties.apriori_config.ccsproject.classpath.cproject.cxl.depend.dw4002.ko.cmd.dw4002.mod.o.cmd.dw4002.o.cmd.exe.flexProperties.gitignore.htaccess.indent.pro.message.pdf.project.qmake.internal.cache.screenrc.synopsys_dc.setup.synopsys_pt.setup.untf.vimrc.xhdl3.xref相关帖子大学堂最新课程请选择理由 辱骂 色情 广告提交若举报审核通过,可奖励2下载分举报人:被举报人:froglucky举报的资源分:1* 类型:请选择类型资源无法下载资源分类不正确资源无法使用标题与实际内容不符含有危害国家安全内容含有反动色情等内容含广告内容版权问题,侵犯个人或公司的版权其他* 详细原因:回到顶部EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱service(.cn 或通过站内短信息或QQ:联系管理员okhxyyo,我们会尽快处理。先看效果图: 显示 频道CH , 频率 100.0Mhz
&欢迎信息,1602 内置日文平假名, 正好用来显示博主名称。
焊接前,已经万能面包板上试验成功。
&焊接完成以后,1602 的D0 - D7 接到了 P1 上面,为了布线简单,这里是接反的 P1.0 =& D7 .. 实际写入 读取数据时,还需要转换高低位。
&背面走线图
元件清单:stc89c52, &lcd1602, &tea5767完整版 , at24c04 ,&DS18B20 (未实现功能,打算后期在加一个 RTC 芯片,和 GPS 做 精准的电子钟)
下面是一些元件介绍:
红外一体化接收头,常见有2种。
lcd1602 显示日文假名字符对应表
高位 + 低位,组成一个 unsigned char 放入就能显示出来了。
下面讲源程序:
&main.c 主程序中 初始化了 LCD1602 , TEA5767 , 初始化红外线中断 , 对按键进行扫描。&1 #include &reg52.h&
2 #include "tea5767.h"
3 #include "delay.h"
4 #include "lcd1602.h"
5 #include "IR.h"
6 //K1:上一台 K2:下一台 K3:从低向高搜索台
9 sbit K1 = P2 ^ 1;
10 sbit K2 = P2 ^ 4;
11 sbit K3 = P2 ^ 7;
13 //当前频道号 从 0 开始
14 unsigned char ch = 0;
16 void main()
//初始化 1602lcd
lcd1602_init();
//初始化 串口
init_uart();
//初始化红外遥控接口
init_IR();
//主函数中扫描按键
if(0 == K1)
delayms(100);
if(0 == K1)
set_ch(--ch);
if(0 == K2)
delayms(100);
if(0 == K2)
set_ch(++ch);
//自动搜索
if(0 == K3)
delayms(100);
if(0 == K3)
tea5767_tiny_auto_search();
64 void IR_int() interrupt 0
IR_CODE ir_
EX0 = 0;//处理过程中 关中断
ir_code = IR_recv();
if(ir_code.ir_code)
* custom:0xCC1D code:0x05FA 上一台
* custom:0xCC1D code:0x06F9 下一台
* custom:0xCC1D code:0x01FE 静音
//比较机器码
if(ir_code.custom_height == 0xcc && ir_code.custom_lower == 0x1d)
//比较功能码
switch(ir_code.ir_code)
case 0x5: set_ch(++ch); break;
case 0x6: set_ch(--ch); break;
case 0x1: tea5767_mute(ch); break;
//发送到串口,显示出编码,可用于记录编码,做学习型遥控器92
send_code(ir_code);
EX0 = 1;//处理结束后 开中断
1 #ifndef __LCD1602__
2 #define __LCD1602__
3 #include &reg52.h&
4 #include "delay.h"
9 #define DATA P1
10 sbit RS = P3 ^ 7;//数据 H 命令 L
11 sbit RW = P3 ^ 4;//读 H 写 L
= P3 ^ 3;//高电平 H 使能
* E = 1 后需要等一小段时间, 在手册中并没有说明 -
21 void lcd1602_init();
22 void lcd1602_clear();
23 char lcd1602_is_busy();
24 void lcd1602_write_cmd(unsigned char cmd);
25 void lcd1602_write_data(unsigned char dat);
26 void lcd1602_pos(unsigned char pos);
27 unsigned char lcd1602_reverse(unsigned char dat);
1 #include "lcd1602.h"
3 void lcd1602_init()
//初始化 复位 lcd1602
lcd1602_write_cmd(0x38);//设置显示模式 指令码
delayms(1);
lcd1602_write_cmd(0x0c);//开显示 不显示光标 不闪烁
delayms(1);
lcd1602_write_cmd(0x06);//光标设置 写字符后指针加一
delayms(1);
lcd1602_write_cmd(0x01);//光标清0 指针清0
delayms(1);
//设置初始位置为 0
lcd1602_pos(0);
//打印欢迎信息 日文假名
* こんにちわ
* こ 高4位是 b 低4位是 a 合并就是 0xba
lcd1602_write_data(0xba);
lcd1602_write_data(0xdd);
lcd1602_write_data(0xc6);
lcd1602_write_data(0xc1);
lcd1602_write_data(0xca);
lcd1602_pos(13);
lcd1602_write_data(0xc8);
lcd1602_write_data(0xbd);
lcd1602_write_data(0xde);
//第二行显示 Welcome Redio
lcd1602_pos(40);
lcd1602_write_data('W');
lcd1602_write_data('e');
lcd1602_write_data('l');
lcd1602_write_data('c');
lcd1602_write_data('o');
lcd1602_write_data('m');
lcd1602_write_data('e');
lcd1602_pos(0x4b);
lcd1602_write_data('R');
lcd1602_write_data('e');
lcd1602_write_data('d');
lcd1602_write_data('i');
lcd1602_write_data('o');
50 void lcd1602_clear()
lcd1602_write_cmd(0x01);//光标清0 指针清0
55 void lcd1602_pos(unsigned char pos)
//设置指针位置 0x80 | 位置
lcd1602_write_cmd(pos|0x80);
61 void lcd1602_write_data(unsigned char dat)
while(lcd1602_is_busy());
DATA = lcd1602_reverse(dat);
delayms(1);
E = 1;//在E 高向低变化时传输
73 void lcd1602_write_cmd(unsigned char cmd)
while(lcd1602_is_busy());
DATA = lcd1602_reverse(cmd);
delayms(1);
E = 1; //在E 高向低变化时传输
85 char lcd1602_is_busy()
//发送的是命令
delayms(1);
result = (1&&7 & lcd1602_reverse(DATA));//7bit 1 忙 0 不忙
//取消使能
98 //字符高低位互换
99 unsigned char lcd1602_reverse(unsigned char dat)
unsigned char
chr = (dat&&7 & 1) && 0;
chr |= (dat&&6 & 1) && 1;
chr |= (dat&&5 & 1) && 2;
chr |= (dat&&4 & 1) && 3;
chr |= (dat&&3 & 1) && 4;
chr |= (dat&&2 & 1) && 5;
chr |= (dat&&1 & 1) && 6;
chr |= (dat&&0 & 1) && 7;
串口 URAT&
1 #ifndef __UART__
2 #define __UART__
3 #include "IR.h"
4 void init_uart();
5 void send_hex(unsigned char);
6 void send_str(unsigned char *);
7 void send_code(IR_CODE);
1 #include &reg52.h&
2 #include "uart.h"
3 void init_uart()
//定时器1 溢出决定波特率
//总中断开
TMOD |= 1&&5; //定时器1 自动重装模式
TH1 = 0xfd;
//当TL1中溢出时 TH1 的值自动重装进去
TL1 = 0xfd;
//省去一个中断处理函数
//开始计数
//8bit UART 波特率可变
15 void send_str(unsigned char *str)
while(*str)
while(! TI);
26 void send_hex(unsigned char hex)
while(! TI);
33 void send_code(IR_CODE ir_code)
unsigned char
unsigned char *p;
p = (unsigned char *)&ir_
send_str("custom:0x");
for(i=0; i&4; i++)
if(2 == i)
send_str(" code:0x");
for(j=1; j&=0; j--)
c = (*p&&(4*(j))) & 0xf;
if(0&=c && c&=9)
send_hex('0' + c);
send_hex('A' + c - 0xa);
send_str("\r\n");
1 #include &reg52.h&
2 #ifndef __EEPROM__
3 #define __EEPROM__
* STC90C52 结尾是 90C
* EEPROM 5K
* SRAM 215字节
* 每个扇区512字节
5K / 512 = 10 个扇区
* 扇区首地址 2000h 结束地址 33ffh
12 /* FLASH 首地址 */
13 #define BASE_ADDR 0x2000
//stc89c52 stc89c52rd
14 //#define BASE_ADDR 0x4000 //stc89c54rd+
16 /* 特殊功能寄存器声明 */
17 sfr ISP_DATA
18 sfr ISP_ADDRH = 0xe3;
19 sfr ISP_ADDRL = 0xe4;
20 sfr ISP_CMD
21 sfr ISP_TRIG
22 sfr ISP_CONTR = 0xe7;
24 /* 定义命令字节 */
25 #define CMD_Read
0x01 //字节读数据命令
26 #define CMD_Prog
0x02 //字节编程数据命令
27 #define CMD_Erase
0x03 //扇区擦除数据命令
28 #define En_Wait_ISP 1&&7 | 1&&1
//设置等待时间 ,并使能ISP/IAP 11.0592 晶振
30 void eeprom_lock_ISP();
31 void eeprom_erase(unsigned int);
32 unsigned char eeprom_read(unsigned int);
33 void eeprom_prog(unsigned int addr, unsigned char dat);
1 #ifndef __DELAY__
2 #define __DELAY__
3 void delayms(int);
4 void delay700us();
1 #include &intrins.h&
2 #include "delay.h"
3 void delayms(int ms) //@11.0592MHz
unsigned char i,
while(ms--)
while (--j);
while (--i);
19 void delay700us() //@11.0592MHz
unsigned char i,
while (--j);
} while (--i);
1 #ifndef __I2C__
2 #define __I2C__
4 #include &reg52.h&
6 /* 引脚定义 */
7 sbit I2C_SCL = P3 ^ 5;
8 sbit I2C_SDA = P3 ^ 6;
10 void i2c_start();
11 void i2c_stop();
12 void i2c_send(unsigned char dat);
13 unsigned char i2c_recv();
14 char i2c_wait_ack();
15 void i2c_send_ack();
1 #include "i2c.h"
3 void i2c_start()
/* SCL SDA 为高电平时 SDA 变为低电平 */
I2C_SCL = 1;
I2C_SDA = 1;
I2C_SDA = 0;
I2C_SCL = 0; /* 钳住I2C总线,准备发送或接收数据 */
12 void i2c_stop()
/* SCK 高电平期间 SDA 由低变高 */
I2C_SCL = 0;
I2C_SDA = 0;
I2C_SCL = 1;
I2C_SDA = 1;
21 void i2c_send(unsigned char dat)
char i = 8;
while(i--)
I2C_SCL = 0;
if(dat & 0x80)
I2C_SDA = 1;
I2C_SDA = 0;
I2C_SCL = 1;
dat = dat&&1;
//等待ACK回复信号
i2c_wait_ack();
42 unsigned char i2c_recv()
unsigned char dat = 0;
char i = 8;
I2C_SDA = 1;
while(i--)
I2C_SCL = 0;
dat&&=1; //这里要有一定延时要求是 & 1.3us
I2C_SCL = 1;
if(I2C_SDA)
//以下3者结果一样
//dat += 1;
//dat |= (unsigned char)I2C_SDA;
i2c_send_ack();
65 //无响应返回0
66 char i2c_wait_ack()
unsigned char time_out = 0xff;
I2C_SCL = 0;
I2C_SDA = 1;
I2C_SCL = 1;
//由 slaver 拉低 SDA 表示回应
while(I2C_SDA)
time_out--;
if(0 == time_out)
i2c_stop();
86 void i2c_send_ack()
//拉低SDA 响应ACK 当SCL 由低电平变高电平时 从机接收
I2C_SCL = 0;
I2C_SDA = 0;
I2C_SCL = 1;
I2C_SCL = 0;
IR 红外接收
1 #ifndef __IR__
2 #define __IR__
3 #include &reg52.h&
4 #include "delay.h"
5 #include &string.h&
8 typedef struct {
unsigned char custom_
unsigned char custom_
unsigned char ir_
unsigned char re_ir_
13 } IR_CODE, *pIR_CODE;
16 sbit IR
= P3 ^ 2;//红外线一体接收头 OUT
18 void init_IR();
19 IR_CODE IR_recv();
1 #include "IR.h"
3 void init_IR()
//总中断开
//IR 接收头使用外部中断0 来处理
//下降沿触发
12 IR_CODE IR_recv()
* 数据格式:
* 9ms低电平 4.5ms高电平 头部
* 定制高位
* 1: 560us低电平 1680us高电平
0.56ms 1.7ms
* 0: 560us低电平 560us高电平
0.56ms 0.56ms
IR_CODE ir_
unsigned char i,k;
unsigned char *ir_char_p;
unsigned char ir_
ir_char_p = (unsigned char *)&ir_
//栈分配 IR_CODE 竟然还要手动清0
memset(&ir_code, 0, 4);
delayms(5); //9ms 内必须是低电平否则就不是头信息
if(0 == IR)
while(! IR);//等待4.5ms的高电平
//检测是否是 2.5ms 重码
delayms(3);
if(1 == IR)
//k 4位编码
for(k=0; k&4; k++)
ir_char = 0x0;
//i 每一个编码的 8bit
for(i=0;i&8;i++)
while(IR);
//等待变为低电平时
while(! IR);
//等待变为高电平后
delay700us();
//休眠700us 后读值
ir_char |= (char)IR &&//先存低位
//使用下面指针操作就会失败出现不稳定
//*ir_char_p |= (char)IR &&
*ir_char_p = ir_
ir_char_p++;
//计算反码 code码是否正确
if(ir_code.ir_code != ~(ir_code.re_ir_code))
memset(&ir_code, 0, 4);
return ir_
str 处理相关&
1 #ifndef __STR__
2 #define __STR__
4 unsigned char num_to_str(unsigned char num);
1 #include "str.h"
3 unsigned char num_to_str(unsigned char num)
unsigned char
//asc2 表 0 在前面
if(0&= num && 9&= num)
chr = num + '0';
重点TEA5767 特别说明的是,我先是在TB上找了许多资料,百度上找,但是就发现就是那一种格式的写法,还是个错误的写法,根本就不对,很多人还转来转去。(自动搜台的写法不对。)
GOOGLE 上搜了下,C51 的不多,其它的有不少。
自动搜台,是利用第6位的 SM ,写1 表示进入这个模式,同时还需要设置 SSL1 SSL0 ,经过我的测试,发现&HLSI 只能设为1 的时候,才能搜到台。
别人的程序错误之处在于, 自动搜索后,从 第3个 读的数据中找&HLSI 在计算是 + 225 还是 -225 ,这个在读的时候,就变成IF 了,没有看datasheet 就写程序,还说 自动搜索模式有问题,不好用。
经过我的试验,发现 自动搜台模式,基本能用,但是程序要复杂一些。不像是写入一个频率,读 ADC 比较数值,大于多少就表示有台。 比这种要复杂的多。
以下 2 种算法,都有编写,并测试成功,但实际试验效果来看, 第2种,普通的写法,效果好些。(问题是,自动搜台,检测到信号停住的地方,可能并不准,有可能是,100.023 这种。如果把 每次步进频率改为100K 就会错过很多台,这里是每次进10K)
1 #ifndef __TEA5767__
2 #define __TEA5767__
4 #include &string.h&
5 #include "i2c.h"
6 #include "uart.h"
7 #include "str.h"
8 #include "delay.h"
9 #include "lcd1602.h"
10 #include "eeprom.h"
12 typedef struct{
unsigned char st1;
unsigned char st2;
unsigned char st3;
unsigned char st4;
unsigned char st5;
18 } TEA_DAT, *PTEA_DAT;
20 typedef struct {
unsigned char //表示整数 100
unsigned char
//表示小数 5
23 } TEA_CH, *PTEA_CH;
25 /* 地址定义 */
26 #define TEA5767_ADDR_W
//tea5767 写地址
27 #define TEA5767_ADDR_R
//tea5767 读地址
28 #define TEA5767_CLK
//tea5767 晶振
29 #define TEA5767_MAX_KHZ 108000 //最高频率 108M
30 #define TEA5767_MIN_KHZ 87500
//最低频率 87.5M
31 #define TEA5756_HLSI //高混频器 经过测试,使用SM自动搜索功能时必须设此值 手动搜索 无所谓
33 unsigned long tea5767_Khz_to_pll(unsigned long Khz);
34 unsigned long tea5767_pll_to_Khz(TEA_DAT dat);
35 TEA_DAT tea5767_set_receiver(unsigned long Khz);
36 TEA_DAT tea5767_search(unsigned long Khz);
37 void tea5767_auto_search();
38 void tea5767_tiny_auto_search();
39 void tea5767_write(TEA_DAT dat);
40 TEA_DAT tea5767_read();
41 void tea5767_mute(unsigned char ch_num);
43 //Lcd显示
44 void sohw_search(unsigned long Khz, unsigned char channel);
45 //存储电台
46 void save_eeprom(unsigned long Khz, unsigned char channel);
47 //设定ch
48 unsigned long set_ch(unsigned char ch_num);
1 #include "tea5767.h"
3 unsigned char mute = 1;
4 void tea5767_mute(unsigned char ch_num)
unsigned long Khz,
Khz = set_ch(ch_num);
//静音位写 1
pll = tea5767_Khz_to_pll(Khz);
= (mute%2) &&7 | (pll&&8) & 0x3f;
#ifdef TEA5756_HLSI
tea5767_write(dat);
if(mute%2)
lcd1602_pos(40);
lcd1602_write_data('M');
lcd1602_write_data('U');
lcd1602_write_data('T');
lcd1602_write_data('E');
32 unsigned long tea5767_Khz_to_pll(unsigned long Khz)
#ifdef TEA5756_HLSI
return 4*(Khz*1000+225000)/TEA5767_CLK;
return 4*(Khz*1000-225000)/TEA5767_CLK;
41 unsigned long tea5767_pll_to_Khz(TEA_DAT dat)
unsigned long Khz,
pll = ((dat.st1 & 0x3f)&&8 | dat.st2);
#ifdef TEA5756_HLSI
Khz = (pll*TEA5767_CLK/4-225*1000)/1000;
Khz = (pll*TEA5767_CLK/4+225*1000)/1000;
54 void tea5767_write(TEA_DAT dat)
i2c_start();
i2c_send(TEA5767_ADDR_W);
i2c_send(dat.st1);
i2c_send(dat.st2);
i2c_send(dat.st3);
i2c_send(dat.st4);
i2c_send(dat.st5);
i2c_stop();
66 TEA_DAT tea5767_read()
i2c_start();
i2c_send(TEA5767_ADDR_R);
dat.st1 = i2c_recv();
dat.st2 = i2c_recv();
dat.st3 = i2c_recv();
dat.st4 = i2c_recv();
dat.st5 = i2c_recv();
i2c_stop();
80 TEA_DAT tea5767_set_receiver(unsigned long Khz)
unsigned long
pll = tea5767_Khz_to_pll(Khz);
/* 发送5个控制位 顺序是 1 2 3 4 5 字节的高位先发
* HLSL = 0 : 4*(102.4**
* HLSL = 1 : 4*(102.4**
* PLL WORD = 0x30ef
= (pll&&8) & 0x3f;
#ifdef TEA5756_HLSI
tea5767_write(dat);
delayms(100);
dat = tea5767_read();
107 //自动搜索 87.5 ~ 108M 由低向高搜索
108 TEA_DAT tea5767_search(unsigned long Khz)
unsigned long
pll = tea5767_Khz_to_pll(Khz);
= ((pll&&8) & 0x3f) | (1&&6);
//搜索停止 信号强度 01:5 10:7 11:10
= 1 | 1&&7 | 1&&6 |1&&5 ;
= 1 | 1&&7 | 1&&6
#ifdef TEA5756_HLSI
tea5767_write(dat);
delayms(100);
dat = tea5767_read();
while(dat.st1 != (dat.st1 | (1&&7)))
dat = tea5767_read();
135 //自动搜台 存台到 eeprom
136 void tea5767_auto_search()
unsigned long K
unsigned char if_
unsigned char channel = 0;
Khz = TEA5767_MIN_KHZ;
//清液晶屏
lcd1602_clear();
dat = tea5767_search(Khz);
//检测信号是否满足要求
while(dat.st1 != (dat.st1 | (1&&6)))
//if count 在 0x31 ~ 0x3e 之间
if_counter = (dat.st3 & 0x7f);
if((0x31 & if_counter) && (0x3e & if_counter))
//比较leve 电平确认是否收到台 实际测试使用此数 不会漏台
if((dat.st4&&4) & 10)
Khz = tea5767_pll_to_Khz(dat);
save_eeprom(Khz, channel);
channel++;
//显示当前频率
sohw_search(Khz, channel);
//计算搜到台的频率 加上10Khz 后重新搜索 实际测试使用此数 不会漏台
Khz += 10;
dat = tea5767_search(Khz);
175 //细致的搜台
176 void tea5767_tiny_auto_search()
unsigned long K
unsigned char channel = 0;
Khz = TEA5767_MIN_KHZ;
//Khz = 100000;
//清液晶屏
lcd1602_clear();
//擦除eeprom
eeprom_erase(1);
while(Khz &= TEA5767_MAX_KHZ)
dat = tea5767_set_receiver(Khz);
//比较leve 电平确认是否收到台 实际测试使用此数 不会漏台
if((dat.st4&&4) & 8)
//存储电台
save_eeprom(Khz, channel++);
//显示当前频率
sohw_search(Khz, channel);
//频率由低到高 每次增加10Khz
Khz += 100;
208 void sohw_search(unsigned long Khz, unsigned char channel)
unsigned char high,
lcd1602_pos(0);
lcd1602_write_data('S');
lcd1602_write_data('e');
lcd1602_write_data('a');
lcd1602_write_data('r');
lcd1602_write_data('c');
lcd1602_write_data('h');
lcd1602_write_data(':');
//输出频率 如果是 100M 以下第1位为空
high = Khz/1000;
= Khz%1000/100;
if(high&= 100)
lcd1602_write_data(num_to_str(high/100));
lcd1602_write_data(' ');
lcd1602_write_data(num_to_str(high%100/10));
lcd1602_write_data(num_to_str(high%10));
lcd1602_write_data('.');
lcd1602_write_data(num_to_str(low));
lcd1602_write_data('M');
lcd1602_write_data('h');
lcd1602_write_data('z');
//显示收到的频道
lcd1602_pos(40);
lcd1602_write_data('C');
lcd1602_write_data('h');
lcd1602_write_data('a');
lcd1602_write_data('n');
lcd1602_write_data('n');
lcd1602_write_data('e');
lcd1602_write_data('l');
lcd1602_write_data(':');
lcd1602_write_data(num_to_str(channel / 10));
lcd1602_write_data(num_to_str(channel % 10));
253 //存储电台
254 void save_eeprom(unsigned long Khz, unsigned char channel)
ch.high = Khz/1000;
= Khz%1000/100;
eeprom_prog(channel*2,
eeprom_prog(channel*2+1, ch.low);
263 //设定ch
264 unsigned long set_ch(unsigned char ch_num)
unsigned long K
ch.high = eeprom_read(ch_num*2);
= eeprom_read(ch_num*2+1);
//合并为 Khz
= ch.high*100; //直接使用 *1000 会计算错误 分为2部正确
Khz *= 10;
Khz += ch.low*100;
//设定接收频率
tea5767_set_receiver(Khz);
//清液晶屏
lcd1602_clear();
//显示频道信息
lcd1602_pos(0);
lcd1602_write_data('C');
lcd1602_write_data('h');
lcd1602_write_data(':');
//频道数从 0 开始计
lcd1602_write_data(num_to_str(ch_num / 10));
lcd1602_write_data(num_to_str(ch_num % 10));
lcd1602_pos(8);
if(ch.high&= 100)
lcd1602_write_data(num_to_str(ch.high/100));
lcd1602_write_data(' ');
lcd1602_write_data(num_to_str(ch.high%100/10));
lcd1602_write_data(num_to_str(ch.high%10));
lcd1602_write_data('.');
lcd1602_write_data(num_to_str(ch.low));
lcd1602_write_data('M');
lcd1602_write_data('h');
lcd1602_write_data('z');
最后,在简单说下,自动搜台 和 手动搜台的区别。
自动搜台特点:
1,设一个 LEVE 值后,当到这个值的时候,能自动停止,但是灵活性只有3种,不够灵活。
2,能增长到最高频率时,停止&
3,只能用&TEA5756_HLSI&
自动搜台流程:
1,设定 好 SM 位 和 SSL 后
2,设一个频率&
3,TEA5767 就会自动向上 或 向下 查找,直到 确认收到了信号,就停止 有标识位, 同时比较是否到了最终端,108M
4,程序需要判断,有信号的标识位, 108M 到终点的标识位2个。
5,程序也要比较ADC 电平,再次确认是否搜到了台
手动搜台特点:
1,控制灵活,但要自行控制以上参数。程序编写简单。
手动搜台流程:
1,写入一个频率
2,读取ADC 比较高于某个值时就表示收到了台
3,自行判断,频率范围
阅读(...) 评论()

我要回帖

更多关于 收音模块选什么 的文章

 

随机推荐