[Kinetis] 无线串口NRF24L01

[复制链接]
 楼主| secretuniverse 发表于 2016-1-4 20:22 | 显示全部楼层 |阅读模式
做这个无线通信是目前项目上需要的,但是项目进行中,不方便上传资料,用无线通信模块来做闭环控制的,两个无线模块分别在跟在51单片和dsp后面进行数据实时通信的,但是51的处理能力毕竟弱些,换成飞思卡尔挺好的,哈哈,申请放我过吧!

usb口的无线通信模块


单片机侧的无线模块


 楼主| secretuniverse 发表于 2016-1-4 20:23 | 显示全部楼层
本帖最后由 secretuniverse 于 2016-1-4 20:25 编辑

代码在这里

nRF24L01中文说明书.pdf

711.47 KB, 下载次数: 55

 楼主| secretuniverse 发表于 2016-1-4 20:26 | 显示全部楼层
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. /**********  NRF24L01寄存器操作命令  ***********/
  6. #define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
  7. #define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
  8. #define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
  9. #define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
  10. #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
  11. #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
  12. #define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
  13. #define NOP             0xFF  //空操作,可以用来读状态寄存器         
  14. /**********  NRF24L01寄存器地址   *************/
  15. #define CONFIG          0x00  //配置寄存器地址                             
  16. #define EN_AA           0x01  //使能自动应答功能
  17. #define EN_RXADDR       0x02  //接收地址允许
  18. #define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
  19. #define SETUP_RETR      0x04  //建立自动重发
  20. #define RF_CH           0x05  //RF通道
  21. #define RF_SETUP        0x06  //RF寄存器
  22. #define STATUS          0x07  //状态寄存器
  23. #define OBSERVE_TX      0x08  // 发送检测寄存器
  24. #define CD              0x09  // 载波检测寄存器
  25. #define RX_ADDR_P0      0x0A  // 数据通道0接收地址
  26. #define RX_ADDR_P1      0x0B  // 数据通道1接收地址
  27. #define RX_ADDR_P2      0x0C  // 数据通道2接收地址
  28. #define RX_ADDR_P3      0x0D  // 数据通道3接收地址
  29. #define RX_ADDR_P4      0x0E  // 数据通道4接收地址
  30. #define RX_ADDR_P5      0x0F  // 数据通道5接收地址
  31. #define TX_ADDR         0x10  // 发送地址寄存器
  32. #define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
  33. #define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
  34. #define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
  35. #define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
  36. #define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
  37. #define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
  38. #define FIFO_STATUS     0x17  // FIFO状态寄存器
  39. /*————————————————————————————————————————————————


bitofnoone 发表于 2016-1-4 20:29 | 显示全部楼层
  1. void delay_150us()
  2. {
  3.         uint i;

  4.         for(i=0;i>150;i++);
  5. }
  6. void qianjin()        //前进
  7. {
  8.         A1=0;A2=1;
  9.         B1=0;B2=1;
  10. }
  11. void houtui()        //后退
  12. {
  13.         A1=1;A2=0;
  14.         B1=1;B2=0;
  15. }
  16. void zuozhuan()        //左转
  17. {
  18.         A1=1;A2=0;
  19.         B1=0;B2=1;
  20. }
  21. void youzhuan()        //右转
  22. {
  23.         A1=0;A2=1;
  24.         B1=1;B2=0;
  25. }
  26. void tingzhi()        //停止
  27. {
  28.         A1=0;A2=0;
  29.         B1=0;B2=0;
  30. }
  31. /***************************************************************/

  32. /*******************************************************************/
  33. uchar SPI_RW(uchar byte)
  34. {
  35.         uchar bit_ctr;
  36.         for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // 输出8位
  37.         {
  38.                 NRF_MOSI=(byte&0x80);                         // MSB TO MOSI
  39.                 byte=(byte<<1);                                        // shift next bit to MSB
  40.                 NRF_SCK=1;
  41.                 byte|=NRF_MISO;                                // capture current MISO bit
  42.                 NRF_SCK=0;
  43.         }
  44.         return byte;
  45. }
bitofnoone 发表于 2016-1-4 20:30 | 显示全部楼层
  1. /*********************************************/
  2. /* 函数功能:给24L01的寄存器写值(一个字节) */
  3. /* 入口参数:reg   要写的寄存器地址          */
  4. /*           value 给寄存器写的值            */
  5. /* 出口参数:status 状态值                   */
  6. /*********************************************/
  7. uchar NRF24L01_Write_Reg(uchar reg,uchar value)
  8. {
  9.         uchar status;

  10.         NRF_CSN=0;                  //CSN=0;   
  11.           status = SPI_RW(reg);                //发送寄存器地址,并读取状态值
  12.         SPI_RW(value);
  13.         NRF_CSN=1;                  //CSN=1;

  14.         return status;
  15. }
  16. /*************************************************/
  17. /* 函数功能:读24L01的寄存器值 (一个字节)      */
  18. /* 入口参数:reg  要读的寄存器地址               */
  19. /* 出口参数:value 读出寄存器的值                */
  20. /*************************************************/
  21. uchar NRF24L01_Read_Reg(uchar reg)
  22. {
  23.         uchar value;

  24.         NRF_CSN=0;              //CSN=0;   
  25.           SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  26.         value = SPI_RW(NOP);
  27.         NRF_CSN=1;                     //CSN=1;

  28.         return value;
  29. }
