資源簡介
si4431 無線模塊之間通信程序 STC單片機模擬SPI通信,測試正常,可以參考
代碼片段和文件信息
//?Demo?程序適用范圍:?Si4431?Si4432?Si4431PA
//?RF?模塊的參數設置為:?FSK,??433.92MHz,?1.2KBPS,?+/-10PPM?頻偏:30KHz,?調制帶寬:61.2KHz?
// 使能AFC,使能CRC,?PH?+?FIFO?模式
//?每秒鐘發射的固定測試數據為:?0x410x420x430x440x450x460x470x480x490x6d?
//??????????????????????????????0x6d?=?(0x41?+0x42?+0x43?+0x44?+0x45?+0x46?+0x47?+?0x48?+0x49)
//?MCU?:?Microchip?high?performance?8?bit?MCU?:PIC16F689
#include
#include
const?unsigned?char?tx_test_data[10]?=?{0x410x420x430x440x450x460x470x480x490x6d};??//?每秒發射的固定內容的測試信號,第10個數據是前9個數據的校驗和
#define?SI4432_PWRSTATE_READY 01 //?模塊?Ready?狀態定義
#define?SI4432_PWRSTATE_TX 0x09 //?模塊?發射狀態定義
#define?SI4432_PWRSTATE_RX 05 //?模塊?接收狀態定義
#define?SI4432_PACKET_SENT_INTERRUPT 04 //?模塊?發射完成中斷
#define?SI4432_Rx_packet_received_interrupt???0x02??????//?模塊?收到數據包中斷
#define??TX1_RX0 spi_rw(0x0e|0x80?0x01) //?發射狀態的天線開關定義
#define??TX0_RX1 spi_rw(0x0e|0x80?0x02) //?接收狀態的天線開關定義
#define??TX0_RX0 spi_rw(0x0e|0x80?0x00)?????????//?非發射,接收狀態的天線開關定義
#define??nIRQ??????????? RC0 //?MCU?輸入口
#define??SDO ????????? RC1 //?MCU?輸入口
#define??nSEL RC2 //?MCU?輸出口
#define??SDI??????????? RC3 //?MCU?輸出口
#define??SCK RC4 //?MCU?輸出口
#define??SDN RC5 //?MCU?輸出口
#define?nIRQ_set TRISC0 //?設置IO口的輸入,數出的寄存器
#define?SDO_set TRISC1 //?設置IO口的輸入,數出的寄存器
#define?nSEL_set TRISC2 //?設置IO口的輸入,數出的寄存器
#define?SDI_set TRISC3 //?設置IO口的輸入,數出的寄存器
#define?SCK_set TRISC4 //?設置IO口的輸入,數出的寄存器
#define?SDN_set TRISC5 //?設置IO口的輸入,數出的寄存器
#define?INPUT 1
#define?OUTPUT 0
unsigned?char?count_50hz;
unsigned?char?ItStatus1?ItStatus2;
unsigned?char?rf_timeout;
unsigned?char?rx_buf[15];
typedef?struct?
{
unsigned?char?reach_1s :?1;
unsigned?char?rf_reach_timeout :?1;
unsigned?char?is_tx :?1;
} FlagType;
FlagType ????????????????Flag;
void?rx_data(void);
void?tx_data(void);
unsigned?char?spi_byte(unsigned?char?data);
unsigned?char?spi_rw(unsigned?char?addr?unsigned?char?data);
void?SI4432_init(void);
void?delay_1ms(unsigned?char?time);
void?port_init(void);?
void?timer_init(void);
void?main()
{?
unsigned?char??i?j?chksum;
OSCCON?=?0X70; //?使用內部晶振,?8M?crystal
WDTCON?=?0X00;??//?看門狗設置
port_init();?? //?IO?口初始化
?
?
? SDN?=?1;
? delay_1ms(10); //?RF?模塊復位
?
? SDN?=?0;
? delay_1ms(200); //?延時150ms?RF?模塊進入工作狀態
?
?
? SI4432_init();??//?RF?模塊初始化
?
? TX0_RX0; //?天線開關不在發射,接收狀態
?
timer_init();
count_50hz?=?0;
Flag.reach_1s?=?0;
INTCON?=?0xc0;???//?enable?interrupt
while(1)
{
if(Flag.reach_1s)
{
Flag.reach_1s?=?0;
tx_data(); //?每間隔一段時間,發射一包數據,并接收?Acknowledge?信號
}
if(!Flag.is_tx)
{
if(!nIRQ)
{?
ItStatus1?=?spi_rw(0x030x00); //?清中斷 //read?the?Interrupt?Status1?register
ItStatus2?=?spi_rw(0x040x00); //?清中斷
SCK?=?0;
nSEL?=?0;
spi_byte(0x7f); //?從緩沖區讀數據
for(i?=?0;i<10;i++)
{
- 上一篇:著名的JADE算法
- 下一篇:avr128 mpu6050測試并串口發送
評論
共有 條評論