找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 51|回复: 0
打印 上一主题 下一主题
收起左侧

SI24R1示例代码与通信异常问题集锦

[复制链接]
跳转到指定楼层
楼主
ID:698592 发表于 2024-4-24 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Si24R1通信异常问题集锦
2.4G通信异常一般都有如下问题,
一次也不能收到数据
(初诊:硬件接线和软件配置问题)
2、在发射端或接收端重新上电的时候,可接收到一次
(初诊:没有及时清空RX FIFO和接收中断标志)
3、由发送模式切换为接收模式后,就不能接收了
(初诊:没有及时清空TX FIFO,RX FIFO和接收中断标志)
4、设置高功率等级之后,就不能接收了
(初诊:供电电流不足)
5、无规律偶发不能接收
(初诊:存在电源干扰)
6、通信距离短,远距离容易丢包,
(初诊:硬件结构和PCB设计影响了天线净空区,造成了信号衰减)7、接收数据后,进入待机模式下,功耗比较大,达到了mA级
(初诊:CE脚没有被拉低)
8、一发多收的时候,存在丢包问题
(初诊:广播通信数量过多的情况下,需要设置更高的信道,适当调整发包间隔

SI24R1驱动程序:
SI24R1.c文件内容:
  1. #include "SI24R1.h"
  2. #include "delay.h"
  3. u8 TX_ADDRESS[TX_ADR_WIDTH] = {0x0A,0x01,0x07,0x0E,0x01};   

  4. /*SPI读写字节函数*/
  5. static u8 SPI_RW(u8 byte)
  6. {
  7.         u8 bit_ctr;
  8.         for(bit_ctr=0; bit_ctr<8; bit_ctr++) //轮询8位
  9.         {
  10.                 if(byte & 0x80) MOSI = 1; //判断如果最高位是高电平,输出高电平
  11.                 else MOSI = 0;                        //反之输出低电平                                                                                                
  12.                 byte = (byte << 1); //左移                    
  13.                 SCK = 1;            //SCK为高                           
  14.                 byte |= MISO;       //字节值按位或(相加)                     
  15.                 SCK = 0;            //SCK为低                  
  16.         }
  17.         return(byte);    //返回字节和                          
  18. }

  19. /*SPI IO初始化函数*/
  20. void SI24R1_Init(void)
  21. {
  22.         SCK = 0; //SCK(SPI)时钟引脚拉低                                                                                                         
  23.         CSN = 1;        //CSN片选引脚拉高               
  24.         CE         = 0; //CE脚拉低,待机准备状态                                
  25.         IRQ = 1; //中断引脚拉高,低电平有效
  26. }
  27. /*SPI写寄存器函数*/
  28. u8 SI24R1_Write_Reg(u8 reg, u8 value)
  29. {
  30.         u8 status;
  31.         CSN = 0; //CSN片选引脚拉低               
  32.         status = SPI_RW(reg);        //返回写的寄存器值                        
  33.         SPI_RW(value);//写值
  34.         CSN = 1; //CSN片选引脚拉高
  35.         return(status);
  36. }
  37. /*SPI写数据函数*/
  38. u8 SI24R1_Write_Buf(u8 reg, const u8 *pBuf, u8 bytes)
  39. {
  40.         u8 status,byte_ctr;
  41.   CSN = 0;  //CSN片选引脚拉低                                                            
  42.   status = SPI_RW(reg);//返回写的寄存器值                          
  43.   for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) //数据遍历写入   
  44.     SPI_RW(*pBuf++);
  45.   CSN = 1;  //CSN片选引脚拉高                                         
  46.   return(status);      
  47. }                                                                                                     
  48. /*SPI读寄存器函数*/
  49. u8 SI24R1_Read_Reg(u8 reg)
  50. {
  51.          u8 value;
  52.         CSN = 0;   
  53.         SPI_RW(reg);        
  54.         value = SPI_RW(0);//读寄存器值        
  55.         CSN = 1;              
  56.         return(value);
  57. }
  58. /*SPI读数据函数*/
  59. u8 SI24R1_Read_Buf(u8 reg, u8 *pBuf, u8 bytes)
  60. {
  61.         u8 status,byte_ctr;
  62.   CSN = 0;                                       
  63.   status = SPI_RW(reg);                           
  64.   for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  65.     pBuf[byte_ctr] = SPI_RW(0); //读数据内容                  
  66.   CSN = 1;                                       
  67.   return(status);   
  68. }
  69. /*设置接收模式*/
  70. void SI24R1_RX_Mode(void)
  71. {
  72.         CE = 0;
  73.         SI24R1_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);        
  74.         SI24R1_Write_Reg(WRITE_REG + EN_AA, 0x01);                                                               
  75.         SI24R1_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);                                                           
  76.         SI24R1_Write_Reg(WRITE_REG + RF_CH, 40);                                                                 
  77.         SI24R1_Write_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);                                                  
  78.         SI24R1_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);                                                            
  79.         SI24R1_Write_Reg(WRITE_REG + CONFIG, 0x0f);                                                      
  80.         SI24R1_Write_Reg(WRITE_REG + STATUS, 0xff);                                                                                                  
  81.         CE = 1;                                                                                                   
  82. }                                                
  83. /*设置发射模式*/
  84. void SI24R1_TX_Mode(void)
  85. {
  86.         CE = 0;
  87.         SI24R1_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    ·
  88.         SI24R1_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  
  89.         SI24R1_Write_Reg(WRITE_REG + EN_AA, 0x01);                                                                                               
  90.         SI24R1_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);                                                                                          
  91.         SI24R1_Write_Reg(WRITE_REG + SETUP_RETR, 0x0a);                                                                                          
  92.         SI24R1_Write_Reg(WRITE_REG + RF_CH, 40);                                                                                                
  93.         SI24R1_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);                                                                                            
  94.         SI24R1_Write_Reg(WRITE_REG + CONFIG, 0x0e);                                                                                             
  95. }
  96. /*收包函数*/
  97. u8 SI24R1_RxPacket(u8 *rxbuf)
  98. {
  99.         u8 state;
  100.         state = SI24R1_Read_Reg(STATUS);                                                        
  101.         SI24R1_Write_Reg(WRITE_REG+STATUS,state);              
  102.         if(state & RX_DR)                                                                                          
  103.         {
  104.                 SI24R1_Read_Buf(RD_RX_PLOAD,rxbuf,TX_PLOAD_WIDTH);     
  105.                 SI24R1_Write_Reg(FLUSH_RX,0xff);                                                      
  106.                 return 0;
  107.         }           
  108.         return 1;                                                   
  109. }

  110. /*发包函数*/
  111. u8 SI24R1_TxPacket(u8 *txbuf)
  112. {
  113.         u8 state;
  114.         CE=0;                                                                                                                                                                                                                  
  115.     SI24R1_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH);            
  116.          CE=1;                                                                                                                                                                                                                  
  117.         while(IRQ == 1);                                                                                                                                                                  
  118.         state = SI24R1_Read_Reg(STATUS);                                                                                                        
  119.         SI24R1_Write_Reg(WRITE_REG+STATUS, state);                                                                 
  120.         if(state&MAX_RT)                                                                                                                                                            
  121.         {
  122.                 SI24R1_Write_Reg(FLUSH_TX,0xff);                                                                                    
  123.                 return MAX_RT;
  124.         }
  125.         if(state&TX_DS)                                                                                                                                                              
  126.         {
  127.                 return TX_DS;
  128.         }
  129.         return 0xFF;                                                                                                                                                                                 
  130. }


  131. SI24R1.h头文件内容:
  132. #include "config.h"
  133. //SI24R1 PIN DEFINITION
  134. #define        MOSI      P13             // Master Out, Slave In pin (output)
  135. #define        MISO      P10             // Master In, Slave Out pin (input)
  136. #define        SCK       P12             // Serial Clock pin, (output)
  137. #define        CSN       P15             // Slave Select pin, (output to CSN)
  138. #define        CE        P14             // Chip Enable pin signal (output)
  139. #define        IRQ       P11             // Interrupt signal, from nRF24L01 (input)

  140. #define TX_ADR_WIDTH   5                                  // 5×Ö½Ú¿í¶ÈµÄ·¢ËÍ/½ÓÊÕµØÖ·
  141. #define TX_PLOAD_WIDTH 32                                  // Êý¾ÝͨµÀÓÐЧÊý¾Ý¿í¶È

  142. //********************************************************************************************************************//
  143. // SPI(SI24R1) commands
  144. #define READ_REG        0x00  // Define read command to register
  145. #define WRITE_REG       0x20  // Define write command to register
  146. #define RD_RX_PLOAD     0x61  // Define RX payload register address
  147. #define WR_TX_PLOAD     0xA0  // Define TX payload register address
  148. #define FLUSH_TX        0xE1  // Define flush TX register command
  149. #define FLUSH_RX        0xE2  // Define flush RX register command
  150. #define REUSE_TX_PL     0xE3  // Define reuse TX payload register command
  151. #define NOP             0xFF  // Define No Operation, might be used to read status register

  152. //********************************************************************************************************************//
  153. // SPI(SI24R1) registers(addresses)
  154. #define CONFIG          0x00  // 'Config' register address
  155. #define EN_AA           0x01  // 'Enable Auto Acknowledgment' register address
  156. #define EN_RXADDR       0x02  // 'Enabled RX addresses' register address
  157. #define SETUP_AW        0x03  // 'Setup address width' register address
  158. #define SETUP_RETR      0x04  // 'Setup Auto. Retrans' register address
  159. #define RF_CH           0x05  // 'RF channel' register address
  160. #define RF_SETUP        0x06  // 'RF setup' register address
  161. #define STATUS          0x07  // 'Status' register address
  162. #define OBSERVE_TX      0x08  // 'Observe TX' register address
  163. #define RSSI            0x09  // 'Received Signal Strength Indecator' register address
  164. #define RX_ADDR_P0      0x0A  // 'RX address pipe0' register address
  165. #define RX_ADDR_P1      0x0B  // 'RX address pipe1' register address
  166. #define RX_ADDR_P2      0x0C  // 'RX address pipe2' register address
  167. #define RX_ADDR_P3      0x0D  // 'RX address pipe3' register address
  168. #define RX_ADDR_P4      0x0E  // 'RX address pipe4' register address
  169. #define RX_ADDR_P5      0x0F  // 'RX address pipe5' register address
  170. #define TX_ADDR         0x10  // 'TX address' register address
  171. #define RX_PW_P0        0x11  // 'RX payload width, pipe0' register address
  172. #define RX_PW_P1        0x12  // 'RX payload width, pipe1' register address
  173. #define RX_PW_P2        0x13  // 'RX payload width, pipe2' register address
  174. #define RX_PW_P3        0x14  // 'RX payload width, pipe3' register address
  175. #define RX_PW_P4        0x15  // 'RX payload width, pipe4' register address
  176. #define RX_PW_P5        0x16  // 'RX payload width, pipe5' register address
  177. #define FIFO_STATUS     0x17  // 'FIFO Status Register' register address
  178. #define DYNPD           0x1C
  179. #define FEATURE         0x1D
  180. //********************************************************************************************************************//
  181. // STATUS Register
  182. #define RX_DR                                                0x40  /**/
  183. #define TX_DS                                                0x20
  184. #define MAX_RT                                          0x10

  185. //********************************************************************************************************************//
  186. //                                        FUNCTION's PROTOTYPES                                                       //
  187. //********************************************************************************************************************//
  188. //SI24R1 API Functions
  189. void SI24R1_Init(void); //SI24R1 Pin Init
  190. u8 SI24R1_Write_Reg(u8 reg, u8 value);
  191. u8 SI24R1_Write_Buf(u8 reg, const u8 *pBuf, u8 bytes);
  192. u8 SI24R1_Read_Reg(u8 reg);
  193. u8 SI24R1_Read_Buf(u8 reg, u8 *pBuf, u8 bytes);

  194. void SI24R1_RX_Mode(void);
  195. void SI24R1_TX_Mode(void);
  196. u8 SI24R1_RxPacket(u8 *rxbuf);
  197. u8 SI24R1_TxPacket(u8 *txbuf);
  198. #endif


  199. Main.c文件内容:
  200. #include "SI24R1.h"
  201. #include "delay.h"
  202. #include "string.h"
  203. #define LED3                P16
  204. #define LED4                P35
  205. #define KEY1                P12
  206. #define KEY2                P14
  207. unsigned char tx_data[32]={0};
  208. unsigned char rx_data[32]={0};
  209. #define FOSC    22118400L
  210. #define BAUD    115200//9600
  211. #define UART_RX_FIFO 32
  212. unsigned char UART_RX_Data[UART_RX_FIFO];
  213. /*串口函数初始化*/
  214. void uart_init(void)
  215. {
  216.         SCON = 0x50;
  217.         T2L = (65536 - (FOSC/4/BAUD));
  218.         T2H = (65536 - (FOSC/4/BAUD)) >> 8;
  219.         AUXR = 0x14;
  220.         AUXR |= 0x01;
  221.         ES = 1;
  222.         EA = 1;
  223. }
  224. /*串口发送字符函数*/
  225. void SendData(unsigned char Data)
  226. {
  227.         SBUF = Data;
  228.         while(TI == 0);
  229.         TI = 0;
  230. }
  231. /*串口发送字符串函数*/
  232. void SendString(char *s)
  233. {
  234.         while(*s)
  235.         {
  236.                 SendData(*s++);
  237.         }
  238. }
  239. /*串口接收字符函数*/
  240. void RecvData(unsigned char Data)
  241. {
  242.         unsigned int i;
  243.         for(i=0;i<UART_RX_FIFO;i++)
  244.         {
  245.          UART_RX_Data[i] = Data;
  246.         }
  247.         while(RI == 0);
  248.         RI = 0;
  249. }
  250. /*设置串口响应中断*/
  251. void UART_i() interrupt 4
  252. {
  253.         if(RI)
  254.         {
  255.                  RI = 0;
  256.                  RecvData(SBUF);
  257.         }
  258.         if(TI)
  259.         {
  260.                  TI = 0;
  261.         }
  262. }

  263. void main(void)
  264. {
  265.   unsigned char udata=0,rssi;
  266.   uart_init(); //串口初始化
  267.   SI24R1_Init();//2.4G SPI初始化
  268.   #if 0
  269.   SI24R1_TX_Mode(); //设置发射模式
  270.   #else
  271.   SI24R1_RX_Mode(); //设置接收模式
  272.   #endif
  273.         while(1)
  274.         {
  275.          #if 0
  276.          udata = SI24R1_TxPacket(tx_data);//发包
  277.          #else
  278.          udata = SI24R1_RxPacket(rx_data);//收包
  279.          rssi=SI24R1_Read_Reg(RSSI); //获取接收信号强度
  280.          if(rssi == 0)
  281.          {
  282.           SendString("<-60dBm\r\n");
  283.          }
  284.          else
  285.          {
  286.           SendString(">-60dBm\r\n");
  287.          }
  288.          #endif
  289.          delay_ms(50);         // Broadcasting interval
  290.          if(udata == 0xff)
  291.          {
  292.                  LED4=0;//SendString("send fail\r\n");
  293.                  LED3=0;
  294.                  SendString("send or recv fail\r\n");
  295.          }
  296.          else
  297.          {
  298.                  LED4=1;//SendString("send ok\r\n");
  299.                  LED3=1;
  300.                  SendString("send or recv ok\r\n");
  301.          }
  302.         }
  303. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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