51单片机与nRF2401的问题。
无线收发芯片nRF2401调试心得
我个人认为调试射频对于我们这代单片机开发人员来说真的是件头痛的事情,当然也不乏高手存在。前段时间调试工作在2.4G的无线收发芯片nRF2401,在没有DEMO板,仅一个数字示波器的条件下折磨了几个星期也没完全搞定,最终只能完成近距离收发,且空中的速率只能达到250Kbps(nRF2401 内部可设置成250Kbps或1Mbps两种速度)。最终公司综合多种因素考虑不得不暂停该方案。本来也没什么,但大家都知道,对于我们做技术的,当出现一个问题,而没有将它解决掉,心里总不是滋味!况且已经在上面花了很多的时间与精力,因此在这发此帖,牢骚一下!也希望能给没有无线调试经验(和我类似情况的)且正想要选择无线收发方案的朋友一些借鉴或我的教训!!!下面就是让我感触很深的,也很菜的几点,可能不对, 恳请指证与讨论。
1、速度。当初为什么要选择nRF2401呢?因为推广商堪称它的速率能达到1Mbps,且外围器件很少。实践上1Mbps,只是空中的速度,真正的传输速度还要取决于收发双方的MCU与nRF2401之间的SPI接口速率及其它因素,最理想情况下估计也只能有400Kbps。
2、外围电路。nRF2401的外围器件真的是很少,但高频就是高频,我认为没有调试好的最大原因应该出现在外围器件与电路上,可能是PCB没有做好,也可能是元件参数不精确等。因为系统已经可以通信了,只是速度上不去,和距离不够。所以不要认为它的外围器件与电路很简单而小看它,如果没有经验与设备,最好是买个DEMO板且要找个好的技术支持方。
3、技术支持。起初从深圳的一家公司买了10片样片,后来在调试过程中出现问题想请他们技术支持,但他们居然说自己没有技术支持人员。
4、51单片机的硬件SPI接口时序问题。由于希望能让通信的速率更高,故选择带硬件SPI接口的单片机。最初选择了STC89LV516RD,但在测试时发现SPI的时序有点问题(在发送的最后一位总是提前半个波头就结束了)。原本以为是STC的单片机质量有问题,后来就买了PHILIPS的 P89LV51RD2,专门对它的SPI进行了测试,结果出现同样的问题。这时如果再认为是单片机本身的问题,那还不如认为是自己使用的问题!于是就请教了ZLG的技术支持,经他们进行测试后,所得结果与我所反映的一致。当ZLG向PHILIPS那边说明该问题时,PHILIPS的回答是这个时序就是这样的。当时我就很是吃惊!因此找了SST89V554和PIC16F877对它们进行测试,SST的还是出现上述问题,但PIC16F877则没有该问题。如果各位有空且有好奇心,可以对上述提到的单片机进行测试一下。
5、硬件焊接。因为它的体积很小,所以很不好焊。起初自己拿烙铁焊了几个都不能用,后来拿到工厂去焊了,结果好点。
6、调试(非常的土,可能不对哦!)。当焊完硬件后,第一步,用示波器测晶振是否起振,如果起振且在1V左右,则说明其各种电源与振荡电路都已经无误。另外当芯片处于关机模式(PWR_UP=0)时,振荡器也会停振。第二步,将芯片配置成发送模式,测量ANT2、ANT1、VDD_PA是否有幅值在 1.9V左右的方波输出,而且是每发送一包就会有一个方波。如果没有方波输出,一方面请检查IREF的方波是否正常,该端的22K电阻是否有虚焊等。另一方面则是软件配置的问题,当CE=1,CS=0为收发模式,然后将CE拉低则激活发射。第三步,将另一个板子配置成接收状态,用示波器测DR端,当一方发射数据时,接收方如果有数据收到,DR端就会产生方波。我一般都用示波器的一路接发射方的ANT端,另一路接接收方的DR端来判断发射与接收是否正常,当然这可能会对高频部分引起干扰。
一个不懂高频,且刚步入工作岗位的单片机爱好者在调试无线收发模块失败后的胡言乱语,不对也请不要抛砖!!!谢谢!
无线收发芯片nRF2401调试心得
我个人认为调试射频对于我们这代单片机开发人员来说真的是件头痛的事情,当然也不乏高手存在。前段时间调试工作在2.4G的无线收发芯片nRF2401,在没有DEMO板,仅一个数字示波器的条件下折磨了几个星期也没完全搞定,最终只能完成近距离收发,且空中的速率只能达到250Kbps(nRF2401 内部可设置成250Kbps或1Mbps两种速度)。最终公司综合多种因素考虑不得不暂停该方案。本来也没什么,但大家都知道,对于我们做技术的,当出现一个问题,而没有将它解决掉,心里总不是滋味!况且已经在上面花了很多的时间与精力,因此在这发此帖,牢骚一下!也希望能给没有无线调试经验(和我类似情况的)且正想要选择无线收发方案的朋友一些借鉴或我的教训!!!下面就是让我感触很深的,也很菜的几点,可能不对, 恳请指证与讨论。
1、速度。当初为什么要选择nRF2401呢?因为推广商堪称它的速率能达到1Mbps,且外围器件很少。实践上1Mbps,只是空中的速度,真正的传输速度还要取决于收发双方的MCU与nRF2401之间的SPI接口速率及其它因素,最理想情况下估计也只能有400Kbps。
2、外围电路。nRF2401的外围器件真的是很少,但高频就是高频,我认为没有调试好的最大原因应该出现在外围器件与电路上,可能是PCB没有做好,也可能是元件参数不精确等。因为系统已经可以通信了,只是速度上不去,和距离不够。所以不要认为它的外围器件与电路很简单而小看它,如果没有经验与设备,最好是买个DEMO板且要找个好的技术支持方。
3、技术支持。起初从深圳的一家公司买了10片样片,后来在调试过程中出现问题想请他们技术支持,但他们居然说自己没有技术支持人员。
4、51单片机的硬件SPI接口时序问题。由于希望能让通信的速率更高,故选择带硬件SPI接口的单片机。最初选择了STC89LV516RD,但在测试时发现SPI的时序有点问题(在发送的最后一位总是提前半个波头就结束了)。原本以为是STC的单片机质量有问题,后来就买了PHILIPS的 P89LV51RD2,专门对它的SPI进行了测试,结果出现同样的问题。这时如果再认为是单片机本身的问题,那还不如认为是自己使用的问题!于是就请教了ZLG的技术支持,经他们进行测试后,所得结果与我所反映的一致。当ZLG向PHILIPS那边说明该问题时,PHILIPS的回答是这个时序就是这样的。当时我就很是吃惊!因此找了SST89V554和PIC16F877对它们进行测试,SST的还是出现上述问题,但PIC16F877则没有该问题。如果各位有空且有好奇心,可以对上述提到的单片机进行测试一下。
5、硬件焊接。因为它的体积很小,所以很不好焊。起初自己拿烙铁焊了几个都不能用,后来拿到工厂去焊了,结果好点。
6、调试(非常的土,可能不对哦!)。当焊完硬件后,第一步,用示波器测晶振是否起振,如果起振且在1V左右,则说明其各种电源与振荡电路都已经无误。另外当芯片处于关机模式(PWR_UP=0)时,振荡器也会停振。第二步,将芯片配置成发送模式,测量ANT2、ANT1、VDD_PA是否有幅值在 1.9V左右的方波输出,而且是每发送一包就会有一个方波。如果没有方波输出,一方面请检查IREF的方波是否正常,该端的22K电阻是否有虚焊等。另一方面则是软件配置的问题,当CE=1,CS=0为收发模式,然后将CE拉低则激活发射。第三步,将另一个板子配置成接收状态,用示波器测DR端,当一方发射数据时,接收方如果有数据收到,DR端就会产生方波。我一般都用示波器的一路接发射方的ANT端,另一路接接收方的DR端来判断发射与接收是否正常,当然这可能会对高频部分引起干扰。
一个不懂高频,且刚步入工作岗位的单片机爱好者在调试无线收发模块失败后的胡言乱语,不对也请不要抛砖!!!谢谢!
我看了一下那个文档,里面有程序的,你可以参考一下的!
实验时收发双方都采用相同的电路
发送方程序如下:
org 0000H
AJMP START
;延时1/4s子程序
YANSHI1S: MOV R7,#250
YANSHI1S1: MOV R6,#250
YANSHI1S2: NOP
NOP
DJNZ R6,YANSHI1S2
DJNZ R7,YANSHI1S1
RET
;将58开始的单或多字节(字节数在R3中)写入芯片
XIENB: MOV R0,#58H
CLR P1.7 ;SCN变低
XIE00: ACALL XIE1B
INC R0
DJNZ R3,XIE00
SETB P1.7
RET
;;将R0所指1单元按SPI时序写入模块,调用该子程序前,应将CSN线变低
;单次或多次调用完成后将CSN线变高
XIE1B: MOV R2,#8
MOV A,@R0
XIE1B1: RLC A
MOV P1.5,C ;数据送上MOSI线
SETB P1.4 ;数据移入模块
CLR P1.4
DJNZ R2,XIE1B1
RET
;读芯片状态字 将芯片状态字读到5FH
DUZT: MOV R2,#8
SETB P1.5
CLR P1.7 ;CSN变低,
DUZT1: SETB P1.4 ;时钟上升
MOV C,P1.3 ;读入MISO线上的数据
MOV A,5FH
RLC A ;数据移入5FH寄存器
MOV 5FH,A
CLR P1.4
DJNZ R2,DUZT1
SETB P1.7 ;CSN变高,完成一次命令
RET
START: MOV P1,#0AFH ;模块待机
MOV 58H,#20H ;准备写0寄存器
MOV 59H,#0EH ;上电,发射模式
MOV R3,#02H
ACALL XIENB
MOV 58H,#21H ;01寄存器
MOV 59H,#03H ;0,1通道允许自动应答
MOV R3,#02H
ACALL XIENB
MOV 58H,#22H ;02
MOV 59H,#03H
MOV R3,#02H
ACALL XIENB
MOV 58H,#23H ;03寄存器
MOV 59H,#03H ;5字节地址宽带
MOV R3,#02H
ACALL XIENB
MOV 58H,#24H ;04
MOV 59H,#14H ;重发等待500uS,重发4次,1A则重发10次,在206c处
MOV R3,#02H
ACALL XIENB
MOV 58H,#25H ;05寄存器
MOV 59H,#07H ;射频频率(汇编后在2076处)
MOV R3,#02H
ACALL XIENB
MOV 58H,#26H ;06
MOV 59H,#27H ;07为1M传输速率,0dB增益,27则为250k传输速率
MOV R3,#02H
ACALL XIENB
MOV 58H,#27H ;07
MOV 59H,#70H ;清模块内中断
MOV R3,#02H
ACALL XIENB
MOV 58H,#2AH ;0A寄存器(通道0)
MOV 59H,#02H ;配置地址
MOV 5AH,#3AH
MOV 5BH,#39H
MOV 5CH,#38H
MOV 5DH,#37H
MOV R3,#06H
ACALL XIENB
MOV 58H,#30H ;10寄存器
MOV R3,#06H ;发送地址
ACALL XIENB
MOV 58H,#2BH ;0B寄存器(通道1)
MOV 59H,#01H ;本机地址
MOV R3,#06H
ACALL XIENB
MOV 58H,#31H ;11寄存器
MOV 59H,#10H ;0通道有效数据宽带16字节
MOV R3,#02H
ACALL XIENB
MOV 58H,#32H ;12寄存器
MOV 59H,#10H ;1通道有效数据宽度16字节
MOV R3,#02H
ACALL XIENB
XIEFS: MOV 58H,#0A0H ;写发送数据到芯片
MOV R0,#58H
MOV R3,#10H
CLR P1.7
ACALL XIE1B
MOV R0,#70H
XIEXUN: ACALL XIE1B
INC R0
DJNZ R3,XIEXUN
SETB P1.7
SETB P1.6 ;启动发射
MOV R7,#5
DJNZ R7,$
CLR P1.6
JB P3.2,$
cpl p1.0
ACALL DUZT ;读状态寄存器
MOV 58H,#27H ;07
MOV 59H,#70H ;清中断
MOV R3,#02H
ACALL XIENB
MOV 58H,#0E1H ;清模块发送缓冲区
MOV R3,#01H
ACALL XIENB
ACALL YANSHI1S
SJMP XIEFS
end
接收端程序:
org 0000H
AJMP START
org 0003H
AJMP EXINT0
;延时1/4s子程序
YANSHI1S: MOV R7,#250
YANSHI1S1: MOV R6,#250
YANSHI1S2: NOP
NOP
DJNZ R6,YANSHI1S2
DJNZ R7,YANSHI1S1
RET
;将58开始的单或多字节(字节数在R3中)写入芯片
XIENB: MOV R0,#58H
CLR P1.7 ;SCN变低
XIE00: ACALL XIE1B
INC R0
DJNZ R3,XIE00
SETB P1.7
RET
;;将R0所指1单元按SPI时序写入模块,调用该子程序前,应将CSN线变低
;单次或多次调用完成后将CSN线变高
XIE1B: MOV R2,#8
MOV A,@R0
XIE1B1: RLC A
MOV P1.5,C ;数据送上MOSI线
SETB P1.4 ;数据移入模块
CLR P1.4
DJNZ R2,XIE1B1
RET
;按SPI时序读模块一字节入单片机R0所指单元,调用该子程序前,应将CSN线变低
;单次或多次调用完成后将CSN线变高
DU1B: MOV R2,#8
DU1B1: SETB P1.4
MOV C,P1.3
RLC A
CLR P1.4
DJNZ R2,DU1B1
MOV @R0,A
RET
;按SPI时序读模块接收缓冲区数据入单片机R0所指单元,字节数在R3中
DUNB: PUSH 00H
MOV 58H,#61H ;写一字节命令
MOV R0,#58H
CLR P1.7
ACALL XIE1B
POP 00H ;R0指向接收缓冲区首地址
DUXUN: ACALL DU1B
INC R0
DJNZ R3,DUXUN
SETB P1.7
RET
;读芯片状态字 将芯片状态字读到5FH
DUZT: MOV R2,#8
SETB P1.5 ;输入芯片1
CLR P1.7 ;CSN变低,
DUZT1: SETB P1.4 ;时钟上升
MOV C,P1.3 ;读入MISO线上的数据
MOV A,5FH
RLC A ;数据移入5FH寄存器
MOV 5FH,A
CLR P1.4
DJNZ R2,DUZT1
SETB P1.7 ;CSN变高,完成一次命令
RET
START: MOV P1,#0AFH ;模块待机
SETB 0A8H ;允许外部中断0
CLR 88H ;电平触发
SETB 0B8H ;高优先级
SETB 0AFH ;CPU开中断
MOV 58H,#20H ;准备写0寄存器
MOV 59H,#0FH ;上电,接收模式(发射时,设置为0EH)
MOV R3,#02H
ACALL XIENB
MOV 58H,#21H ;01寄存器
MOV 59H,#03H ;0,1通道允许自动应答
MOV R3,#02H
ACALL XIENB
MOV 58H,#22H ;02
MOV 59H,#03H ;允许0,1通道接收
MOV R3,#02H
ACALL XIENB
MOV 58H,#23H ;03寄存器
MOV 59H,#03H ;5字节地址宽带
MOV R3,#02H
ACALL XIENB
MOV 58H,#24H ;04
MOV 59H,#14H ;重发等待500uS,重发4次
MOV R3,#02H
ACALL XIENB
MOV 58H,#25H ;05寄存器
MOV 59H,#07H ;射频频率
MOV R3,#02H
ACALL XIENB
MOV 58H,#26H ;06
MOV 59H,#27H ;设置为07为1M传输速率,0dB增益(若为27,则是250kpbs,0dB)
MOV R3,#02H
ACALL XIENB
MOV 58H,#27H ;07
MOV 59H,#70H ;清模块内中断
MOV R3,#02H
ACALL XIENB
MOV 58H,#2AH ;0A寄存器(通道0)
MOV 59H,#01H ;配置地址(对方地址)
MOV 5AH,#3AH
MOV 5BH,#39H
MOV 5CH,#38H
MOV 5DH,#37H
MOV R3,#06H
ACALL XIENB
MOV 58H,#30H ;10寄存器
MOV R3,#06H ;发送地址
ACALL XIENB
MOV 58H,#2BH ;0B寄存器(通道1)
MOV 59H,#02H ;本机地址
MOV R3,#06H
ACALL XIENB
MOV 58H,#31H ;11寄存器
MOV 59H,#10H ;0通道有效数据宽带16字节
MOV R3,#02H
ACALL XIENB
MOV 58H,#32H ;12寄存器
MOV 59H,#10H ;1通道有效数据宽度16字节
MOV R3,#02H
ACALL XIENB
SETB P1.6 ;启动接收
HALT: SJMP HALT
EXINT0: PUSH ACC
PUSH PSW
ACALL DUZT ;读状态寄存器
MOV 58H,#27H ;07
MOV 59H,#70H ;清中断
MOV R3,#02H
ACALL XIENB
MOV R0,#60H ;读接收数据到60H到6FH
MOV R3,#10H
ACALL DUNB
CPL P1.0
FANHUI: POP PSW
POP ACC
RETI
end
其实汇编更难,c才是简单实用且是程序的主体,汇编一般只是大程序的某一段
傅贴小儿: 可以让2401进入发送状态,然后定时10mS启动发送,每次发送后一定要冲洗发送寄存器. nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data SPI_RW_Reg(WRITE_REG+STATUS,0xff);//清标志位(要不然就只会发送一次)
五华区13417173945: nrf24l01和51单片机焊接时要注意什么? - ?
傅贴小儿: nrf2401焊接一个排针座2*4,51是DIP40座,NRF2401是3.3V供电,51是5V供电,所以需要用AMS1117-3.3把5V转换成3.3V.51不带SPI接口,可以用IO口模拟一下,很简单.连接时 51 IO口要接100欧上拉电阻,你邮箱多少,我有NRF2401详细资料,我发给你.我的邮箱pkupantao@163.com.全部用手机打的,望采纳,谢谢
五华区13417173945: 无线模块Nrf2401+的I/O口怎么和STC 51单片机相连接?电平不同啊? - ?
傅贴小儿: 啥也别说了,看图吧. 注意nRF24L01+的IO口要接到51单片机的“高阻引脚”(一般为P0口). 但是一些型号的P0并不是高阻的,这点请注意看芯片的说明手册.
五华区13417173945: nrf24l01与51单片机的连接电平匹配问题怎么解决呀 - ?
傅贴小儿: 看你用的单片机了,51的只有电源接3.3V,其他端口串接2K电阻就行
五华区13417173945: nrf2401与单片机有哪些链接方式?我将它与p2 口链接后如何将数据从串口传递出去?程序怎么解决? - ?
傅贴小儿: 24L01是使用标准的SPI通信的,最好能使用原生的SPI接口,例如STC12C5A系列、C8051系列、AVR之类的单片机,如果只是传统的51机,就需要自己编程仿真SPI时序,这样的程序遍地都是,能用是能用,但效率肯定不高.通信需要这几条...
五华区13417173945: nrf2401和单片机相连之后到底是在和谁通信,接收谁的信息.好困惑 - ?
傅贴小儿: NRF2401的通信是双向的,即可以发送数据也可以接收数据.一片NRF2401+单片机,只是一部分,假如这是A机,用另一片NRF2401+另一个单片机就是B机,这样A机和B机就可以相互通信了.
五华区13417173945: 您好,我有个问题,我用了NRF24L01与AT89C51单片机相连,我不会设置波特率,您能教教我吗 - ?
傅贴小儿: 这个是SPI接口连接,是同步通信,有时钟信号,波特率不用设置,单片机没有SPI接口,用普通IO口模拟,如果不想让传输速度过高,可以在高低电平之间加空操作语句
五华区13417173945: 51单片机通过nrf2401传输数据的方法 - ?
傅贴小儿: nrf接口SPI.用51模拟个SPI时序 就可以通讯了
五华区13417173945: 关于用51单片机的IO口模拟SPI驱动NRF2401模块,nrf的CE,CSN和IRQ怎么与单片机IO口连? - ?
傅贴小儿: I/O口相连,首先要电压相等,3V不能直接5V.电压不相等,要在中间串电阻.具体接法,就看你I/O口的定义了.
五华区13417173945: 51单片机与无线发射模块共地的问题 - ?
傅贴小儿: 两个GND之间去掉1K电阻.数据传输的时候可以考虑中间加个大小合适的电容,看数据线上的频率了.