nrf51822学习之BLE400与青风开发板调试RADIO模块
SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.sydtek.com/
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=%d\r\n",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
nrf51822学习之BLE400与青风开发板调试RADIO模块相关推荐
- 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网
摘自:移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网STM32代码-电脑看 地址:https://www.bilibili.com/video/BV1EJ411P7CR?from= ...
- iTOP-4418开发板-驱动-RS485模块ioctl操作时间间隔修改
本文档介绍迅为RS485模块测试例程,通过ioctl控制模块数据传输方向的时间间隔修改 方法. 适用迅为iTOP-4412开发板丨4418开发板丨6818开发板丨IMX6开发板 本文档以 iTOP-4 ...
- 又到开学季 学习神器走一波 物联网开发板
开学啦,小伙伴们又要开启校园生活了,喜欢学习嵌入式的学霸们,虽然勤奋好学是好事,但也要正确的选择才能尽快入门哦! 对需要的学生党们来说,这款4412物联网开发板超级适合学习,资料丰富,配合项目实战,同 ...
- 学习嵌入式,买什么样的开发板?
类似这样的问题在公众号后台.微信.交流群问的比较多.学嵌入式开发,买开发板是必须的,但不是买了开发板就等于学会了嵌入式. 下面围绕买什么样的开发板这个话题简单说两点. 开发板种类 市面上的开发板有很多 ...
- Ultra96基础学习篇——(1)Ultra96开发板及资料获取
项目需要,手里多了一块Ultra96的开发板,查找资料不多.学习了一段时间,现在整理一下,以便回顾学习. 1.关于Ultra96开发板 Ultra96板子是AVNET开发的,看价格也是比较便宜的.是基 ...
- 【STM32单片机学习】第三课:开发板介绍和Keil环境搭建
[朱老师课程总结 侵删] 第一部分.章节目录 3.3.1.STM32开发板详细介绍 3.3.2.STM32开发板ISP下载原理分析 3.3.3.STM32F4的浮点运算单元 3.3.4.MDK5的开发 ...
- 【SoC FPGA学习】一、AC501-SOC FPGA开发板介绍
少一些功利主义的追求,多一些不为什么的坚持. [SoC FPGA开发常见问题合集]SoC FPGA开发过程中常见问题 本系列学习笔记基于小梅哥SOC Cyclone V SoC开发板. 一. ...
- RISC-V开发与应用学习系列——Tang Nano 9K FPGA开发板介绍
Tang Nano 9K FPGA开发板介绍 简介 开发板资源.IDE及实例演示 简介 Tang Nano 9K 是基于高云半导体 GW1NR-9 FPGA芯片设计的精简型开发板.它搭载的HDMI连接 ...
- TVM学习(七)记录 在开发板上布置VTA (RPC 服务器的构建)
开发板信息: 正点原子-领航者ZYNQ7000 PYNQ-Z2 官方教程:VTA Installation Guide - tvm 0.8.dev0 documentation 可以按照官方教程使用s ...
最新文章
- php ajax替换数据,如何用ajax替换php函数
- 【nacos】本机电脑、服务器上如何安装配置nacos
- BERT为什么是NLP的革新者
- CCNA实验之---单臂路由实现VLAN间路由
- python中 yield的用法和生成器generator的说明
- 如何在SecureCRT上使用公钥登陆Linux服务器
- android 导入so库文件
- 快速列出所有字段_快速掌握目标课题的研究现状 | 应用实例
- 第四十三期:Wireshark网络分析就这么简单,你一定会喜欢的技巧
- TIM SWEENEY:引擎及图形学的未来
- 终章 - 软件工程实践总结作业
- 考研篇:如何在偶数年数学120+(刷同样的题,为什么有人的分数会更高?)
- 用LabVIEW开发简仪USB101数据采集卡会是怎样的?
- 【Leetcode】460. LFU Cache
- html书签导入苹果,如何把360浏览器的收藏书签导入safari浏览器里
- 为什么新生代内存需要有两个Survivor区
- Luna16数据集下载
- 金立否认裁定破产清算;罗永浩力挽锤子科技负债危局;ofo称现场退押金与线上无异丨雷锋早报...
- 蓝桥杯 天干地支 python组
- 2023 华为 Datacom-HCIE 真题题库 04/12--含解析
热门文章
- Java计划任务(任务调度),定时器,定时安排任务,如定时发送Excel表格到用户邮箱(quartz+poi+javax.mail)
- 2022-2028年全球与中国尼龙轮胎帘布行业发展趋势及竞争策略研究
- pyroomacoustics库的功能
- 给VS程序添加管理员权限等
- TP-LINK路由器端口映射详解
- 【Android】用Android写个自己的画板APP
- 用友t3选择服务器无响应,用友T3用友通客户端访问服务器时响应很慢
- 人工智能和安防展的三要素,算法、算力和数据的介绍
- Hdu 2546 饭卡
- Rust 编程视频教程(进阶)——022 模式