標(biāo)題:
stm32配置SI4463 443M公共頻段通訊源碼
[打印本頁(yè)]
作者:
L.sir
時(shí)間:
2018-5-31 16:16
標(biāo)題:
stm32配置SI4463 443M公共頻段通訊源碼
通過stm32 IO口模擬PSI通訊實(shí)現(xiàn)SI4463配置與使用
0.png
(41.99 KB, 下載次數(shù): 56)
下載附件
2018-5-31 17:57 上傳
stm32單片機(jī)源程序如下:
/*******************************************************
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 // 數(shù)據(jù)長(zhǎng)度設(shè)置
u8 s46_Send_Buff[s46_BUFF_LEN]={0}; // 發(fā)送數(shù)據(jù)緩沖數(shù)組
u8 s46_Rece_Buff[s46_BUFF_LEN]={0}; // 接收數(shù)據(jù)緩沖數(shù)組
/*
// 函數(shù): 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);
}
/*****************************************************************************
函數(shù): s46_SPI_WR_Byte()
描述: 通過SPI寫一個(gè)byte到Si4463,同時(shí)從寄存器讀取一個(gè)Byte
參數(shù): byte 待寫入字節(jié)數(shù)據(jù)
return 讀取到的字節(jié)數(shù)據(jù)
******************************************************************************/
uint8 s46_SPI_WR_Byte(uint8 byte)
{
uint8 i;
for(i=0; i<8; i++)
{// 循環(huán)8次
if((byte & 0x80) == 0x80)
{SDI_SET;} // 將byte最高位輸出到SDI
else
{SDI_CLR;}
byte <<= 1; // 低一位移位到最高位
SCLK_SET;
delay4us(10); // 拉高SLCK,從SI讀入1位數(shù)據(jù),同時(shí)Si4463從SO輸出1位數(shù)據(jù)
// byte |= SDO; // 讀SDO到byte最低位
if(SDO==1){byte |= 0x01;}
else{byte |= 0x00;}
SCLK_CLR;
delay4us(10); // SCLK置低
}
return(byte); // 返回讀取的1Byte數(shù)據(jù)
}
/***********************************************************************
函數(shù): s46_SPI_W_CMD()
描述: 向芯片中寫入指令
參數(shù): cmd 指令字
plen 寫入?yún)?shù)數(shù)量(寫入屬性時(shí)最多為12個(gè)參數(shù))
*p 寫入?yún)?shù)存放地址
loopcts 0=忽略CTS檢測(cè); 1=檢測(cè)CTS
*****************************************************************************/
void s46_SPI_W_CMD(uint8 cmd, uint16 plen, uint8 *p, uint8 loopcts)
{
uint8 i=0;
if(loopcts == 1){while(GPIO1 == 0);} // 等待CTS為高(執(zhí)行完成)
NSEL_CLR; // nSEL置低,開始數(shù)據(jù)傳輸過程
s46_SPI_WR_Byte(cmd); // 寫入指令字
for(i=0; i<plen; i++)
{ s46_SPI_WR_Byte(p[i]); // 寫入后續(xù)數(shù)據(jù)
}
NSEL_SET; // nSEL置高,結(jié)束數(shù)據(jù)傳輸過程
}
/*************************************************************
函數(shù): s46_SPI_R_CMD()
描述: 從芯片中讀取指令響應(yīng)
參數(shù): cmd 指令字
plen 讀取響應(yīng)數(shù)量(讀取屬性時(shí)最多為16個(gè)參數(shù))
*p 讀取響應(yīng)存放地址
loopcts 0=忽略CTS檢測(cè); 1=檢測(cè)CTS
return CTS響應(yīng)值
******************************************************************/
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為高(執(zhí)行完成)
NSEL_CLR; // nSEL置低,開始數(shù)據(jù)傳輸過程
s46_SPI_WR_Byte(cmd); // 寫入指令字
for(i=0; i<=len; i++)
{ p[i] = s46_SPI_WR_Byte(0); // 讀取寄存器數(shù)值
}
NSEL_SET; // nSEL置高,結(jié)束數(shù)據(jù)傳輸過程
return(p[0]); // 返回CTS
}
/******************************************************************************
函數(shù): s46_Power_ON_Reset()
描述: 芯片上電后的復(fù)位
參數(shù): 無
******************************************************************************/
void s46_Power_ON_Reset(void)
{
uint8 buff[7] = {RF_POWER_UP};
NSEL_SET;
SDI_CLR;
SCLK_CLR;
SDN_SET; // SDN=1=進(jìn)入掉電模式
delayms(1); // 等待1ms
SDN_CLR; // SDN=0=進(jìn)入上電模式
while(GPIO1 == 0); // 等待CTS為高,上電成功
s46_SPI_W_CMD(buff[0], 6, &buff[1], 1); // 寫入POR指令及配置數(shù)據(jù)
}
/*********************************************************************
函數(shù): s46_Load_Radio_Config()
描述: 將WDS生成的配置列表寫入芯片中
參數(shù): none
************************************************************************/
void s46_Load_Radio_Config(void)
{
uint16 i = 0;
i = set[i] + 1; // 跳過POR配置數(shù)據(jù)
do
{ s46_SPI_W_CMD(set[i+1], set[i]-1,(uint8 *)&set[i+2], 0); // 寫入配置列表中的數(shù)據(jù)
i = i + set[i] + 1; // 指向下一組數(shù)據(jù)
}while (set[i] != 0x00); // 空值(len=0x00)結(jié)束
}
/**************************************************
函數(shù): s46_Clear_Interrupt_Status()
描述: 清除全部中斷,并返回?cái)?shù)據(jù)包處理器中斷狀態(tài)
參數(shù): 無
*****************************************************/
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); // 寫入返回中斷狀態(tài)指令
s46_SPI_R_CMD(s46CMD_READ_CMD_BUFF_B0_CMD, 9, buff, 1); // 讀取CTS和指令響應(yīng)
return(buff[s46RIN_GET_INT_STATUS_B3_PH_PEND]); // 返回?cái)?shù)據(jù)包處理器中斷狀態(tài)
}
/********************************************************************
函數(shù): s46_Send_Packet()
描述: 發(fā)送數(shù)據(jù)包
參數(shù): *p 發(fā)送數(shù)據(jù)的首地址
************************************************************************/
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); // 將待發(fā)送數(shù)據(jù)寫入TX_FIFO
buff[0] = s46PRT_INT_CTL_PH_ENABLE_GROUP; // 屬性分組=包處理器中斷使能
buff[1] = 1; // 屬性數(shù)量=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 // 發(fā)送結(jié)束后進(jìn)入READY狀態(tài)
| s46RFP_START_TX_B2_USE // 更新參數(shù)并進(jìn)入TX模式
| s46RFP_START_TX_B2_TRANSMIT_FIFO // 發(fā)送FIFO中的數(shù)據(jù)(下溢時(shí)產(chǎn)生中斷)
| s46RFP_START_TX_B2_IMMEDIATE; // 立即發(fā)送
buff[2] = (uint8)(s46_BUFF_LEN >> 8); // TX_LEN bit12:8
buff[3] = (uint8)(s46_BUFF_LEN); // TX_LEN bit7:0
buff[4] = 0; // 數(shù)據(jù)包之間的間隔時(shí)間
buff[5] = 0; // 數(shù)據(jù)包重復(fù)次數(shù)
s46_SPI_W_CMD(s46CMD_START_TX_B0_CMD, 6, buff, 1); // 啟動(dòng)發(fā)送
while(RF4463_IRQ != 0); // 等待nIRQ為低(執(zhí)行完成)
s46_Clear_Interrupt_Status(); // 清除全部中斷
s46_Start_RX(); // 返回RX狀態(tài)
}
/******************************************************************************
函數(shù): s46_Start_RX()
描述: 進(jìn)入接收狀態(tài)
參數(shù): 無
******************************************************************************/
void s46_Start_RX(void)
{
uint8 buff[7];
s46_Clear_Interrupt_Status(); // 清除全部中斷
buff[0] = s46CFP_CHANGE_STATE_B1_READY; // 進(jìn)入READY模式
s46_SPI_W_CMD(s46CMD_CHANGE_STATE_B0_CMD, 1, buff, 1); // 發(fā)送指令
buff[0] = s46PRT_INT_CTL_PH_ENABLE_GROUP; // 屬性分組=包處理器中斷使能
buff[1] = 1; // 屬性數(shù)量=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 // 更新參數(shù)并進(jìn)入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; // 前導(dǎo)檢測(cè)超時(shí)時(shí)自動(dòng)進(jìn)入的狀態(tài)
buff[5] = s46CFP_START_RX_B5B7_READY; // 接收到有效數(shù)據(jù)包時(shí)自動(dòng)進(jìn)入的狀態(tài)
buff[6] = s46CFP_START_RX_B5B7_READY; // 接收到無效數(shù)據(jù)包時(shí)自動(dòng)進(jìn)入的狀態(tài)
s46_SPI_W_CMD(s46CMD_START_RX_B0_CMD, 7, buff, 1); // 啟動(dòng)接收
}
/*******************************************************************************
函數(shù): uint8 s46_RX_Check(uint8 *p)
描述: 檢測(cè)接收狀態(tài)
參數(shù): *p 接收數(shù)據(jù)存放地址
return 接收完成標(biāo)志(0=無接收, 1=接收到有效數(shù)據(jù))
*******************************************************************************/
uint8 s46_RX_Check(uint8 *p)
{
uint8 t=0;
uint8 buff[3];
uint8 r=0;
if(RF4463_IRQ == 0)
{
t = s46_Clear_Interrupt_Status(); // 清除全部中斷,并返回?cái)?shù)據(jù)包處理器中斷狀態(tài)
if(t & s46RFP_GET_INT_STATUS_B4_PACKET_RX){ // 檢查是否為數(shù)據(jù)包接收完成中斷
s46_SPI_R_CMD(s46CMD_READ_RX_FIFO_B0_CMD, s46_BUFF_LEN, p, 0); // 讀取RX_FIFO中的數(shù)據(jù)
r = 1; // 檢測(cè)到有效數(shù)據(jù)包
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
stm32-si4463.rar
(11.62 KB, 下載次數(shù): 104)
2018-5-31 16:15 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
weiwei4
時(shí)間:
2019-1-7 16:26
謝謝分享,正需要,下載學(xué)習(xí)
作者:
magicme
時(shí)間:
2019-1-8 10:55
謝謝分享
作者:
gdgn_526345
時(shí)間:
2019-3-16 11:43
謝謝分享!謝謝!
作者:
酷愛diy
時(shí)間:
2019-3-28 11:36
謝謝,SI4463這模塊挺難搞的,非常感謝
作者:
goodmasher
時(shí)間:
2023-2-3 12:49
雖然是stm32的應(yīng)用程序,但設(shè)計(jì)思路應(yīng)該也適用STM8S,謝謝樓主的分享。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1