[活动专区] 【AT32-START-407测评】+无线通信模块SI24R1测试

[复制链接]
 楼主| 怀揣少年梦 发表于 2021-2-24 16:56 | 显示全部楼层 |阅读模式
本帖最后由 怀揣少年梦 于 2021-3-10 19:45 编辑

一、背景:因之前在搞小四轴,一直卡在无线模块,后来买了两个模块来测试自己的程序,是否是正确的。正好此时申请到AT32开发板,过年一直在测试。现发出来给大家参考或者指教一下。
二、模块是安信可的2.4GHz si24r1无线通信模块。
三、测试过程:用户按键按一下,实现发送与接收。开机第一次能正常收发,第二次再按就只会产生发送完成中断。再按就产生重发次数中断。断电再按键就会收发成功。过了几天才发现问题,原来没有清理状态寄存器里的status.清理就可以了。 SI24R1.png
四、程序:
1)主程序
上传不了。会乱码
2)中断程序
  1. void EXTI9_5_IRQHandler(void)
  2. {
  3.         u8 state;
  4.         if(EXTI_GetFlagStatus(EXTI_Line9) != RESET)
  5.         {
  6.                 EXTI_ClearIntPendingBit(EXTI_Line9);
  7.                 SI24R1_CE_Low;
  8.                 state = SI24R1_Read_Reg(R_REGISTER+STATUS);
  9.                 /* 发送完成中断*/
  10.                 if(state & TX_DS)
  11.                 {
  12.                         TX_Flag=true;
  13.                         SI24R1_Set_Mode(IT_RX);
  14.                         SI24R1_Write_Reg(R_REGISTER+STATUS,TX_DS);
  15.                         SI24R1_Write_Reg(FLUSH_TX,0xff);        
3)配置程序(两个模块配置一模一样,只是用的SPI不一样)
  1. #include "si24r1.h"
  2. #include "systick.h"
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #define SI24R1AddrMAX 50                                                //SI24R1最后一个字节地址最大为50
  6. u8 SI24R1addr = 0xFF;                                                                        //初始化SI24R1最后一个字节地址
  7. u8 SI24R1_TX_DATA[TX_PAYLO_WIDTH]={0}        ;        //SI24R1发送缓冲区
  8. u8 SI24R1_RX_DATA[RX_PAYLO_WIDTH]={0}        ;        //SI24R1接收缓冲区

  9. u8 TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//发送地址
  10. u8 RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址

  11. /****************************************************************************
  12. * 名        称:void SI24R1_Init(void)        
  13. * 功        能:SI24R1初始化及检查通信
  14. * 入口参数:无
  15. * 出口参数:无
  16. * 说        明:SI24R1spi最大速度不超过10Mbps
  17. ****************************************************************************/
  18. void SI24R1_Init(void)
  19. {
  20.         SI24R1_GPIO_Init();        //初始化管脚
  21.         SI24R1_SPI_Init();        //                初始化SPI2
  22.         SI24R1_CSN_High;                        //片选信号失能
  23.         
  24.         SI24R1_CE_Low;                                //待机模式
  25.         
  26. }

  27. /****************************************************************************
  28. * 名        称:void SI24R1_GPIO_Init(void)        
  29. * 功        能:配置在SI24R1与stm32间spi通信的引脚及控制SI24R1的引脚
  30. * 入口参数:无
  31. * 出口参数:无
  32. * 说        明:SI24R1spi最大速度不超过10Mbps
  33. ****************************************************************************/
  34. void SI24R1_GPIO_Init(void)
  35. {
  36.         GPIO_InitType GPIO_InitStructure;
  37.         
  38.         RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB | RCC_APB2PERIPH_GPIOD |RCC_APB2PERIPH_AFIO,ENABLE);
  39.         
  40.         //PB13 SCLK;PB14 MISO  ;PB15  MOSI
  41.         GPIO_InitStructure.GPIO_Pins = GPIO_Pins_13 | GPIO_Pins_14 | GPIO_Pins_15;
  42.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  43.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;                                                                                                //si24r1 最大读写速度为10M
  44.   GPIO_Init(GPIOB,&GPIO_InitStructure);

  45.   //CSN 片选管脚
  46.         GPIO_InitStructure.GPIO_Pins = GPIO_Pins_12;
  47.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  48.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;                                                                                                //si24r1 最大读写速度为10M
  49.   GPIO_Init(GPIOB,&GPIO_InitStructure);
  50.   GPIO_ResetBits(GPIOB,GPIO_Pins_12);
  51.   //CE 使能管脚
  52.         GPIO_InitStructure.GPIO_Pins = GPIO_Pins_8;
  53.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  54.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;                                                                                                
  55.   GPIO_Init(GPIOD,&GPIO_InitStructure);         
  56.         GPIO_ResetBits(GPIOD,GPIO_Pins_8);
  57.         

  58. }

  59. /****************************************************************************
  60. * 名        称:void SI24R1_SPI_Init(void)        
  61. * 功        能:配置在SI24R1与stm32间spi通信的初始化
  62. * 入口参数:无
  63. * 出口参数:无
  64. * 说        明:SI24R1spi最大速度不超过10Mbps
  65. ****************************************************************************/
  66. void SI24R1_SPI_Init(void)
  67. {

  68.         SPI_InitType SPI_InitStructure;
  69.         
  70.         RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_SPI2,ENABLE);
  71.         
  72.         //配置SPI1相关参数:全双工通信、MSB/LSB、通信速度、工作模式(mode0~mode3)......
  73.         SPI_InitStructure.SPI_TransMode = SPI_TRANSMODE_FULLDUPLEX;                //全双工通信
  74.         SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;                                                                                                        //主机角色
  75.         SPI_InitStructure.SPI_FrameSize =SPI_FRAMESIZE_8BIT;                                 //看时序图,8位数据位
  76.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_LOW;                                                                                                                //时钟线空闲的时候是什么电平,当前配置为低电平
  77.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1EDGE;                          //主机在时钟线哪一个时刻读取MISO引脚的电平,在时钟第一个边沿来采集数据
  78.         SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;                                                                                                                        //片选需要代码控制
  79.         SPI_InitStructure.SPI_MCLKP = SPI_MCLKP_32;                //SPI1的通信硬件时钟=72MHz/8=9MHz    SI24R1最大为10M
  80.         SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;                                                                                //最高有效位优先传输
  81.         SPI_InitStructure.SPI_CPOLY = 7;
  82.         SPI_Init(SPI2,&SPI_InitStructure);
  83.         
  84.         
  85.         SPI_Enable(SPI2,ENABLE);

  86. }

  87. /****************************************************************************
  88. * 名        称:u8 SPI2_WriteReadByte(u8 Data)        
  89. * 功        能:SPI2读写一个字节
  90. * 入口参数:无
  91. * 出口参数:无
  92. * 说        明:无
  93. ****************************************************************************/
  94. u8 SPI2_WriteReadByte(u8 Data)
  95. {
  96.         u8 cnt = 0;
  97.         while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TE) == RESET)        //等待发送区为空
  98.         {
  99.                 cnt++;
  100.                 if( cnt > 100)
  101.                         return 0;
  102.                
  103.         }
  104.         
  105.         SPI_I2S_TxData(SPI2,Data);                                                                                                                                        //发送一个字节的数据
  106.         cnt = 0;
  107.         while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RNE) == RESET)        //等待接收完一个Byte
  108.         {        
  109.                 cnt++;
  110.                 if( cnt > 100)
  111.                         return 0;
  112.         }
  113.         return SPI_I2S_RxData(SPI2);                                                                                                //接收一个字节的数据
  114.         
  115. }

  116. /****************************************************************************
  117. * 名        称:u8 SI24R1_Write_Reg(u8 reg,u8 val)        
  118. * 功        能:对SI24R1写一个字节到寄存器
  119. * 入口参数:无
  120. * 出口参数:无
  121. * 说        明:无
  122. ****************************************************************************/
  123. u8 SI24R1_Write_Reg(u8 reg,u8 val)
  124. {
  125.         u8 ReceiveData;
  126.         
  127.         SI24R1_CSN_Low;
  128.         
  129.         ReceiveData = SPI2_WriteReadByte(reg);
  130.         SPI2_WriteReadByte(val);
  131.         
  132.         SI24R1_CSN_High;
  133.         
  134.         return ReceiveData;
  135. }

  136. /****************************************************************************
  137. * 名        称:u8 SI24R1_Read_Reg(u8 reg,u8 val)        
  138. * 功        能:对SI24R1读寄存器的值
  139. * 入口参数:无
  140. * 出口参数:无
  141. * 说        明:无
  142. ****************************************************************************/
  143. u8 SI24R1_Read_Reg(u8 reg)
  144. {
  145.         u8 RegData;
  146.         
  147.         SI24R1_CSN_Low;
  148.         
  149.         SPI2_WriteReadByte(reg);
  150.         RegData = SPI2_WriteReadByte(0xff);
  151.         
  152.         SI24R1_CSN_High;
  153.         
  154.         return RegData;
  155. }

  156. /****************************************************************************
  157. * 名        称:u8 SI24R1_Write_Buffer(u8 reg,u8 *pBuf,u8 len)        
  158. * 功        能:向某一个寄存器写入一组数据
  159. * 入口参数                reg                寄存器地址
  160.                                                 pBuf        写入的数据地址   
  161.                                                 len   数据长度
  162. * 出口参数:ReceiveData
  163. * 说        明:无
  164. ****************************************************************************/
  165. u8 SI24R1_Write_Buffer(u8 reg,u8 *pBuf,u8 len)
  166. {
  167.         u8 ReceiveData;
  168.         int i=0;
  169.         
  170.         SI24R1_CSN_Low;
  171.         
  172.         ReceiveData = SPI2_WriteReadByte(reg);
  173.         
  174.         for(i= 0;i < len;i++)
  175.         {
  176.                 SPI2_WriteReadByte(*pBuf);
  177.                 pBuf++;
  178.         }
  179.         SI24R1_CSN_High;
  180.         
  181.         return ReceiveData;
  182. }


  183. /****************************************************************************
  184. * 名        称:u8 SI24R1_Read_Buffer(u8 reg,u8 *pBuf,u8 len)        
  185. * 功        能:向某一个寄存器读出一组数据
  186. * 入口参数                reg                寄存器地址
  187.                                                 pBuf        写入的数据地址   
  188.                                                 len   数据长度
  189. * 出口参数:ReceiveData
  190. * 说        明:无
  191. ****************************************************************************/
  192. u8 SI24R1_Read_Buffer(u8 reg,u8 *pBuf,u8 len)
  193. {
  194.         u8 status;
  195.         int i;
  196.         
  197.         SI24R1_CSN_Low;
  198.         
  199.         status = SPI2_WriteReadByte(reg);
  200.         
  201.         for(i= 0;i < len;i++)
  202.         {
  203.                 *pBuf = SPI2_WriteReadByte(0xff);
  204.                 pBuf++;
  205.         }
  206.         SI24R1_CSN_High;
  207.         
  208.         return status;
  209. }
  210. /****************************************************************************
  211. * 名        称:void SI24R1__Set_Mode(u8 mode)        
  212. * 功        能:设置SI24R1发送还是接收模式
  213. * 入口参数                mode                模式设置
  214. * 出口参数:无
  215. * 说        明:无
  216. ****************************************************************************/
  217. void SI24R1_Set_Mode(u8 mode)
  218. {
  219.         if(mode == IT_TX)
  220.         {
  221.                 SI24R1_CE_Low;
  222.                 SI24R1_Write_Reg(W_REGISTER+CONFIG,IT_TX);
  223.                 SI24R1_Write_Reg(W_REGISTER+STATUS,0x7E);                //关闭所有中断,防止一进入发送模式就中断
  224.                
  225.                 SI24R1_CE_High;
  226. //                delay_us(20);
  227.         }
  228.         else
  229.         {
  230.                 SI24R1_CE_Low;
  231.                 SI24R1_Write_Reg(W_REGISTER+CONFIG,IT_RX);
  232.                 SI24R1_Write_Reg(W_REGISTER+STATUS,0x7E);                //关闭所有中断,防止一进入接收模式中断
  233.                
  234.                 SI24R1_CE_High;
  235.                 delay_us(200);
  236.         }
  237. }


  238. /****************************************************************************
  239. * 名        称:SI24R1_Config(void)        
  240. * 功        能:SI24R1基本参数配置,并初始化为发射模式
  241. * 入口参数        :无
  242. * 出口参数:无
  243. * 说        明:无
  244. ****************************************************************************/
  245. void SI24R1_Config(void)
  246. {
  247.         SI24R1_CE_Low;
  248.         
  249. //接收模式的配置               
  250.         SI24R1_Write_Reg(W_REGISTER + SETUP_AW,0x03);                               //配置通信地址长度,默认值时0x03,即5字节        
  251.   SI24R1_Write_Buffer(W_REGISTER + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
  252.         SI24R1_Write_Buffer(W_REGISTER + RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);  //设置RX节点地址
  253.   SI24R1_Write_Reg(W_REGISTER + EN_AA,0x01);                                        //使能通道0自动应答
  254.         SI24R1_Write_Reg(W_REGISTER + EN_RXADDR,0x01);                              //使能通道0的接收地址
  255.         SI24R1_Write_Reg(W_REGISTER + SETUP_RETR,0x1A);
  256.         SI24R1_Write_Reg(W_REGISTER + RF_CH,40);                                           //设置RF通道为40Hz
  257.         SI24R1_Write_Reg(W_REGISTER + RX_PW_P0,TX_PAYLO_WIDTH);                                                                                  //设置接收管道字节数为32字节
  258.         SI24R1_Write_Reg(W_REGISTER + RF_SETUP,0x0e);                                            //设置TX发射参数,7db增益,2Mbps,低噪声增益关闭
  259.         SI24R1_Set_Mode(IT_RX);                                                                                                                                                                                                                        //默认为接收模式                                                                                                                                                                                                        
  260.         
  261. //发送模式的配置
  262.         
  263. //        SI24R1_Write_Reg(W_REGISTER + SETUP_AW,0x03);                               //配置通信地址长度,默认值时0x03,即5字节
  264. //        SI24R1_Write_Buffer(W_REGISTER + TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);     //写TX节点地址(发送地址)
  265. //        SI24R1_Write_Buffer(W_REGISTER + RX_ADDR_P0,(u8*)TX_ADDRESS,TX_ADR_WIDTH);  //设置RX节点地址(为了应答接收设备,接收通道0和发送地址相同)
  266. //        
  267. //        SI24R1_Write_Reg(W_REGISTER + EN_AA,0x01);                                        //使能通道0自动应答
  268. //        SI24R1_Write_Reg(W_REGISTER + EN_RXADDR,0x01);                              //使能通道0的接收地址
  269. //        SI24R1_Write_Reg(W_REGISTER + SETUP_RETR,0x1A);                                                                                                                //设置自动重发延时为500us,最大自动重发次数为10
  270. //        SI24R1_Write_Reg(W_REGISTER + RF_CH,40);                                                                                                                                                //设置RF通道为40Hz
  271. //        SI24R1_Write_Reg(W_REGISTER + RF_SETUP,0x27);                                            //设置TX发射参数,7db增益,2Mbps,低噪声增益关闭
  272. //        SI24R1_Set_Mode(IT_TX);                                                                                                                                                                                                                        //默认为发射模式                        
  273.         SI24R1_CE_High;                        
  274.         delay_us(20);
  275. }


  276. /****************************************************************************
  277. * 名        称:void SI24R1_TxPacket(u8 *txbuf)        
  278. * 功        能:SI24R1发送一包数据
  279. * 入口参数        :txbuf 要发送的数据地址
  280. * 出口参数:无
  281. * 说        明:无
  282. ****************************************************************************/
  283. void SI24R1_TxPacket(u8 *txbuf)
  284. {

  285.         
  286.         SI24R1_Config();
  287.         SI24R1_CE_Low;
  288.         SI24R1_Write_Buffer(W_REGISTER + TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);     //写TX节点地址
  289.         SI24R1_Write_Buffer(W_REGISTER + RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);  //写RX节点地址
  290.         SI24R1_Write_Reg(FLUSH_TX ,0xFF);        
  291.         SI24R1_Write_Buffer(W_TX_PAYLOAD,txbuf,TX_PAYLO_WIDTH);                                                         //写数据到TX_BUFF
  292.         SI24R1_Write_Reg(W_REGISTER + CONFIG,IT_TX);                                                                                                                                //设置为发送模式,开启所有中断        
  293.         SI24R1_Write_Reg(W_REGISTER + STATUS,0x7E);                                                                                                                                //清除所有中断,防止一进去发送模式就触发中断
  294.   
  295.         SI24R1_CE_High;
  296.         delay_us(10);
  297.         
  298. }



  299. /****************************************************************************
  300. * 名        称:void SI24R1_RxPacket(u8 *txbuf)        
  301. * 功        能:SI24R1接收一包数据
  302. * 入口参数        :rxbuf 要接收的数据地址
  303. * 出口参数:无
  304. * 说        明:无
  305. ****************************************************************************/
  306. void SI24R1_RxPacket(u8 *rxbuf)
  307. {
  308.         SI24R1_CE_Low;
  309.         
  310.         SI24R1_Read_Buffer(R_RX_PAYLOAD,rxbuf,TX_PAYLO_WIDTH);                                                                                  //读取RX的有效数据
  311.         SI24R1_Write_Reg(FLUSH_RX ,0xFF);                                                                                                                                                                                //清除RX_FIFO

  312.         SI24R1_CE_High;
  313. }

  314. /****************************************************************************
  315. * 名        称:u8 SPI_Test_Connection(void)
  316. * 功        能:测试SPI是否与MCU正常通信
  317. * 入口参数        :无
  318. * 出口参数:无
  319. * 说        明:无
  320. ****************************************************************************/
  321. u8 SPI2_Test_Connection(void)
  322. {
  323.         u8 test_txbuf[5] = {0xC0,0xC1,0xC2,0xC3,0xC4};
  324.         u8 test_rxbuf[5] = {0};
  325.         u8 i;
  326.         SI24R1_Write_Buffer(W_REGISTER + TX_ADDR,test_txbuf,5);                //        写入5个字节的数据
  327.         SI24R1_Read_Buffer(TX_ADDR,test_rxbuf,5);                                                                        //  读出写入的数据
  328.         for(i=0;i< 5; i++)
  329.         {
  330. //                printf("SI24R1 test_rxbuf[%d]=%x\r\n",i,test_rxbuf[i]);
  331.                 if(test_rxbuf[i] != test_txbuf[i])
  332.                 {
  333.                         break;
  334.                 }
  335.         }
  336.         if(i != 5 )
  337.         {
  338.                 return 0;                        //        SPI与MCU通信有误
  339.         }
  340.         return 1;       //正常通信
  341. }

  342. /****************************************************************************
  343. * 名        称:void SI24R1_Check(void)
  344. * 功        能:测试MCU与SI24R1是否连接
  345. * 入口参数        :无
  346. * 出口参数:无
  347. * 说        明:无
  348. ****************************************************************************/
  349. void SI24R1_Check(void)
  350. {
  351.         while(!SPI2_Test_Connection())
  352.         {
  353.                 printf("\r SI24R1 has no connection with MCU! \r\n");
  354.         }
  355.         if(SPI2_Test_Connection())
  356.                 printf("\r SI24R1 has connections with MCU! \r\n");
  357. }


  358. /****************************************************************************
  359. * 名        称:u8 SI24R1_Test_Connection(void)
  360. * 功        能:测试飞控SI24R1和遥控SI24R1是否正常通信
  361. * 入口参数        :无
  362. * 出口参数:无
  363. * 说        明:无
  364. ****************************************************************************/
  365. void SI24R1_Test_Connection(void)
  366. {
  367.         u8 i=0;
  368.          for(i = 0; i < 32;i++)
  369.         {
  370.                 SI24R1_TX_DATA[0] = 1;
  371.         }
  372.         SI24R1_TxPacket(SI24R1_TX_DATA);        
  373. }




谢谢大家指教



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

本版积分规则

个人签名:一切皆有可能

45

主题

473

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:一切皆有可能

45

主题

473

帖子

3

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