• 大小: 10KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: 其他
  • 标签: si4431  

资源简介

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++)
{

评论

共有 条评论

相关资源