完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文摘录于本人博客:http://blog.csdn.net/chengdong1314/article/details/51520329
RADIO模块说到底就是一个无线通讯模块,这个实验将实现两个开发板之间的通信 这里的一个开发板是BLE400开发板,一个是青风开发板,前者作为接收端,连接串口到PC,后者作为发送端,连接的是JLINK接口,这样想下载程序也很简单,拔开下载跳线帽换上杜包线就行了。 发送端(青风开发板)主函数如下: int main(void) { u8 num; init(); led_init(); //初始化led radio_configure(); NRF_RADIO->PACKETPTR = (uint32_t)packet;//指针指向数据缓冲packet while(1) { LED1_Toggle(); //电平翻转 delay_ms(1000); //延时 //packet[1]= (NRF_GPIO->IN>>16)&3; //读到的key0,key1数据给发射缓冲 num++; packet[1]= num; //数据准备发送 NRF_RADIO->EVENTS_READY = 0U;//收发模式转换完成标志位。复位 NRF_RADIO->TASKS_TXEN = 1U;//启动无线电为发射模式 while (NRF_RADIO->EVENTS_READY == 0U);//等待收发模式转换完成 // Start transmission. NRF_RADIO->EVENTS_END = 0U;//传输完成标志位,复位 NRF_RADIO->TASKS_START = 1U;//开始传输 while(NRF_RADIO->EVENTS_END == 0U) //等待传输完成 { LED2_Close();//传输失败led0灭 } LED2_Open(); NRF_RADIO->EVENTS_DISABLED = 0U;//无线关闭标志位 复位 NRF_RADIO->TASKS_DISABLE = 1U; // 关闭无线 while(NRF_RADIO->EVENTS_DISABLED == 0U)//等待无线关闭 { // Do nothing. } } } 其中的 init();函数如下所示,主要就是初始化时钟,但是这里有一个小问题没搞懂,查遍手册都没有0x40000504这个寄存器,和写软件一方的人聊了,他们说是官方程序就是这样写的,还有一个更加奇怪的问题,M0内核手册中并没有F0000FE0这些寄存器,因为M0内核结构最高的地址空间是E0100000这也是一个奇怪的现象: void init(void)//51822时钟初始化 { //判断电源时钟状态 if ((((*(uint32_t *)0xF0000FE0) & 0xFF) == 1) && (((*(uint32_t *)0xF0000FE4) & 0xF) == 0)) { if ((((*(uint32_t *)0xF0000FE8) & 0xF0) == 0x0) && (((*(uint32_t *)0xF0000FEC) & 0xF0) == 0x0)) { //解决radio无法写入 *(uint32_t *)0x40000504 = 0xC007FFDF;//电源时钟设置 *(uint32_t *)0x40006C18 = 0x00008000;//GPIOTE设置 } else if ((((*(uint32_t *)0xF0000FE8) & 0xF0) == 0x10) && (((*(uint32_t *)0xF0000FEC) & 0xF0) == 0x0)) { //解决radio无法写入 *(uint32_t *)0x40000504 = 0xC007FFDF;//电源时钟设置 *(uint32_t *)0x40006C18 = 0x00008000;//GPIOTE设置 } else if ((((*(uint32_t *)0xF0000FE8) & 0xF0) == 0x30) && (((*(uint32_t *)0xF0000FEC) & 0xF0) == 0x0)) { //解决radio无法写入 *(uint32_t *)0x40000504 = 0xC007FFDF;//电源时钟设置 *(uint32_t *)0x40006C18 = 0x00008000;//GPIOTE设置 } } NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;//HFCLK晶振运行状态0关闭,1运行 NRF_CLOCK->TASKS_HFCLKSTART = 1;//高外晶振HFCLK 0关闭,1启动 while(!NRF_CLOCK->EVENTS_HFCLKSTARTED);//等待HFCLK晶振运行状态为1 } radio_configure();函数如下所示: //无线功率4分贝,2440MHz,通道0地址0x99999999C0,通道1~7地址0x66666666XX //速率2MHz,数据字节3字节QQXXCC(QQ开始,CC结束,xx是数据char) void radio_configure()//无线配置,准备和nrf24L01通讯 { //无线功率04:+4分贝,0:0分贝,FC:-4分贝,F8:-8分贝 // F4:-12分贝,F0:-16分贝,EC:-20分贝,D8:-30分贝 NRF_RADIO->TXPOWER = (0x04<<0);//无线功率4分贝 NRF_RADIO->FREQUENCY = 40UL;//无线频率40MHz+2400MHz=2440MHz //无线速率:00:1Mbit,01:2Mbit,02:250Kbit,03:1Mbit(蓝牙) NRF_RADIO->MODE = (01<<0);//速率2MHz // 无线地址设置 NRF_RADIO->PREFIX0 = 0xC3C2C1C0UL; // 通道3 到 0 的低1字节 NRF_RADIO->PREFIX1 = 0xC7C6C5C4UL; // 通道7 到 4 的低1字节 NRF_RADIO->BASE0 = 0x99999999UL; // 通道0的高字节 NRF_RADIO->BASE1 = 0x66666666UL; // 通道1-7的高字节 NRF_RADIO->TXADDRESS = 0x00UL; // 发射使用的通道号:0通道 NRF_RADIO->RXADDRESSES = 0x01UL; // 接收的通道号:1通道 // 配置包0的设置 NRF_RADIO->PCNF0 = (0<<16)| //S1领域的长度 (0<<8) | //S0场的长度 (0<<0); //长度字段中的比特数 // 配置包1的设置 NRF_RADIO->PCNF1 = (0<<25)| //效验位(0关,1开) (1<<24)| //数据大小端(高低字节哪个先发 0低字节,1高字节) (4<<16)| //通道1~7高字节长度( nrf24高低字节5字节:4个高+1个低) (3<<8) | //数据字节长度(255~1)3字节QxC (3<<0); //硬件传输字节长度(255~1)3字节QxC // CRC 校验长度配置 NRF_RADIO->CRCCNF = 2; // 校验长度 2个char if ((NRF_RADIO->CRCCNF & 0x03)== 2 ) { NRF_RADIO->CRCINIT = 0xFFFFUL; // 校验初始值 NRF_RADIO->CRCPOLY = 0x11021UL; // CRC poly: x^16+x^12^x^5+1 } else if ((NRF_RADIO->CRCCNF & 0x03) == 1 ) { NRF_RADIO->CRCINIT = 0xFFUL; // 校验初始值 NRF_RADIO->CRCPOLY = 0x107UL; // CRC poly: x^8+x^2^x^1+1 } //接收寄存器是 NRF_RADIO->PACKETPTR } 对于发送端,发送数组的初始化如下: //packet[3]中QxC(Q开始,C结束,x是数据char) static uint8_t packet[3]={'Q','0','C'}; //数据传输用QxC(Q代表开始,C代表结束,x代表数据) 对于接收端(BLE400开发板)主函数如下: int main(void) { init(); led_init(); //初始化led usart_init();//串口初始化 radio_configure();//无线电配置(也可用于和nrf2401通讯) // 设置有效载荷指针 NRF_RADIO->PACKETPTR = (uint32_t)packet;//指针指向数据缓冲packet while(1) { NRF_RADIO->EVENTS_READY = 0U; //收发模式转换完成 标志位 NRF_RADIO->TASKS_RXEN = 1U; //接收模式 while(NRF_RADIO->EVENTS_READY == 0U) //等待收发模式转换完成(接收模式)标志位 { // Do nothing.等待 } NRF_RADIO->EVENTS_END = 0U;//传输完成 标志位 NRF_RADIO->TASKS_START = 1U; // 开始传输 while(NRF_RADIO->EVENTS_END == 0U)//等待传输完成 标志位 { LED2_Close();//传输失败led0灭 } LED2_Open(); if (NRF_RADIO->CRCSTATUS == 1U)//如果CRC校验正确 { //nrf_gpio_port_write(NRF_GPIO_PORT_SELECT_PORT1, packet[0]); if(packet[0]==('Q'))//确定开始 { if(packet[2]==('C'))//结束正确 { printf("num=%drn",packet[1]); LED1_Toggle(); //电平翻转 } } } NRF_RADIO->EVENTS_DISABLED = 0U;//无线关闭 标志位 NRF_RADIO->TASKS_DISABLE = 1U;// 关闭无线设备 while(NRF_RADIO->EVENTS_DISABLED == 0U)//等待设备关闭 { // Do nothing. } } } 其中的 init();和 radio_configure();函数和发送端一样,这里不再细说,数据数组这里的值是零,如下所示: //packet[3]中QxC(Q开始,C结束,x是数据char) static uint8_t volatile packet[3]; //< 数据传输的缓冲包packet[1]是数据 下面是实验实物图像: 下面是接收端发送到PC上位机的数据截图: 通过本实验可以看到RADIO的丢帧率不小! 最后上传本实验代码,其中包括了发送端和接收端: http://download.csdn.net/detail/chengdong1314/9533586 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
3441个成员聚集在这个小组
加入小组物联网工程师必备:怎么选择不同的无线连接威廉希尔官方网站 ,本指南帮你忙!
3304 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3958 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3461 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
4030 浏览 1 评论
20709 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
845浏览 2评论
1075浏览 2评论
1077浏览 1评论
1196浏览 1评论
413浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-13 03:22 , Processed in 1.026379 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号