项目记录&【Pro 1】2.4GHz车载感应控制盒-(2)2.4Ghz收发芯片XN297

XN297 / XN297L 是上海磐启微电子有限公司的一款2.4G无线收发芯片。

本项目收发都用该芯片,该芯片通讯方式为Spi。

原理图:

 关键代码:

初始化

 1 uint8_t XN297_Init(void)
 2 {
 3 #if(DATA_RATE == DR_1M) 
 4     uint8_t xdata BB_cal_data[]    = {0x0A,0x6D,0x67,0x9C,0x46}; 
 5     uint8_t xdata RF_cal_data[]    = {0xF6,0x37,0x5D};                                         
 6     uint8_t xdata RF_cal2_data[]   = {0xD5,0x21,0xef,0x2C,0x5A,0x40};
 7     uint8_t xdata Dem_cal_data[]   = {0x01};  
 8     uint8_t xdata Dem_cal2_data[]  = {0x0b,0xDF,0x02};   
 9 #elif(DATA_RATE == DR_250K) 
10    uint8_t xdata  BB_cal_data[]    = {0x12,0xec,0x6f,0xa1,0x46}; 
11    uint8_t xdata  RF_cal_data[]    = {0xf6,0x97,0x5d};
12    uint8_t xdata  RF_cal2_data[]   = {0xd5,0x21,0xeb,0x2c,0x5a,0x40};
13    uint8_t xdata  Dem_cal_data[]   = {0x1F};  
14    uint8_t xdata  Dem_cal2_data[]  = {0x0b,0xdf,0x02};
15 #endif
16       //uint8_t xdata feature = 0x00;
17       uint8_t xdata feature = 0x20;
18       delay_ms(200);
19       XN297_SPIInit(); //SPI初始化
20       delay_ms(2); ;
21       RF_WriteReg(RST_FSPI, 0x5A);                                //Software Reset                
22     RF_WriteReg(RST_FSPI, 0XA5);
23      
24       RF_WriteReg(FLUSH_TX, 0);                                    // CLEAR TXFIFO                         
25     RF_WriteReg(FLUSH_RX, 0);                                    // CLEAR  RXFIFO
26       RF_WriteReg(W_REGISTER + STATUS, 0x70);                            // CLEAR  STATUS    
27     RF_WriteReg(W_REGISTER + EN_RXADDR, 0x01);                            // Enable Pipe0
28     RF_WriteReg(W_REGISTER + SETUP_AW,  0x03);                            // address witdth is 5 bytes
29     RF_WriteReg(W_REGISTER + RF_CH,     DEFAULT_CHANNEL);                                       // 2478M HZ
30     RF_WriteReg(W_REGISTER + RX_PW_P0,  PAYLOAD_WIDTH);                        // 8 bytes
31     RF_WriteBuf(W_REGISTER + TX_ADDR,   ( uint8_t*)TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF));    // Writes TX_Address to PN006
32     RF_WriteBuf(W_REGISTER + RX_ADDR_P0,( uint8_t*)TX_ADDRESS_DEF, sizeof(TX_ADDRESS_DEF));    // RX_Addr0 same as TX_Adr for Auto.Ack   
33     RF_WriteBuf(W_REGISTER + BB_CAL,    BB_cal_data,  sizeof(BB_cal_data));
34     RF_WriteBuf(W_REGISTER + RF_CAL2,   RF_cal2_data, sizeof(RF_cal2_data));
35     RF_WriteBuf(W_REGISTER + DEM_CAL,   Dem_cal_data, sizeof(Dem_cal_data));
36     RF_WriteBuf(W_REGISTER + RF_CAL,    RF_cal_data,  sizeof(RF_cal_data));
37     RF_WriteBuf(W_REGISTER + DEM_CAL2,  Dem_cal2_data,sizeof(Dem_cal2_data));
38     RF_WriteReg(W_REGISTER + DYNPD, 0x00);                                                
39     RF_WriteReg(W_REGISTER + RF_SETUP,  RF_POWER);                        // 13DBM          
40     RF_WriteReg(ACTIVATE, 0x73);
41         RF_WriteReg(W_REGISTER + SETUP_RETR,0x00);                            // Disable retrans...     
42     RF_WriteReg(W_REGISTER + EN_AA,     0x00);                            // Disable AutoAck 
43 
44     if(PAYLOAD_WIDTH >32)
45       feature |= 0x18;
46     RF_WriteReg(W_REGISTER + FEATURE, feature);
47     
48     if(RF_ReadReg(RF_CH)!=DEFAULT_CHANNEL){
49             //printf("error \n");
50       return 0;
51         }
52         //printf("ok \n");
53     return 1;
54 }

 接收模式配置

 1 /*
 2     * @name   RF_DumpRxData
 3     * @brief  RF接收数据
 4     * @param  ucPayload:接收数据存放的起始地址
 5             length:接收数据长度
 6     * @retval None
 7 */
 8 uint8_t RF_DumpRxData( uint8_t *ucPayload,  uint8_t length)
 9 { 
10  
11     if(!(RF_GetStatus()& RX_DR_FLAG))
12     {
13        return 0;                                                                         
14     }
15 
16     RF_ReadBuf(R_RX_PAYLOAD, ucPayload, length);      //将接收到的数据读出到ucPayload
17     RF_WriteReg(FLUSH_RX, 0);    //清除RF的RX FIFO
18     RF_ClearStatus();
19     return 1;
20 }

 

接收数据功能代码

 1 /*
 2     * @name   RF_DumpRxData
 3     * @brief  RF接收数据
 4     * @param  ucPayload:接收数据存放的起始地址
 5             length:接收数据长度
 6     * @retval None
 7 */
 8 uint8_t RF_DumpRxData( uint8_t *ucPayload,  uint8_t length)
 9 { 
10  
11     if(!(RF_GetStatus()& RX_DR_FLAG))
12     {
13        return 0;                                                                         
14     }
15 
16     RF_ReadBuf(R_RX_PAYLOAD, ucPayload, length);      //将接收到的数据读出到ucPayload
17     RF_WriteReg(FLUSH_RX, 0);    //清除RF的RX FIFO
18     RF_ClearStatus();
19     return 1;
20 }

 

posted @ 2023-09-21 15:18  Qianm  阅读(451)  评论(0)    收藏  举报