资源简介
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测试并串口发送
评论
共有 条评论