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模块相关推荐

  1. 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网

    摘自:移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网STM32代码-电脑看 地址:https://www.bilibili.com/video/BV1EJ411P7CR?from= ...

  2. iTOP-4418开发板-驱动-RS485模块ioctl操作时间间隔修改

    本文档介绍迅为RS485模块测试例程,通过ioctl控制模块数据传输方向的时间间隔修改 方法. 适用迅为iTOP-4412开发板丨4418开发板丨6818开发板丨IMX6开发板 本文档以 iTOP-4 ...

  3. 又到开学季 学习神器走一波 物联网开发板

    开学啦,小伙伴们又要开启校园生活了,喜欢学习嵌入式的学霸们,虽然勤奋好学是好事,但也要正确的选择才能尽快入门哦! 对需要的学生党们来说,这款4412物联网开发板超级适合学习,资料丰富,配合项目实战,同 ...

  4. 学习嵌入式,买什么样的开发板?

    类似这样的问题在公众号后台.微信.交流群问的比较多.学嵌入式开发,买开发板是必须的,但不是买了开发板就等于学会了嵌入式. 下面围绕买什么样的开发板这个话题简单说两点. 开发板种类 市面上的开发板有很多 ...

  5. Ultra96基础学习篇——(1)Ultra96开发板及资料获取

    项目需要,手里多了一块Ultra96的开发板,查找资料不多.学习了一段时间,现在整理一下,以便回顾学习. 1.关于Ultra96开发板 Ultra96板子是AVNET开发的,看价格也是比较便宜的.是基 ...

  6. 【STM32单片机学习】第三课:开发板介绍和Keil环境搭建

    [朱老师课程总结 侵删] 第一部分.章节目录 3.3.1.STM32开发板详细介绍 3.3.2.STM32开发板ISP下载原理分析 3.3.3.STM32F4的浮点运算单元 3.3.4.MDK5的开发 ...

  7. 【SoC FPGA学习】一、AC501-SOC FPGA开发板介绍

       少一些功利主义的追求,多一些不为什么的坚持. [SoC FPGA开发常见问题合集]SoC FPGA开发过程中常见问题   本系列学习笔记基于小梅哥SOC Cyclone V SoC开发板. 一. ...

  8. RISC-V开发与应用学习系列——Tang Nano 9K FPGA开发板介绍

    Tang Nano 9K FPGA开发板介绍 简介 开发板资源.IDE及实例演示 简介 Tang Nano 9K 是基于高云半导体 GW1NR-9 FPGA芯片设计的精简型开发板.它搭载的HDMI连接 ...

  9. TVM学习(七)记录 在开发板上布置VTA (RPC 服务器的构建)

    开发板信息: 正点原子-领航者ZYNQ7000 PYNQ-Z2 官方教程:VTA Installation Guide - tvm 0.8.dev0 documentation 可以按照官方教程使用s ...

最新文章

  1. php ajax替换数据,如何用ajax替换php函数
  2. 【nacos】本机电脑、服务器上如何安装配置nacos
  3. BERT为什么是NLP的革新者
  4. CCNA实验之---单臂路由实现VLAN间路由
  5. python中 yield的用法和生成器generator的说明
  6. 如何在SecureCRT上使用公钥登陆Linux服务器
  7. android 导入so库文件
  8. 快速列出所有字段_快速掌握目标课题的研究现状 | 应用实例
  9. 第四十三期:Wireshark网络分析就这么简单,你一定会喜欢的技巧
  10. TIM SWEENEY:引擎及图形学的未来
  11. 终章 - 软件工程实践总结作业
  12. 考研篇:如何在偶数年数学120+(刷同样的题,为什么有人的分数会更高?)
  13. 用LabVIEW开发简仪USB101数据采集卡会是怎样的?
  14. 【Leetcode】460. LFU Cache
  15. html书签导入苹果,如何把360浏览器的收藏书签导入safari浏览器里
  16. 为什么新生代内存需要有两个Survivor区
  17. Luna16数据集下载
  18. 金立否认裁定破产清算;罗永浩力挽锤子科技负债危局;ofo称现场退押金与线上无异丨雷锋早报...
  19. 蓝桥杯 天干地支 python组
  20. 2023 华为 Datacom-HCIE 真题题库 04/12--含解析

热门文章

  1. Java计划任务(任务调度),定时器,定时安排任务,如定时发送Excel表格到用户邮箱(quartz+poi+javax.mail)
  2. 2022-2028年全球与中国尼龙轮胎帘布行业发展趋势及竞争策略研究
  3. pyroomacoustics库的功能
  4. 给VS程序添加管理员权限等
  5. TP-LINK路由器端口映射详解
  6. 【Android】用Android写个自己的画板APP
  7. 用友t3选择服务器无响应,用友T3用友通客户端访问服务器时响应很慢
  8. 人工智能和安防展的三要素,算法、算力和数据的介绍
  9. Hdu 2546 饭卡
  10. Rust 编程视频教程(进阶)——022 模式