久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4655|回復: 5
打印 上一主題 下一主題
收起左側

stm32配置SI4463 443M公共頻段通訊源碼

[復制鏈接]
跳轉到指定樓層
樓主
通過stm32 IO口模擬PSI通訊實現SI4463配置與使用


stm32單片機源程序如下:
  1. /*******************************************************
  2.   Copyright (C), 2016-10-15   liuzijian.All Rights Reserved
  3.   File name: Si4463.c
  4.   Author:    liuzijian   
  5.   Version:   V1.0.0      
  6.   Date:      2016-10-15
  7.   Description: IO simulation SPI, SI4463 initialization and communication
  8.                            SWD3 Software creates Si4463 configuration file(radio_config_Si4463.h)
  9.   Revision History:   
  10.      Version   Date          Author       Modification
  11.      V1.0.0    2016-10-15    liuzijain     初次編寫

  12. *********************************************************/

  13. #include "stm32f10x.h"
  14. #include "Si4463.h"
  15. #include "radio_config_Si4463.h"
  16. #include "user_subfunction.h"
  17. #include <stdio.h>

  18. const u8 set[1000] = RADIO_CONFIGURATION_DATA_ARRAY;
  19. #define s46_BUFF_LEN    1                                           // 數據長度設置
  20. u8 s46_Send_Buff[s46_BUFF_LEN]={0};                                     // 發送數據緩沖數組
  21. u8 s46_Rece_Buff[s46_BUFF_LEN]={0};                              // 接收數據緩沖數組
  22. /*
  23. // 函數: SPIGPIO_Config()
  24. // 描述: 配置SPI模擬的輸入輸出端口
  25. // 配置IO模擬SPI
  26. // RF4463_IRQ--PC8輸入  GPIO1--PB15輸入   SDN--PB12輸出   NSEL--PC6輸出  SCLK--PB14輸出   SDO--PC7輸入   SDI--PB13輸出  */
  27. void SPIGPIO_Config(void)
  28. {        //輸出
  29.     GPIO_InitTypeDef   GPIO_InitStructure;
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  34.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  35.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  38.         //輸入
  39.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  41.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  43.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  45.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  46.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  47. }


  48. /*****************************************************************************
  49. 函數: s46_SPI_WR_Byte()
  50. 描述: 通過SPI寫一個byte到Si4463,同時從寄存器讀取一個Byte
  51. 參數: byte   待寫入字節數據
  52.       return 讀取到的字節數據                 
  53. ******************************************************************************/
  54. uint8 s46_SPI_WR_Byte(uint8 byte)
  55. {
  56.     uint8 i;
  57.     for(i=0; i<8; i++)
  58.     {// 循環8次
  59.             if((byte & 0x80) == 0x80)
  60.                 {SDI_SET;}         // 將byte最高位輸出到SDI
  61.                 else
  62.                 {SDI_CLR;}           
  63.         byte <<= 1;                          // 低一位移位到最高位
  64.         SCLK_SET;
  65.                 delay4us(10);                           // 拉高SLCK,從SI讀入1位數據,同時Si4463從SO輸出1位數據
  66.         // byte |= SDO;                                                    // 讀SDO到byte最低位      
  67.                 if(SDO==1){byte |= 0x01;}
  68.                 else{byte |= 0x00;}                    
  69.         SCLK_CLR;
  70.                 delay4us(10);                             // SCLK置低
  71.     }
  72.     return(byte);                                   // 返回讀取的1Byte數據
  73. }

  74. /***********************************************************************
  75. 函數: s46_SPI_W_CMD()
  76. 描述: 向芯片中寫入指令
  77. 參數: cmd    指令字
  78.        plen   寫入參數數量(寫入屬性時最多為12個參數)
  79.        *p     寫入參數存放地址
  80.        loopcts 0=忽略CTS檢測; 1=檢測CTS        
  81. *****************************************************************************/
  82. void s46_SPI_W_CMD(uint8 cmd, uint16 plen, uint8 *p, uint8 loopcts)
  83. {
  84.     uint8 i=0;

  85.     if(loopcts == 1){while(GPIO1 == 0);}            // 等待CTS為高(執行完成)

  86.     NSEL_CLR;                                       // nSEL置低,開始數據傳輸過程
  87.     s46_SPI_WR_Byte(cmd);                           // 寫入指令字
  88.     for(i=0; i<plen; i++)
  89.         {        s46_SPI_WR_Byte(p[i]);                      // 寫入后續數據
  90.     }
  91.     NSEL_SET;                                       // nSEL置高,結束數據傳輸過程
  92. }

  93. /*************************************************************
  94. 函數: s46_SPI_R_CMD()
  95. 描述: 從芯片中讀取指令響應
  96. 參數: cmd    指令字
  97.       plen   讀取響應數量(讀取屬性時最多為16個參數)
  98.       *p     讀取響應存放地址
  99.       loopcts 0=忽略CTS檢測; 1=檢測CTS
  100.       return CTS響應值  
  101. ******************************************************************/
  102. uint8 s46_SPI_R_CMD(uint8 cmd, uint8 len, uint8 *p, uint8 loopcts)
  103. {
  104.     uint8 i=0;
  105.         //uint8_t cts=0;

  106.     if(loopcts == 1){while(GPIO1 == 0);}            // 等待CTS為高(執行完成)

  107.     NSEL_CLR;                                       // nSEL置低,開始數據傳輸過程
  108.         s46_SPI_WR_Byte(cmd);                                                        // 寫入指令字
  109.     for(i=0; i<=len; i++)
  110.         {        p[i] = s46_SPI_WR_Byte(0);                  // 讀取寄存器數值
  111.     }
  112.     NSEL_SET;                                       // nSEL置高,結束數據傳輸過程
  113.     return(p[0]);                                   // 返回CTS
  114. }

  115. /******************************************************************************
  116. 函數: s46_Power_ON_Reset()
  117. 描述: 芯片上電后的復位
  118. 參數: 無                 
  119. ******************************************************************************/
  120. void s46_Power_ON_Reset(void)
  121. {         
  122.     uint8 buff[7] = {RF_POWER_UP};

  123.     NSEL_SET;
  124.     SDI_CLR;
  125.     SCLK_CLR;   
  126.                                                       
  127.     SDN_SET;                                                         // SDN=1=進入掉電模式
  128.     delayms(1);                                                      // 等待1ms
  129.     SDN_CLR;                                                         // SDN=0=進入上電模式
  130.     while(GPIO1 == 0);                                               // 等待CTS為高,上電成功
  131.     s46_SPI_W_CMD(buff[0], 6, &buff[1], 1);                          // 寫入POR指令及配置數據

  132.         
  133. }

  134. /*********************************************************************
  135. 函數: s46_Load_Radio_Config()
  136. 描述: 將WDS生成的配置列表寫入芯片中
  137. 參數: none
  138. ************************************************************************/
  139. void s46_Load_Radio_Config(void)
  140. {
  141.    
  142.     uint16 i = 0;
  143.     i = set[i] + 1;                                                 // 跳過POR配置數據
  144.     do                                                                                   
  145.         {        s46_SPI_W_CMD(set[i+1], set[i]-1,(uint8 *)&set[i+2], 0);            // 寫入配置列表中的數據
  146.         i = i + set[i] + 1;                                         // 指向下一組數據
  147.     }while (set[i] != 0x00);                                        // 空值(len=0x00)結束
  148. }

  149. /**************************************************
  150. 函數: s46_Clear_Interrupt_Status()
  151. 描述: 清除全部中斷,并返回數據包處理器中斷狀態
  152. 參數: 無           
  153. *****************************************************/
  154. uint8 s46_Clear_Interrupt_Status(void)
  155. {
  156.     uint8 buff[9];

  157.     buff[0] = 0; buff[1] = 0; buff[2] = 0;

  158.     s46_SPI_W_CMD(s46CMD_GET_INT_STATUS_B0_CMD, 3, buff, 1);        // 寫入返回中斷狀態指令
  159.     s46_SPI_R_CMD(s46CMD_READ_CMD_BUFF_B0_CMD, 9, buff, 1);         // 讀取CTS和指令響應

  160.     return(buff[s46RIN_GET_INT_STATUS_B3_PH_PEND]);                 // 返回數據包處理器中斷狀態
  161. }

  162. /********************************************************************
  163. 函數: s46_Send_Packet()
  164. 描述: 發送數據包
  165. 參數: *p     發送數據的首地址  
  166. ************************************************************************/
  167. void s46_Send_Packet(uint8 *p)
  168. {
  169.     uint8 buff[8];

  170.     s46_Clear_Interrupt_Status();                                   // 清除全部中斷
  171.     while(RF4463_IRQ != 1);                                         // 等待nIRQ為高(中斷已清除)
  172.    
  173.     s46_SPI_W_CMD(s46CMD_WRITE_TX_FIFO_B0_CMD, s46_BUFF_LEN, p, 0); // 將待發送數據寫入TX_FIFO

  174.     buff[0] = s46PRT_INT_CTL_PH_ENABLE_GROUP;                       // 屬性分組=包處理器中斷使能
  175.     buff[1] = 1;                                                    // 屬性數量=1
  176.     buff[2] = s46PRT_INT_CTL_PH_ENABLE_INDEX;                       // 起始地址=PH_ENABLE
  177.     buff[3] = s46PFS_INT_CTL_PH_ENABLE_PACKET_SENT_EN;              // 使能PACKET_SENT中斷
  178.     s46_SPI_W_CMD(s46CMD_SET_PROPERTY_B0_CMD, 4, buff, 1);          // 寫入包處理器中斷使能屬性

  179.     buff[0] = RADIO_CONFIGURATION_DATA_CHANNEL_NUMBER;              // CHANNEL
  180.     buff[1] = s46RFP_START_TX_B2_NOCHANGE                           // 發送結束后進入READY狀態
  181.             | s46RFP_START_TX_B2_USE                                // 更新參數并進入TX模式
  182.             | s46RFP_START_TX_B2_TRANSMIT_FIFO                      // 發送FIFO中的數據(下溢時產生中斷)
  183.             | s46RFP_START_TX_B2_IMMEDIATE;                         // 立即發送
  184.     buff[2] = (uint8)(s46_BUFF_LEN >> 8);                           // TX_LEN bit12:8
  185.     buff[3] = (uint8)(s46_BUFF_LEN);                                // TX_LEN bit7:0
  186.     buff[4] = 0;                                                    // 數據包之間的間隔時間
  187.     buff[5] = 0;                                                    // 數據包重復次數
  188.     s46_SPI_W_CMD(s46CMD_START_TX_B0_CMD, 6, buff, 1);              // 啟動發送

  189.     while(RF4463_IRQ != 0);                                       // 等待nIRQ為低(執行完成)
  190.     s46_Clear_Interrupt_Status();                                   // 清除全部中斷
  191.     s46_Start_RX();                                                 // 返回RX狀態
  192. }


  193. /******************************************************************************
  194. 函數: s46_Start_RX()
  195. 描述: 進入接收狀態
  196. 參數: 無
  197. ******************************************************************************/
  198. void s46_Start_RX(void)
  199. {
  200.     uint8 buff[7];
  201.    
  202.     s46_Clear_Interrupt_Status();                                   // 清除全部中斷

  203.     buff[0] = s46CFP_CHANGE_STATE_B1_READY;                         // 進入READY模式
  204.     s46_SPI_W_CMD(s46CMD_CHANGE_STATE_B0_CMD, 1, buff, 1);          // 發送指令

  205.     buff[0] = s46PRT_INT_CTL_PH_ENABLE_GROUP;                       // 屬性分組=包處理器中斷使能
  206.     buff[1] = 1;                                                    // 屬性數量=1
  207.     buff[2] = s46PRT_INT_CTL_PH_ENABLE_INDEX;                       // 起始地址=PH_ENABLE
  208.     buff[3] = s46PFS_INT_CTL_PH_ENABLE_PACKET_RX_EN                 // 使能PACKET_RX中斷
  209.             | s46PFS_INT_CTL_PH_ENABLE_CRC_ERROR_EN;                // 使能CRC_ERROR中斷
  210.     s46_SPI_W_CMD(s46CMD_SET_PROPERTY_B0_CMD, 4, buff, 1);          // 寫入包處理器中斷使能屬性

  211.     buff[0] = RADIO_CONFIGURATION_DATA_CHANNEL_NUMBER;              // CHANNEL
  212.     buff[1] = s46RFP_START_RX_B2_USE                                // 更新參數并進入RX模式
  213.             | s46CFP_START_RX_B2_IMMEDIATE;                         // 立即接收
  214.     buff[2] = (uint8)(s46_BUFF_LEN >> 8);                           // RX_LEN bit12:8
  215.     buff[3] = (uint8)(s46_BUFF_LEN);                                // TX_LEN bit7:0
  216.     buff[4] = s46CFP_START_RX_B5B7_NO_CHANGE;                       // 前導檢測超時時自動進入的狀態                           
  217.     buff[5] = s46CFP_START_RX_B5B7_READY;                           // 接收到有效數據包時自動進入的狀態
  218.     buff[6] = s46CFP_START_RX_B5B7_READY;                           // 接收到無效數據包時自動進入的狀態
  219.     s46_SPI_W_CMD(s46CMD_START_RX_B0_CMD, 7, buff, 1);              // 啟動接收
  220. }


  221. /*******************************************************************************
  222. 函數: uint8 s46_RX_Check(uint8 *p)
  223. 描述: 檢測接收狀態
  224. 參數: *p     接收數據存放地址
  225.       return 接收完成標志(0=無接收, 1=接收到有效數據)
  226. *******************************************************************************/
  227. uint8 s46_RX_Check(uint8 *p)
  228. {
  229.     uint8 t=0;
  230.     uint8 buff[3];
  231.     uint8 r=0;

  232.     if(RF4463_IRQ == 0)
  233.         {
  234.         t = s46_Clear_Interrupt_Status();                                   // 清除全部中斷,并返回數據包處理器中斷狀態
  235.         if(t & s46RFP_GET_INT_STATUS_B4_PACKET_RX){                         // 檢查是否為數據包接收完成中斷
  236.             s46_SPI_R_CMD(s46CMD_READ_RX_FIFO_B0_CMD, s46_BUFF_LEN, p, 0);  // 讀取RX_FIFO中的數據
  237.             r = 1;                                                          // 檢測到有效數據包                                          
  238. ……………………

  239. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
stm32-si4463.rar (11.62 KB, 下載次數: 104)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:365446 發表于 2019-1-7 16:26 | 只看該作者
謝謝分享,正需要,下載學習
回復

使用道具 舉報

板凳
ID:443880 發表于 2019-1-8 10:55 | 只看該作者

謝謝分享
回復

使用道具 舉報

地板
ID:268693 發表于 2019-3-16 11:43 | 只看該作者
謝謝分享!謝謝!
回復

使用道具 舉報

5#
ID:52630 發表于 2019-3-28 11:36 | 只看該作者
謝謝,SI4463這模塊挺難搞的,非常感謝
回復

使用道具 舉報

6#
ID:1023716 發表于 2023-2-3 12:49 | 只看該作者
雖然是stm32的應用程序,但設計思路應該也適用STM8S,謝謝樓主的分享。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 看片地址 | 亚州精品天堂中文字幕 | 日韩在线观看一区二区三区 | 免费视频一区二区 | 久久久亚洲一区 | 天天玩天天干天天操 | 国产亚洲一区二区三区 | a黄视频 | 日韩精品成人一区二区三区视频 | 久久久女女女女999久久 | 久久黄色网 | 久久久久91 | 亚洲一区二区三区视频 | 人妖av| 亚洲国产视频一区 | 日本福利视频 | 亚洲一区二区精品视频 | 国产成人福利在线观看 | 91福利影院 | 国产一区二区三区免费视频 | 成人久久视频 | 精区3d动漫一品二品精区 | 欧美一区二区小视频 | 日本在线小视频 | 日本精品视频一区二区 | 香蕉二区 | 色综合一区二区 | 蜜桃精品噜噜噜成人av | 婷婷福利视频导航 | 精品中文字幕一区二区 | 欧美在线国产精品 | 一区二区三区国产 | 精彩视频一区二区三区 | 久久伊| 亚洲欧美日韩在线 | 色综合久 | 亚洲成av人片在线观看 | 欧美三级视频在线观看 | 成人精品在线观看 | 一区不卡在线观看 | 欧美 日韩 国产 成人 在线 91 |