找回密码
 立即注册
查看: 751|回复: 0

2.4G无线模块 寄存器SPI读写测试

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:508
  • 最近打卡:2025-05-01 10:12:43

17

主题

65

回帖

1654

积分

金牌会员

积分
1654
发表于 2023-11-26 11:06:59 | 显示全部楼层 |阅读模式

2.4G无线模块常用于无线鼠标键盘,遥控等场合。MCU和2.4G模块通过4线SPI通讯。本测采用XN297 2.4g模块原理图见下图:
83fca63370964b46915609b491c18c88.png

XN297 四线SPI读写寄存器测试
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>
  3. sbit CE=P1^0;
  4. sbit CS=P1^1;
  5. sbit SCK=P1^2;
  6. sbit MOSI=P1^3;
  7. sbit MISO=P1^4;
  8. const unsigned char TX_ADDRESS_DEF[5] = {0xcc,0xCC,0xCC,0xCC,0xCC};                    //RF 地址:接收端和发送端需一致
  9. #define         HIGH                    (1)
  10. #define         LOW                     (0)
  11. #define         CSN_HIGH                (CSN |= HIGH)
  12. #define         CSN_LOW                 (CSN &= LOW)
  13. #define         SCK_HIGH                (SCK |= HIGH)
  14. #define         SCK_LOW                 (SCK &= LOW)
  15. #define         SPI_DATA_HIGH           (DATA |= HIGH)
  16. #define         SPI_DATA_LOW            (DATA &= LOW)
  17. #define         SPI_DATA_STATUS         (DATA)
  18. #define         SPI_DATA_OUTPUT_MODE     ;
  19. #define         SPI_DATA_INPUT_MODE      ;
  20. #define         CE_HIGH                  RF_WriteReg(CE_FSPI_ON, 0)
  21. #define         CE_LOW                   RF_WriteReg(CE_FSPI_OFF, 0)
  22. /********************SPI  REGISTER  ********************/
  23. #define                R_REGISTER                        0x00                            //SPI read RF data
  24. #define                W_REGISTER                        0x20                            //SPI write RF data
  25. #define                R_RX_PAYLOAD                        0x61                            //Read RX Payload
  26. #define                W_TX_PAYLOAD                        0xA0                            //Write TX Payload
  27. #define                FLUSH_TX                        0xE1                            //Flush RX FIFO
  28. #define                FLUSH_RX                        0xE2                            //Flush TX FIFO
  29. #define                REUSE_TX_PL                        0xE3                            //Reuse TX Payload
  30. #define                ACTIVATE                        0x50                            //ACTIVATE
  31. #define                DEACTIVATE                        0x50                            //DEACTIVATE
  32. #define                R_RX_PL_WID                        0x60                            //Read width of RX data
  33. #define                W_ACK_PAYLOAD                        0xA8                            //Data with ACK
  34. #define                W_TX_PAYLOAD_NOACK                0xB0                            //TX Payload no ACK Request
  35. #define                CE_FSPI_ON                        0xFD                            // CE HIGH
  36. #define                CE_FSPI_OFF                        0xFC                            // CE LOW
  37. #define                RST_FSPI                        0x53                            // RESET
  38. #define                NOP_N                                0xFF
  39.             
  40. /******************CONTROL  REGISTER*******************/
  41. #define                CONFIG                          0x00            
  42. #define                EN_AA                                0x01
  43. #define                EN_RXADDR                        0x02
  44. #define                SETUP_AW                        0x03
  45. #define                SETUP_RETR                        0x04
  46. #define                RF_CH                                0x05
  47. #define                RF_SETUP                        0x06
  48. #define                STATUS                                0x07
  49. #define                OBSERVE_TX                        0x08
  50. #define                DATAOUT                                0x09
  51. #define                RX_ADDR_P0                        0x0A
  52. #define                RX_ADDR_P1                        0x0B
  53. #define                RX_ADDR_P2                        0x0C
  54. #define                RX_ADDR_P3                        0x0D
  55. #define                RX_ADDR_P4                        0x0E
  56. #define                RX_ADDR_P5                        0x0F
  57. #define                TX_ADDR                                0x10
  58. #define                RX_PW_P0                        0x11
  59. #define                RX_PW_P1                        0x12
  60. #define                RX_PW_P2                        0x13
  61. #define                RX_PW_P3                        0x14
  62. #define                RX_PW_P4                        0x15
  63. #define                RX_PW_P5                        0x16
  64. #define                FIFO_STATUS                        0x17
  65. #define                DEM_CAL                                0x19
  66. #define         RF_CAL2                                0x1A
  67. #define         DEM_CAL2                        0x1B
  68. #define                DYNPD                                0x1C
  69. #define                FEATURE                                0x1D       
  70. #define                RF_CAL                                0x1E
  71. #define                BB_CAL                                0x1F
  72. /
  73. /*************************CONTROL CMD***********************************************/
  74. #define         RF13dBm                         0x3F                            // 13dBm  发射档位功率设置
  75. #define         RF10dBm                         0X0F                            // 10dBm
  76. #define         RF8dBm                          0x15                            // 8dbm      
  77. #define         RF7dBm                          0x07                            // 7dbm   
  78. #define         RF5dBm                          0x2c                            // 5dbm   
  79. #define         RF4dBm                          0x06                            // 4dbm   
  80. #define         RF2dBm                          0x05                            // 2dbm  
  81. #define         RF0dBm                          0X0B                            // 0dBm  
  82. #define         RF_3dBm                         0x04                            // -3dBm     
  83. #define         RF_6dBm                         0x0A                            // -6dBm
  84. #define         RF_10dBm                        0x02                            // -10dBm
  85. #define         RF_18dBm                        0x01                            // -18dBm
  86. #define         RF_30dBm                        0x00                            // -30dBm
  87. #define         DR_1M                           0X00                                //通信速率 1Mbps
  88. #define         DR_2M                           0X40                                //通信速率 2Mbps
  89. #define         DR_250K                         0XC0                             //通信速率 250Kbps
  90. #define         RX_DR_FLAG                      0X40                            // 接收中断标志位
  91. #define         TX_DS_FLAG                      0X20                            // 发送完成中断标志位
  92. #define         RX_TX_CMP_FLAG                  0X60                            // 发送接收完成中断标志位,ack_payload 模式下使用
  93. #define         MAX_RT_FLAG                     0X10                            // 发送重传超时中断标志位
  94. #define         TRANS_ENHANCE_MODE              1                               //传输类型增强型
  95. #define         TRANS_BURST_MODE                2                               //传输类型普通型
  96. #define         RxMode                           1
  97. #define         RxMode_RTTE                      2
  98. #define         DEFAULT_CHANNEL                78                                //初始化时的频率: 2478 MHz           
  99. #define         PAYLOAD_WIDTH                  16                                //Payload宽度:     8bytes                               
  100. #define         TRANSMIT_TYPE                  TRANS_BURST_MODE                 //使用普通型模式           TRANS_BURST_MODE    TRANS_ENHANCE_MODE
  101. #define         DATA_RATE                      DR_1M                           //通信速率1Mbps            DR_2M    DR_1M  DR_250K
  102. #define         RF_POWER                      (RF13dBm |DATA_RATE)                //发射功率13dBm
  103. #define         RF_MODE                       RxMode_RTTE  //  RxMode_RTTE
  104. typedef unsigned long Uint16;
  105. typedef unsigned char Uint8;
  106. void UART_int(Uint16 baud);
  107. void Sentdata(Uint8 dat);
  108. unsigned char XN297_Check(void);
  109. Uint8 temp;
  110. void SPI_init(void);
  111. void RF_WriteReg( unsigned char reg,  unsigned char wdata);
  112. void RF_WriteBuf( unsigned char reg, unsigned char *pBuf, unsigned char length);
  113.        
  114. void Delay1000ms()                //@11.0592MHz
  115. {
  116.         unsigned char i, j, k;
  117.         _nop_();
  118.         i = 8;
  119.         j = 1;
  120.         k = 243;
  121.         do
  122.         {
  123.                 do
  124.                 {
  125.                         while (--k);
  126.                 } while (--j);
  127.         } while (--i);
  128. }
  129. void Delay10ms()                //@11.0592MHz
  130. {
  131.         unsigned char i, j;
  132.         i = 18;
  133.         j = 235;
  134.         do
  135.         {
  136.                 while (--j);
  137.         } while (--i);
  138. }
  139. void RF_Init(void)
  140. {
  141. #if(DATA_RATE == DR_1M)
  142.     unsigned char  BB_cal_data[]    = {0x0A,0x6D,0x67,0x9C,0x46};                               //1M速率配置
  143.     unsigned char  RF_cal_data[]    = {0xF6,0x37,0x5D};
  144.     unsigned char  RF_cal2_data[]   = {0x45,0x21,0xef,0x2C,0x5A,0x50};
  145.     unsigned char  Dem_cal_data[]   = {0x01};  
  146.     unsigned char  Dem_cal2_data[]  = {0x0b,0xDF,0x02};  
  147. #elif(DATA_RATE == DR_250K)
  148.   /*
  149.     //  unsigned char  BB_cal_data[]    = {0x0A,0x6D,0x67,0x9C,0x46};                                 //250K速率配置
  150.     unsigned char  BB_cal_data[]    = {0x0A,0xeD,0x7F,0x9C,0x46};
  151.     unsigned char  RF_cal_data[]    = {0xF6,0x37,0x5D};
  152.     unsigned char  RF_cal2_data[]   = {0xD5,0x21,0xeb,0x2C,0x5A,0x40};
  153.     unsigned char  Dem_cal_data[]   = {0x1e};  
  154.     unsigned char  Dem_cal2_data[]  = {0x0b,0xDF,0x02};
  155.      */
  156.    unsigned char   BB_cal_data[]    = { 0x12,0xec,0x6f,0xa1,0x46};
  157.    unsigned char    RF_cal_data[]    = {0xF6,0x37,0x5d};
  158.    unsigned char   RF_cal2_data[]   = {0xd5,0x21,0xeb,0x2c,0x5a,0x40};
  159.    unsigned char    Dem_cal_data[]   = {0x1f};  
  160.    unsigned char    Dem_cal2_data[]  = {0x0b,0xdf,0x02};
  161.    
  162. #endif
  163.       
  164.    
  165.     SPI_init();
  166.     RF_WriteReg(RST_FSPI, 0x5A);                                                                //Software Reset                           
  167.     RF_WriteReg(RST_FSPI, 0XA5);   
  168.    // RF_WriteReg(W_REGISTER + FEATURE, 0x20);                                                    // enable Software control ce
  169.    
  170.     if(PAYLOAD_WIDTH <33)                                                                                       
  171. {
  172.         RF_WriteReg(W_REGISTER +FEATURE, 0x27);                                                        //切换到32byte模式   使能CE
  173. }
  174. else
  175. {
  176.   RF_WriteReg(W_REGISTER +FEATURE, 0x38);                                                        //切换到64byte模式          
  177. }   
  178.     //CE_LOW;   
  179.                 CE=0;//5.1
  180.     RF_WriteReg(FLUSH_TX, 0);                                                                        // CLEAR TXFIFO                                             
  181.     RF_WriteReg(FLUSH_RX, 0);                                                                        // CLEAR  RXFIFO
  182.     RF_WriteReg(W_REGISTER + STATUS, 0x70);                                                        // CLEAR  STATUS       
  183.     RF_WriteReg(W_REGISTER + EN_RXADDR, 0x01);                                                        // Enable Pipe0
  184.     RF_WriteReg(W_REGISTER + SETUP_AW,  0x03);                                                        // address witdth is 5 bytes
  185.     RF_WriteReg(W_REGISTER + RF_CH,     DEFAULT_CHANNEL);                                       // 2478M HZ
  186.     RF_WriteReg(W_REGISTER + RX_PW_P0,  PAYLOAD_WIDTH);                                                // 8 bytes
  187.     RF_WriteBuf(W_REGISTER + TX_ADDR,   ( unsigned char*)TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF));        // Writes TX_Address to PN006
  188.     RF_WriteBuf(W_REGISTER + RX_ADDR_P0,( unsigned char*)TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF));        // RX_Addr0 same as TX_Adr for Auto.Ack   
  189.     RF_WriteBuf(W_REGISTER + BB_CAL,    BB_cal_data,  sizeof(BB_cal_data));
  190.     RF_WriteBuf(W_REGISTER + RF_CAL2,   RF_cal2_data, sizeof(RF_cal2_data));
  191.     RF_WriteBuf(W_REGISTER + DEM_CAL,   Dem_cal_data, sizeof(Dem_cal_data));
  192.     RF_WriteBuf(W_REGISTER + RF_CAL,    RF_cal_data,  sizeof(RF_cal_data));
  193.     RF_WriteBuf(W_REGISTER + DEM_CAL2,  Dem_cal2_data,sizeof(Dem_cal2_data));
  194.     RF_WriteReg(W_REGISTER + DYNPD, 0x00);                                       
  195.     RF_WriteReg(W_REGISTER + RF_SETUP,  RF_POWER);                                                // 13DBM                 
  196.      
  197. #if(TRANSMIT_TYPE == TRANS_ENHANCE_MODE)      
  198.     RF_WriteReg(W_REGISTER + SETUP_RETR,0x03);                                                        //  3 retrans...        
  199.     RF_WriteReg(W_REGISTER + EN_AA,     0x01);                                                        // Enable Auto.Ack:Pipe0         
  200. #elif(TRANSMIT_TYPE == TRANS_BURST_MODE)                                                               
  201.     RF_WriteReg(W_REGISTER + SETUP_RETR,0x00);                                                        // Disable retrans...        
  202.     RF_WriteReg(W_REGISTER + EN_AA,     0x00);                                                        // Disable AutoAck
  203. #endif
  204. }
  205. void SPI_init(void)
  206. {
  207.         CE =0;
  208.         CS = 1;
  209.         SCK = 0;
  210.         MOSI = 1;
  211. }
  212. void SPI_Write_Byte(unsigned char dat)
  213. {
  214.     unsigned char i;
  215.     for (i = 0; i < 8; i++)
  216.     {
  217.                                 SCK = 0;
  218.         MOSI = dat & 0x80;
  219.         
  220.         dat <<= 1;
  221.         SCK = 1;
  222.     }
  223.                 SCK = 0;
  224. }
  225. unsigned char SPI_Read_Byte(void)
  226. {
  227.     unsigned char i, dat = 0;
  228.     for (i = 0; i < 8; i++)
  229.     {
  230.                                 SCK = 0;
  231.         dat <<= 1;
  232.         SCK = 1;
  233.         if (MISO)
  234.         {
  235.             dat |= 0x01;
  236.         }
  237.         
  238.     }
  239.                 SCK = 0;
  240.     return dat;
  241. }
  242. unsigned char Read_Register(unsigned char reg_addr)
  243. {
  244.     unsigned char dat;
  245.     CS = 0;
  246.     SPI_Write_Byte(reg_addr | 0x80);
  247.     dat = SPI_Read_Byte();
  248.     CS = 1;
  249.     return dat;
  250. }
  251. void RF_WriteReg( unsigned char reg,  unsigned char wdata)
  252. {
  253.     CS=0;
  254.     SPI_Write_Byte(reg);
  255.     SPI_Write_Byte(wdata);
  256.     CS=1;
  257. }
  258. void RF_WriteBuf( unsigned char reg, unsigned char *pBuf, unsigned char length)
  259. {
  260.      unsigned char j;
  261.     CS=0;
  262.     j = 0;
  263.     SPI_Write_Byte(reg);
  264.     for(j = 0;j < length; j++)
  265.     {
  266.         SPI_Write_Byte(pBuf[j]);
  267.     }
  268.     j = 0;
  269.     CS=1;
  270. }
  271. /*
  272. unsigned char ucRF_ReadReg( unsigned char reg)
  273. {
  274.      unsigned char data1;
  275.    
  276.     CS=0;
  277.     SPI_Write_Byte(reg);
  278.     data1 = SPI_Read_Byte();
  279.     //SPI_DATA_OUTPUT_MODE;
  280.     CS=1;
  281.    
  282.     return data1;
  283. }
  284. */
  285. void RF_ReadBuf( unsigned char reg, unsigned char *pBuf,  unsigned char length)
  286. {
  287.     unsigned char byte_ctr;
  288.     CS=0;                                                                                         
  289.     SPI_Write_Byte(reg);                                                                                      
  290.     for(byte_ctr=0;byte_ctr<length;byte_ctr++)
  291.             pBuf[byte_ctr] = SPI_Read_Byte();
  292.     SPI_DATA_OUTPUT_MODE;
  293.     CS=1;                                                                                
  294. }
  295. void RF_TxMode(void)
  296. {
  297.                 CE=0;
  298.     RF_WriteReg(W_REGISTER + CONFIG,  0X8E);                                                        // 将RF设置成TX模式
  299.     Delay10ms();
  300.                 CE=1;//5.1
  301.     Delay10ms();
  302. }
  303. void main(void)
  304. {
  305.        
  306.         UART_int(9600);
  307.         EA =1;
  308.         RF_Init();       
  309.         RF_TxMode();
  310.        
  311.         Sentdata(0x33);
  312.   // 进一步处理读取结果
  313.         while(1){
  314.                 XN297_Check();
  315.                 Delay1000ms();
  316.         }
  317. }
  318. unsigned char XN297_Check(void)
  319. {
  320.         unsigned char check_in_buf[5]={0x55,0xaa,0x55,0xaa,0x55};
  321.         unsigned char check_out_buf[5]={0x00};
  322.         unsigned char i;
  323.        
  324.         //CE_HIGH;
  325.         RF_WriteBuf(W_REGISTER+TX_ADDR,check_in_buf,5);
  326.         RF_ReadBuf(R_REGISTER+TX_ADDR,check_out_buf,5);
  327.         for(i=0;i<5;i++)
  328.         {
  329.                 Sentdata(check_out_buf[i]);
  330.         }
  331.         if((check_out_buf[0]==0x55)&&\
  332.                 (check_out_buf[1]==0xaa)&&\
  333.                 (check_out_buf[1]==0x55)&&\
  334.                 (check_out_buf[1]==0xaa)&&\
  335.                 (check_out_buf[1]==0x55))
  336.                 return 0;
  337.         else
  338.                 return 1;
  339. }
  340. void UART_int(Uint16 baud)
  341. {
  342.         TMOD = (TMOD&0X0F)|0X20;
  343.         TH1 = 256-11059200/32/12/baud;
  344.         TL1        = TH1;
  345.         TR1 = 1;
  346.         ET1 = 0;
  347.         SCON = 0X50;
  348.         ES        = 1;
  349. }
  350. void Sentdata(Uint8 dat)
  351. {
  352.         SBUF =dat;
  353.         while(TI==0);
  354.         TI =0;
  355. }
  356. void UART() interrupt 4
  357. {
  358.         if(RI==1)
  359.         {
  360.                 RI=0;
  361.                 temp =SBUF;
  362.         }
  363. }
