通過stm32 IO口模擬PSI通訊實現SI4463配置與使用
0.png (41.99 KB, 下載次數: 56)
下載附件
2018-5-31 17:57 上傳
stm32單片機源程序如下:
- /*******************************************************
- Copyright (C), 2016-10-15 liuzijian.All Rights Reserved
- File name: Si4463.c
- Author: liuzijian
- Version: V1.0.0
- Date: 2016-10-15
- Description: IO simulation SPI, SI4463 initialization and communication
- SWD3 Software creates Si4463 configuration file(radio_config_Si4463.h)
- Revision History:
- Version Date Author Modification
- V1.0.0 2016-10-15 liuzijain 初次編寫
- *********************************************************/
- #include "stm32f10x.h"
- #include "Si4463.h"
- #include "radio_config_Si4463.h"
- #include "user_subfunction.h"
- #include <stdio.h>
- const u8 set[1000] = RADIO_CONFIGURATION_DATA_ARRAY;
- #define s46_BUFF_LEN 1 // 數據長度設置
- u8 s46_Send_Buff[s46_BUFF_LEN]={0}; // 發送數據緩沖數組
- u8 s46_Rece_Buff[s46_BUFF_LEN]={0}; // 接收數據緩沖數組
- /*
- // 函數: SPIGPIO_Config()
- // 描述: 配置SPI模擬的輸入輸出端口
- // 配置IO模擬SPI
- // RF4463_IRQ--PC8輸入 GPIO1--PB15輸入 SDN--PB12輸出 NSEL--PC6輸出 SCLK--PB14輸出 SDO--PC7輸入 SDI--PB13輸出 */
- void SPIGPIO_Config(void)
- { //輸出
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- //輸入
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- /*****************************************************************************
- 函數: s46_SPI_WR_Byte()
- 描述: 通過SPI寫一個byte到Si4463,同時從寄存器讀取一個Byte
- 參數: byte 待寫入字節數據
- return 讀取到的字節數據
- ******************************************************************************/
- uint8 s46_SPI_WR_Byte(uint8 byte)
- {
- uint8 i;
- for(i=0; i<8; i++)
- {// 循環8次
- if((byte & 0x80) == 0x80)
- {SDI_SET;} // 將byte最高位輸出到SDI
- else
- {SDI_CLR;}
- byte <<= 1; // 低一位移位到最高位
- SCLK_SET;
- delay4us(10); // 拉高SLCK,從SI讀入1位數據,同時Si4463從SO輸出1位數據
- // byte |= SDO; // 讀SDO到byte最低位
- if(SDO==1){byte |= 0x01;}
- else{byte |= 0x00;}
- SCLK_CLR;
- delay4us(10); // SCLK置低
- }
- return(byte); // 返回讀取的1Byte數據
- }
- /***********************************************************************
- 函數: s46_SPI_W_CMD()
- 描述: 向芯片中寫入指令
- 參數: cmd 指令字
- plen 寫入參數數量(寫入屬性時最多為12個參數)
- *p 寫入參數存放地址
- loopcts 0=忽略CTS檢測; 1=檢測CTS
- *****************************************************************************/
- void s46_SPI_W_CMD(uint8 cmd, uint16 plen, uint8 *p, uint8 loopcts)
- {
- uint8 i=0;
- if(loopcts == 1){while(GPIO1 == 0);} // 等待CTS為高(執行完成)
- NSEL_CLR; // nSEL置低,開始數據傳輸過程
- s46_SPI_WR_Byte(cmd); // 寫入指令字
- for(i=0; i<plen; i++)
- { s46_SPI_WR_Byte(p[i]); // 寫入后續數據
- }
- NSEL_SET; // nSEL置高,結束數據傳輸過程
- }
- /*************************************************************
- 函數: s46_SPI_R_CMD()
- 描述: 從芯片中讀取指令響應
- 參數: cmd 指令字
- plen 讀取響應數量(讀取屬性時最多為16個參數)
- *p 讀取響應存放地址
- loopcts 0=忽略CTS檢測; 1=檢測CTS
- return CTS響應值
- ******************************************************************/
- uint8 s46_SPI_R_CMD(uint8 cmd, uint8 len, uint8 *p, uint8 loopcts)
- {
- uint8 i=0;
- //uint8_t cts=0;
- if(loopcts == 1){while(GPIO1 == 0);} // 等待CTS為高(執行完成)
- NSEL_CLR; // nSEL置低,開始數據傳輸過程
- s46_SPI_WR_Byte(cmd); // 寫入指令字
- for(i=0; i<=len; i++)
- { p[i] = s46_SPI_WR_Byte(0); // 讀取寄存器數值
- }
- NSEL_SET; // nSEL置高,結束數據傳輸過程
- return(p[0]); // 返回CTS
- }
- /******************************************************************************
- 函數: s46_Power_ON_Reset()
- 描述: 芯片上電后的復位
- 參數: 無
- ******************************************************************************/
- void s46_Power_ON_Reset(void)
- {
- uint8 buff[7] = {RF_POWER_UP};
- NSEL_SET;
- SDI_CLR;
- SCLK_CLR;
-
- SDN_SET; // SDN=1=進入掉電模式
- delayms(1); // 等待1ms
- SDN_CLR; // SDN=0=進入上電模式
- while(GPIO1 == 0); // 等待CTS為高,上電成功
- s46_SPI_W_CMD(buff[0], 6, &buff[1], 1); // 寫入POR指令及配置數據
-
- }
- /*********************************************************************
- 函數: s46_Load_Radio_Config()
- 描述: 將WDS生成的配置列表寫入芯片中
- 參數: none
- ************************************************************************/
- void s46_Load_Radio_Config(void)
- {
-
- uint16 i = 0;
- i = set[i] + 1; // 跳過POR配置數據
- do
- { s46_SPI_W_CMD(set[i+1], set[i]-1,(uint8 *)&set[i+2], 0); // 寫入配置列表中的數據
- i = i + set[i] + 1; // 指向下一組數據
- }while (set[i] != 0x00); // 空值(len=0x00)結束
- }
- /**************************************************
- 函數: s46_Clear_Interrupt_Status()
- 描述: 清除全部中斷,并返回數據包處理器中斷狀態
- 參數: 無
- *****************************************************/
- uint8 s46_Clear_Interrupt_Status(void)
- {
- uint8 buff[9];
- buff[0] = 0; buff[1] = 0; buff[2] = 0;
- s46_SPI_W_CMD(s46CMD_GET_INT_STATUS_B0_CMD, 3, buff, 1); // 寫入返回中斷狀態指令
- s46_SPI_R_CMD(s46CMD_READ_CMD_BUFF_B0_CMD, 9, buff, 1); // 讀取CTS和指令響應
- return(buff[s46RIN_GET_INT_STATUS_B3_PH_PEND]); // 返回數據包處理器中斷狀態
- }
- /********************************************************************
- 函數: s46_Send_Packet()
- 描述: 發送數據包
- 參數: *p 發送數據的首地址
- ************************************************************************/
- void s46_Send_Packet(uint8 *p)
- {
- uint8 buff[8];
- s46_Clear_Interrupt_Status(); // 清除全部中斷
- while(RF4463_IRQ != 1); // 等待nIRQ為高(中斷已清除)
-
- s46_SPI_W_CMD(s46CMD_WRITE_TX_FIFO_B0_CMD, s46_BUFF_LEN, p, 0); // 將待發送數據寫入TX_FIFO
- buff[0] = s46PRT_INT_CTL_PH_ENABLE_GROUP; // 屬性分組=包處理器中斷使能
- buff[1] = 1; // 屬性數量=1
- buff[2] = s46PRT_INT_CTL_PH_ENABLE_INDEX; // 起始地址=PH_ENABLE
- buff[3] = s46PFS_INT_CTL_PH_ENABLE_PACKET_SENT_EN; // 使能PACKET_SENT中斷
- s46_SPI_W_CMD(s46CMD_SET_PROPERTY_B0_CMD, 4, buff, 1); // 寫入包處理器中斷使能屬性
- buff[0] = RADIO_CONFIGURATION_DATA_CHANNEL_NUMBER; // CHANNEL
- buff[1] = s46RFP_START_TX_B2_NOCHANGE // 發送結束后進入READY狀態
- | s46RFP_START_TX_B2_USE // 更新參數并進入TX模式
- | s46RFP_START_TX_B2_TRANSMIT_FIFO // 發送FIFO中的數據(下溢時產生中斷)
- | s46RFP_START_TX_B2_IMMEDIATE; // 立即發送
- buff[2] = (uint8)(s46_BUFF_LEN >> 8); // TX_LEN bit12:8
- buff[3] = (uint8)(s46_BUFF_LEN); // TX_LEN bit7:0
- buff[4] = 0; // 數據包之間的間隔時間
- buff[5] = 0; // 數據包重復次數
- s46_SPI_W_CMD(s46CMD_START_TX_B0_CMD, 6, buff, 1); // 啟動發送
- while(RF4463_IRQ != 0); // 等待nIRQ為低(執行完成)
- s46_Clear_Interrupt_Status(); // 清除全部中斷
- s46_Start_RX(); // 返回RX狀態
- }
- /******************************************************************************
- 函數: s46_Start_RX()
- 描述: 進入接收狀態
- 參數: 無
- ******************************************************************************/
- void s46_Start_RX(void)
- {
- uint8 buff[7];
-
- s46_Clear_Interrupt_Status(); // 清除全部中斷
- buff[0] = s46CFP_CHANGE_STATE_B1_READY; // 進入READY模式
- s46_SPI_W_CMD(s46CMD_CHANGE_STATE_B0_CMD, 1, buff, 1); // 發送指令
- buff[0] = s46PRT_INT_CTL_PH_ENABLE_GROUP; // 屬性分組=包處理器中斷使能
- buff[1] = 1; // 屬性數量=1
- buff[2] = s46PRT_INT_CTL_PH_ENABLE_INDEX; // 起始地址=PH_ENABLE
- buff[3] = s46PFS_INT_CTL_PH_ENABLE_PACKET_RX_EN // 使能PACKET_RX中斷
- | s46PFS_INT_CTL_PH_ENABLE_CRC_ERROR_EN; // 使能CRC_ERROR中斷
- s46_SPI_W_CMD(s46CMD_SET_PROPERTY_B0_CMD, 4, buff, 1); // 寫入包處理器中斷使能屬性
- buff[0] = RADIO_CONFIGURATION_DATA_CHANNEL_NUMBER; // CHANNEL
- buff[1] = s46RFP_START_RX_B2_USE // 更新參數并進入RX模式
- | s46CFP_START_RX_B2_IMMEDIATE; // 立即接收
- buff[2] = (uint8)(s46_BUFF_LEN >> 8); // RX_LEN bit12:8
- buff[3] = (uint8)(s46_BUFF_LEN); // TX_LEN bit7:0
- buff[4] = s46CFP_START_RX_B5B7_NO_CHANGE; // 前導檢測超時時自動進入的狀態
- buff[5] = s46CFP_START_RX_B5B7_READY; // 接收到有效數據包時自動進入的狀態
- buff[6] = s46CFP_START_RX_B5B7_READY; // 接收到無效數據包時自動進入的狀態
- s46_SPI_W_CMD(s46CMD_START_RX_B0_CMD, 7, buff, 1); // 啟動接收
- }
- /*******************************************************************************
- 函數: uint8 s46_RX_Check(uint8 *p)
- 描述: 檢測接收狀態
- 參數: *p 接收數據存放地址
- return 接收完成標志(0=無接收, 1=接收到有效數據)
- *******************************************************************************/
- uint8 s46_RX_Check(uint8 *p)
- {
- uint8 t=0;
- uint8 buff[3];
- uint8 r=0;
- if(RF4463_IRQ == 0)
- {
- t = s46_Clear_Interrupt_Status(); // 清除全部中斷,并返回數據包處理器中斷狀態
- if(t & s46RFP_GET_INT_STATUS_B4_PACKET_RX){ // 檢查是否為數據包接收完成中斷
- s46_SPI_R_CMD(s46CMD_READ_RX_FIFO_B0_CMD, s46_BUFF_LEN, p, 0); // 讀取RX_FIFO中的數據
- r = 1; // 檢測到有效數據包
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
stm32-si4463.rar
(11.62 KB, 下載次數: 104)
2018-5-31 16:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|