bitofnoone 发表于 2016-1-4 20:31 | 显示全部楼层
  1. /*********************************************/
  2. /* 函数功能:读24L01的寄存器值(多个字节)   */
  3. /* 入口参数:reg   寄存器地址                */
  4. /*           *pBuf 读出寄存器值的存放数组    */
  5. /*           len   数组字节长度              */
  6. /* 出口参数:status 状态值                   */
  7. /*********************************************/
  8. uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
  9. {
  10.         uchar status,u8_ctr;
  11.         NRF_CSN=0;                           //CSN=0      
  12.           status=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
  13.         for(u8_ctr=0;u8_ctr<len;u8_ctr++)
  14.         pBuf[u8_ctr]=SPI_RW(0XFF);                //读出数据
  15.         NRF_CSN=1;                                 //CSN=1
  16.           return status;                                //返回读到的状态值
  17. }
  18. /**********************************************/
  19. /* 函数功能:给24L01的寄存器写值(多个字节)  */
  20. /* 入口参数:reg  要写的寄存器地址            */
  21. /*           *pBuf 值的存放数组               */
  22. /*           len   数组字节长度               */
  23. /**********************************************/
  24. uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
  25. {
  26.         uchar status,u8_ctr;
  27.         NRF_CSN=0;
  28.           status = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  29.           for(u8_ctr=0; u8_ctr<len; u8_ctr++)
  30.         SPI_RW(*pBuf++);                                 //写入数据
  31.         NRF_CSN=1;
  32.           return status;                          //返回读到的状态值
  33. }                                                                                                    
bitofnoone 发表于 2016-1-4 20:32 | 显示全部楼层
  1. /*********************************************/
  2. /* 函数功能:24L01接收数据                   */
  3. /* 入口参数:rxbuf 接收数据数组              */
  4. /* 返回值: 0   成功收到数据                 */
  5. /*          1   没有收到数据                 */
  6. /*********************************************/
  7. uchar NRF24L01_RxPacket(uchar *rxbuf)
  8. {
  9.         uchar state;
  10.          
  11.         state=NRF24L01_Read_Reg(STATUS);                          //读取状态寄存器的值             
  12.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
  13.         if(state&RX_OK)                                                                //接收到数据
  14.         {
  15.                 NRF_CE = 0;
  16.                 NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
  17.                 NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
  18.                 NRF_CE = 1;
  19.                 delay_150us();
  20.                 return 0;
  21.         }          
  22.         return 1;//没收到任何数据
  23. }
  24. /**********************************************/
  25. /* 函数功能:设置24L01为发送模式              */
  26. /* 入口参数:txbuf  发送数据数组              */
  27. /* 返回值; 0x10    达到最大重发次数,发送失败*/
  28. /*          0x20    成功发送完成              */
  29. /*          0xff    发送失败                  */
  30. /**********************************************/
  31. uchar NRF24L01_TxPacket(uchar *txbuf)
  32. {
  33.         uchar state;
  34.    
  35.         NRF_CE=0;                                                                                                //CE拉低,使能24L01配置
  36.           NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
  37.         NRF_CE=1;                                                                                                //CE置高,使能发送          
  38.         while(NRF_IRQ==1);                                                                                //等待发送完成
  39.         state=NRF24L01_Read_Reg(STATUS);                                                  //读取状态寄存器的值          
  40.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state);                         //清除TX_DS或MAX_RT中断标志
  41.         if(state&MAX_TX)                                                                                //达到最大重发次数
  42.         {
  43.                 NRF24L01_Write_Reg(FLUSH_TX,0xff);                                        //清除TX FIFO寄存器
  44.                 return MAX_TX;
  45.         }
  46.         if(state&TX_OK)                                                                                        //发送完成
  47.         {
  48.                 return TX_OK;
  49.         }
  50.         return 0xff;                                                                                        //发送失败
  51. }
americ 发表于 2016-1-4 21:41 | 显示全部楼层
用蓝牙也挺好吧?
或者wifi
dwdsp 发表于 2016-1-5 08:32 | 显示全部楼层
不必求吧,这类模块不要太便宜啊!自个买就好的
woosoo521 发表于 2016-1-5 08:55 | 显示全部楼层
用在四轴上
xszms 发表于 2016-1-5 10:13 | 显示全部楼层
赞一个!
jls1976 发表于 2016-1-5 20:20 | 显示全部楼层
跟赞
xpu_ws 发表于 2016-1-6 09:13 | 显示全部楼层
呵呵哈哈 我看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

55

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部