复制代码
主要用于测试的函数是:

unsigned char XN297_Check(void)
{
    unsigned char check_in_buf[5]={0x55,0xaa,0x55,0xaa,0x55};
    unsigned char check_out_buf[5]={0x00};
    unsigned char i;
   
    //CE_HIGH;
    RF_WriteBuf(W_REGISTER+TX_ADDR,check_in_buf,5);
    RF_ReadBuf(R_REGISTER+TX_ADDR,check_out_buf,5);
    for(i=0;i<5;i++)
    {
        Sentdata(check_out_buf);
    }
    if((check_out_buf[0]==0x55)&&\
        (check_out_buf[1]==0xaa)&&\
        (check_out_buf[1]==0x55)&&\
        (check_out_buf[1]==0xaa)&&\
        (check_out_buf[1]==0x55))
        return 0;
    else
        return 1;
}
  就是向TX_ADDR寄存器写入0x55,0xaa,0x55,0xaa,0x55,然后通过RF_ReadBuf(R_REGISTER+TX_ADDR,check_out_buf,5)读出来保存到check_out_buf并发送给串口,通过串口助手得到:

1da13a2118ef4ba0a52658f1cd5d95f4.png

可以证明2.4g模块寄存器工作正常,访问正常。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:32 , Processed in 0.107249 second(s), 47 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表