w412321
发表于 2017-9-24 10:52:27
乙猪老师,我把7脚8脚置低现象依旧。
无声岁月
发表于 2017-9-24 11:21:30
在你原来程序的这段:
lcall I2C_WRITE ;调用I2C写入程序
SETB SCL
SETBSDA
;---------------------------------------------------------------------------------------
改为:
lcall I2C_WRITE ;调用I2C写入程序
SETB SCL
SETBSDA
L1: SJMPL1
;---------------------------------------------------------------------------------------
改完要重新汇编,没错,再才写入芯片试试
无声岁月
发表于 2017-9-24 11:30:07
原来不对的地方是调完子程序(即执行:lcall I2C_WRITE ;调用I2C写入程序)后,再次执行I2C_WRITE,应该加一个死循环---L1: SJMPL1
无声岁月
发表于 2017-9-24 11:41:26
如有仿真器跟踪一下就更好
w412321
发表于 2017-9-24 13:10:39
无声岁月 发表于 2017-9-24 11:41
如有仿真器跟踪一下就更好
按照您说的,我刚才又试了重新编译程序,在程序的加上了这句L1: SJMPL1 跳转指令,
结果收不到电台了。
又改在在END指令前面加上L1: SJMPL1,还是收不到声音了。
去掉L1: SJMPL1指令,能收到电台了,但收台声音还是忽大忽小的。
我又仔细的看了程序,修改的部分指令后重新编译,结果收台声音还是忽大忽小。
现在我怀疑是不是我的STOP子程序写的有问题,还是程序架构有错误。
前后改了十多次了。
对了,我没有仿真器,都是自己装好电路,直接写程序试验。
因为初学单片机,我的水平低,见笑了。
无声岁月
发表于 2017-9-24 19:40:38
因为我没用过RDA5807,所以只能根据我的理解给一点建议,不一定能帮得了你,请见谅。1-我在17楼写的修改方法应该是正常写程序的方法,也就是在主程序有一个循环程序段,不然主程序调用完子程序后程序会乱跑;但由于你说改了之后不能收音,那么就应该是子程序段I2C_WRITE有问题;2-我看了一下子程序I2C_WRITE,其中“I2C_ACk: ;;;;;发送接收确认信号“这段程序应该是接收RDA5807返回的ACK,基本没问题,但最好能加上一个循环等待ACK的到来,否则可能没收到ACK你的单片机就开始发下一数据;3-你可以参考别人的程序,仔细对照一下看漏了那些细节
无声岁月
发表于 2017-9-24 19:41:22
也可能芯片有缺陷,这个网上有人反映,看:http://www.52rd.com/Blog/Detail_RD.Blog_gower_dcg_24122.html
无声岁月
发表于 2017-9-24 19:43:51
本帖最后由 无声岁月 于 2017-9-24 19:44 编辑
学单片机最好要有仿真器,不然出问题很浪费时间
乙猪
发表于 2017-9-24 20:26:31
无声岁月 发表于 2017-9-24 19:43
学单片机最好要有仿真器,不然出问题很浪费时间
或者买一个逻辑分析仪。
yangcheng84
发表于 2017-9-24 23:38:14
w412321 发表于 2017-9-22 19:36
请 yangcheng84坛友指教。
发上来我写的小程序,见笑了。
我很久不用汇编了,也没看5807手册.
看了您原文,似乎程序没有跑循坏.且编程首地址就是0000H,没有跳过中断向量,可能就是问题所在.
改2地方:
编程地址
ORG000H
改为ORG0100H
写完数据就死循环:
RET改为
LOOP:SJMPLOOP
另外增加上电延时
改写后如下:
SDA EQU P3.2 ;;
SCL EQU P3.3 ;;
ORG 100H ;跳转到100H开始编程
START:
mov p3, #0ffh ;2051P3口P1口全置高
mov p1, #0ffh
setbSCL ;;5807 7脚
setb SDA ;;5807 8脚
lcall yanshi_350ms ;长延时,待上电稳定
lcall yanshi_350ms
lcall yanshi_350ms
MOV SP,#5fH
mov 50h, #11000000b ;工作于5767模式
mov 51h, #2dh ;;;;;;95mhz
mov 52h, #68h ;;;;;;95mhz
mov 53h, #00011000b;;
mov 54h, #00010000b;;
mov 55h, #00000000b;;
lcall I2C_WRITE ;调用I2C写入程序
SETB SCL
SETBSDA
;---------------------------------------------------------------------------------------
I2C_WRITE: ;;;I2C写入数据
;;
LCALL I2C_START ;发送开始信号
MOV A,50h ;50H送数;
LCALL I2C_SEND8BIT ;;;送八位数据
LCALL I2C_ACK ;;;发送接收确认信号
;=1,无确认,再次发送
MOV A,51h
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,52h
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,53h
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,54h
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,55h
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
LOOP:SJMP LOOP ; //死循环
;-----------------------------------------------------
;=======================================================
w412321
发表于 2017-9-25 00:56:58
感谢yangcheng84和无声岁月、乙猪坛友的帮助。
yangcheng84坛友,我按照您的方法修改了程序,
不加LOOP:SJMP LOOP ; //死循环这句,能收到电台,声音还是一会儿大一会儿小。
加上LOOP:SJMP LOOP ; //死循环 这句,就收不到台了,噪声一片。
w412321
发表于 2017-9-25 00:59:42
无声岁月坛友提供的链接我看了,下面的回复里就有人说RDA5907不能直接置频,只能自动搜索。
难道5807真的不能直接置频吗?
明天我在仔细看看程序。
tanjianchao
发表于 2017-9-25 13:04:29
w412321 发表于 2017-9-25 00:59
无声岁月坛友提供的链接我看了,下面的回复里就有人说RDA5907不能直接置频,只能自动搜索。
难道5807真的 ...
RDA5807是可以搜索和直接置频的,但由于我不懂汇编,只懂bascom-avr语言,我写过bascom的程序,帮不了你了。
w412321
发表于 2017-9-25 20:21:57
tanjianchao 发表于 2017-9-25 13:04
RDA5807是可以搜索和直接置频的,但由于我不懂汇编,只懂bascom-avr语言,我写过bascom的程序,帮不了你 ...
把你的写频思路讲讲也好,说说5807寄存器的设置。
我是刚入门单片机,玩5807 就当是一个学习进步的机会。
tanjianchao
发表于 2017-9-25 21:31:07
w412321 发表于 2017-9-25 20:21
把你的写频思路讲讲也好,说说5807寄存器的设置。
我是刚入门单片机,玩5807 就当是一个学习进步的机会 ...
下面是直接置频的子程序:
I2cstart
I2cwbyte &B00100000 '&H20芯片地址
I2cwbyte &B11010010 '02H 下面是寄存器地址
I2cwbyte &B00000001 '02L
Pll = Freq - 870
Byte0 = Pll / 4
Portc.4 = 0
Waitms 2
I2cwbyte Byte0 '03H
Byte1 = Byte0 * 4
Byte1 = Pll - Byte1
Byte1 = Byte1 * 64
Byte1.4 = 1
I2cwbyte Byte1 '03L
I2cwbyte &B00000010 '04H
I2cwbyte &B00000000 '04L
I2cwbyte &B10001000 '05H
I2cwbyte &B10001111 '05L,1111=音量最大,0000=静音,0111比较合适
I2cstop