70---2.4G无线通讯模块NRF24L01实验
硬件需求:PC机,PCM模块2个,microUSB 线2条,2.4G无线通讯模块NRF24L01 共
2个,导线若干;
软件需求:PCM编译软件,串口调试助手;
供电方式:USB线接PC机供电;
连接电路:如图2-60-1
图2-60-1 2.4G无线通讯模块NRF24L01实验电路图
NRF24L01无线通讯模块可以实现点对点的通讯,2.4G通讯频率,通讯速度可达
2Mbps.多达125个通讯通道,可以有效避免多个模块在一起的时候出现干扰的情况。
本实验使用2个开发板模块,2个无线模块,连接电路如下图所示,通过USB接口连
接电脑,在电脑端同时开启2个串口调试助手,选择好各自的串口号,波特率。
2套装置我们分别编号为装置1,装置2.具体调试如下:
程序中我们采用串口助手发送一个字节的方式表示设置接收字节数,并且使用HEX
发送;发送多个字节表示要发送的数据,采用ASC码方式发送;
首先通过串口调试助手设置装置1的接收字节数,比如我们想接收6个字符,在串口
调试助手发送区输入06,选择HEX发送,点击发送,串口接收区会马上收到:set rx len
= 6 bytes,表示已经设置好接收字节数为6个字节;
然后我们在连接装置2个串口助手中的发送区输入:ABCDEF,共6个字母,选择取
消HEX发送的勾,然后点击发送,装置1的串口助手马上会收到:24l01 recieved string
is ABCDEF, 24l01 recieved 6 bytes ;表示通讯成功了。
如果要发送不同长度的字符,要重新设置接收数,发送端的字符数一定要等于接收
端的字符数,不然数据不会被接收。
装置1发送给装置2的方法也是一样,要先设置好装置2的接收数量,然后装置1再发
送相同数量的字符过去。
实验程序如下:
装置1程序:
1 intpro rxint //数据接收完成中断程序,注意:接收到指定的字节数,多一个少一个
//都不行
2 prints "PCM01 recieved string is %s\r\n" d10 0 //输出接收的字符串
3 prints "PCM01 recieve %d bytes\r\n" d38 //输出接收的字符数,实际就是设定
//的字符数
4 endint
5 intpro txint //数据发送成功中断程序,只有当对方成功接收到数据才会执行此中断
6 prints "PCM01 send finish\r\n" //输出发送完成信息
7 endint
8 intpro serialrecvint //串口接收中断程序
9 if d19 = 1 //判断接收到的字节数,如果为一个字节,表示要设置无线模块的接收
//字节数,注意:上位机最好用HEX格式发送数据
10 mov d20 d38 //串口接收到的数据保存到D38中
11 and hff d38 d38 //只有最低字节有效,所以把高3字节清零
12 2401rx d0 d4 d10 d38 s0 //重新启动数据接收
13 prints "set rx len = %d bytes\r\n" d38 //输出要接收的字节数
14 else //如果大于一个字节,表示是让无线模块发送数据出去,上位机用HEX或
//ASC格式都可以
15 prints "serial recieve %d bytes\r\n" d19 //输出上位机发送的字节数
16 prints "now send from PCM01 to PCM02\r\n" //打印准备发送的信息
17 prints "send string is \"%s\"\r\n" d20 0 //准备发送的字符串
//启动发送指令,D2为接收方的名称,D4为通道号50,D20为要发送的数据起始
//寄存器,D19为要发送的字节数,发送成功并且对方接收到数据,S1会置位
18 2401tx d2 d4 d20 d19 s1
19 endif
20 endint
21 main
22 intinit s2 serialrecvint //开启串口接收中断程序
//串口0,即板载USB转串口初始化,波特率115200,接收的数据存放在D20起始的
//寄存器中,接收数据长度存放D19中,接收到数据会置位S2
23 serial 0 115200 d20 d19 s2
24 strcopy "PCM01" D0 //设置本无线模块的名称,5个字符,所以会占用D0,D1
//共2个寄存器,所以这2个寄存器不要在其他地方再使用
25 strcopy "PCM02" D2 //设置对方无线模块的名称,5个字符,所以会占用D2,D3
//共2个寄存器,所以这2个寄存器不要在其他地方再使用
26 intinit s0 rxint // 开启无线模块接收到数据中断程序
27 intinit s1 txint // 开启无线模块发送完数据中断程序,只有当接收方成功接收到
//数据才会产生此中断
28 2401init x0 y0 y1 2 //初始化无线模块,开发板模块的X0接无线模块的IRQ,
//Y0接CE,Y1接CSN,最后参数为2表示SPI速度为8MHz
29 mov 50 d4 //d4=50,通道号50
30 mov 32 d38 //D38=32,最大接收32字节
//启动无线模块数据接收,D2为名称,D4为通道号,D10为接收数据的起始寄存器
//地址,D38为要接收数据字节数,接收完数据后会置位S0
31 2401rx d0 d4 d10 d38 s0
32 while 1 //无限循环
33 endwhile
34 endmain
程序中第1-4行,为24L01数据接收中断程序,中接收的字节数等于设置的字节数时
执行此中断程序;
第5-7行,为24L01数据发送成功中断程序,只有当对方成功的接收到发送的数据后
才会执行此中断程序;
第8-20行,为串口接收中断程序,程序中判断接收的字节数,如果只有一个字节,
表示要设置24L01接收数据的字节数。如果串口接收的字节数大于1,就让24L01将串口
接收的数据发送出去;
第21-34行,为主程序,程序先初始化串口,再初始化24L01,并开启发送接收数据
中断,输入端口X0作为24L01的中断脚,输出口Y0作为24L01的失能脚,输出口Y1作为
24L01的片选脚。最后启动24L01数据接收程序。
装置2程序:
1 intpro rxint //数据接收完成中断程序,注意:接收到指定的字节数,多一个少一个都
//不行
2 prints "24l01 recieved string is %s\r\n" d10 0 //输出接收的字符串
3 prints "24l01 recieve %d bytes\r\n" d38 //输出接收的字符数,实际就是设定的字
//符数
4 endint
5 intpro txint //数据发送成功中断程序,只有当对方成功接收到数据才会执行此中断
6 prints "PCM02 send finish\r\n" //输出发送完成信息
7 endint
8 intpro serialrecvint //串口接收中断程序
9 if d19 = 1 //判断接收到的字节数,如果为一个字节,表示要设置无线模块的接收
//字节数,注意:上位机最好用HEX格式发送数据
10 mov d20 d38 //串口接收到的数据保存到D38中
11 and hff d38 d38 //只有最低字节有效,所以把高3字节清零
12 2401rx d2 d4 d10 d38 s0 //重新启动数据接收
13 prints "set rx len = %d bytes\r\n" d38 //输出要接收的字节数
14 else //如果大于一个字节,表示是让无线模块发送数据出去,上位机用HEX或
//ASC格式都可以
15 prints "serial recieve %d bytes\r\n" d19 //输出上位机发送的字节数
16 prints "now send from PCM02 to PCM01\r\n" //打印准备发送的信息
17 prints "send string is \"%s\"\r\n" d20 0 //准备发送的字符串
//启动发送指令,D0为接收方的名称,D4为通道号50,D20为要发送的数据起始寄
//存器,D19为要发送的字节数,发送成功并且对方接收到数据,S1会置位
18 2401tx d0 d4 d20 d19 s1
19 endif
20 endint
21 main
22 intinit s2 serialrecvint //开启串口接收中断程序
//串口0,即板载USB转串口初始化,波特率115200,接收的数据存放在D20起始的
//寄存器中,接收数据长度存放D19中,接收到数据会置位S2
23 serial 0 115200 d20 d19 s2
24 strcopy "PCM01" D0 //设置对方无线模块的名称,5个字符,所以会占用D0,D1
//共2个寄存器, 所以这2个寄存器不要在其他地方再使用
25 strcopy "PCM02" D2 //设置本无线模块的名称,5个字符,所以会占用D2,D3
//共2个寄存器,所以这2个寄存器不要在其他地方再使用
26 intinit s0 rxint // 开启无线模块接收到数据中断程序
27 intinit s1 txint // 开启无线模块发送完数据中断程序,只有当接收方成功接收到
//数据才会产生此中断
28 2401init x0 y0 y1 2 //初始化无线模块,开发板模块的X0接无线模块的IRQ,Y0
//接CE,Y1接CSN,最后参数为2表示SPI速度为8MHz
29 mov 50 d4 //d4=50,通道号50
30 mov 32 d38 //D38=32,最大接收32字节
//启动无线模块数据接收,D2为名称,D4为通道号,D10为接收数据的起始寄存器
//地址,D38为要接收数据字节数,接收完数据后会置位S0
31 2401rx d2 d4 d10 d38 s0
32 while 1 //无限循环
33 endwhile
34 endmain
以上程序可以看出装置1与装置2的程序除了设置本机名称和要发送的名称不一样,
其他地方都是一样的。下图2-60-2为实验过程中的截图。
图2-60-2 2.4G无线通讯模块NRF24L01实验串口输出