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

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

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 170 天

    [LV.7]常住居民III

    14

    主题

    53

    回帖

    778

    积分

    高级会员

    积分
    778
    发表于 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, 2024-5-18 14:15 , Processed in 0.060067 second(s), 31 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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