si4431程序示例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
unsigned char i,k;
for(k = 0; k< time; k++)
{
for(i = 0; i<130; i++)
{
NOP();
}
}
}
void timer_init(void)
{
T1CON = 0x31;
TMR1IE = 1;
TMR1L = 0x78;//定时器中断初始化
TMR1H = 0xec;
spi_rw(0x44|0x80, 0xff); //
spi_rw(0x45|0x80, 0xff); //
spi_rw(0x46|0x80, 0xff); //
spi_rw(0x6d|0x80, 0x07); //设置为最大功率发射
spi_rw(0x79|0x80, 0x0); //不需要跳频
spi_rw(0x7a|0x80, 0x0); //不需要跳频
spi_rw(0x70|0x80, 0x2c);spi_rw(0x1d|0x0, 0x40); //使能afc
// 1.2K bps setting
spi_rw(0x1c|0x80, 0x16);//下面的设置根据Silabs的Excel
spi_rw(0x20|0x80, 0x83);
spi_rw(0x21|0x80, 0xc0); //
spi_rw(0x71|0x80, 0x22); //发射不需要CLK,FiFo,FSK模式
spi_rw(0x72|0x80, 0x30); //频偏为30KHz
spi_rw(0x73|0x80, 0x0); //没有频率偏差
spi_rw(0x74|0x80, 0x0); //没有频率偏差
spi_rw(0x75|0x80, 0x53); //频率设置433.5
#define SDO_setTRISC1//设置IO口的输入,数出的寄存器
#define nSEL_setTRISC2//设置IO口的输入,数出的寄存器
#define SDI_setTRISC3//设置IO口的输入,数出的寄存器
#define SCK_setTRISC4//设置IO口的输入,数出的寄存器
spi_rw(0x22|0x80, 0x13);//
spi_rw(0x23|0x80, 0xa9); //
spi_rw(0x24|0x80, 0x00); //
spi_rw(0x25|0x80, 0x04); //
spi_rw(0x2a|0x80, 0x14);
spi_rw(0x6e|0x80, 0x09);
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)
chksum += rx_buf[i];
if(( chksum == rx_buf[9] )&&( rx_buf[0] == 0x41 ))
{
; //数据收到了
}
else
{
rx_data(); //收到的数据不对,则要继续开始接收
}
}
}
}
}
void delay_1ms(unsigned char time)
spi_rw(0x6f|0x80, 0xd5);
//1.2K bps setting end
spi_rw(0x30|0x80, 0x8c); //使能PH+ FIFO模式,高位在前面,使能CRC校验
spi_rw(0x32|0x80, 0xff); // byte0, 1,2,3作为头码
spi_rw(0x33|0x80, 0x42);// byte 0,1,2,3是头码,同步字3,2是同步字
unsigned char rx_buf[15];
typedef struct
{
unsigned char reach_1s: 1;
unsigned char rf_reach_timeout: 1;
unsigned char is_tx: 1;
}FlagType;
FlagTypeFlag;
void rx_data(void);
}
void interrupt ISR_timer(void)
{
unsigned char i;
if(TMR1IF)
{
TMR1L = 0x78;// 20ms的定时器
TMR1H = 0xec;
rf_timeout++;
if(rf_timeout == 25)
{
Flag.rf_reach_timeout = 1;//发射0.5秒,接收3秒的Timeout定时器,发射,接收共用此Ram
spi_rw(0x38|0x80, 0x00);
spi_rw(0x39|0x80, 0x00);
spi_rw(0x3a|0x80, 's'); //发射的头码为:“swwx"
spi_rw(0x3b|0x80, 'w');
spi_rw(0x3c|0x80, 'w');
spi_rw(0x3d|0x80, 'x');
spi_rw(0x3e|0x80, 10); //总共发射10个字节的数据
spi_rw(0x3f|0x80, 's'); //需要校验的头码为:”swwx"
spi_rw(0x40|0x80, 'w');
spi_rw(0x41|0x80, 'w');
spi_rw(0x42|0x80, 'x');
spi_rw(0x43|0x80, 0xff); //头码1,2,3,4的所有位都需要校验
pic16f689includepichincludemathhconstunsignedchartxtestdata10每秒发射的固定内容的测试信号第10个数据是前9个数据的校验和definesi4432pwrstateready01模块ready状态定义definesi4432pwrstatetx0x09模块发射状态定义definesi4432pwrstaterx05模块接收状态定义definesi4432packetsentinterrupt04模块发射完成中断definesi4432rxpacketreceivedinterrupt0x02模块收到数据包中断definetx1rx0spirw0x0e0x800x01发射状态的天线开关定义definetx0rx1spirw0x0e0x800x02接收状态的天线开关定义definetx0rx0spirw0x0e0x800x00非发射接收状态的天线开关定义definenirqrc0mcu输入口definesdorc1mcu输入口definenselrc2mcu输出口definesdirc3mcu输出口definesckrc4mcu输出口definesdnrc5mcu输出口definenirqsettrisc0设置io口的输入数出的寄存器definesdosettrisc1设置io口的输入数出的寄存器definenselsettrisc2设置io口的输入数出的寄存器definesdisettrisc3设置io口的输入数出的寄存器definescksettrisc4设置io口的输入数出的寄存器definesdnsettrisc5设置io口的输入数出的寄存器defineinputdefineoutputunsignedcharcount50hz
spi_rw(0x09|0x80, 0x7f); //负载电容= 12P
spi_rw(0x0a|0x80, 0x05);//关闭低频输出
spi_rw(0x0b|0x80, 0xea); // GPIO 0当做普通输出口
spi_rw(0x0c|0x80, 0xea); //GPIO 1当做普通输出口
spi_rw(0x0d|0x80, 0xf4); // /GPIO 2输出收到的数据
spi_rw(0x34|0x80, 16); //发射16个Nibble的Preamble
spi_rw(0x35|0x80, 0x20); //需要检测4个nibble的Preamble
spi_rw(0x36|0x80, 0x2d); //同步字为0x2dd4
spi_rw(0x37|0x80, 0xd4);
{
if(!nIRQ)
{
ItStatus1 = spi_rw(0x03,0x00);//清中断//read the Interrupt Status1 register
ItStatus2 = spi_rw(0x04,0x00);//清中断
SCK = 0;
nSEL = 0;
spi_byte(0x7f);//从缓冲区读数据
void port_init(void);
void timer_init(void);
void main()
{
unsigned char i, j, chksum;
OSCCON = 0X70;//使用内部晶振,8M crystal
WDTCON = 0X00; //看门狗设置
port_init();// IO口初始化
#define SDN_setTRISC5//设置IO口的输入,数出的寄存器
#define INPUT1
#define OUTPUT0
unsigned char count_50hz;
unsigned char ItStatus1, ItStatus2;
unsigned char rf_timeout;
// Demo程序适用范围:Si4431F13, Si4432F20, Si4431F27
// RF模块的参数设置为:FSK,433.5MHz,1.2KBPS,+/-10PPM,频偏:30KHz,调制带宽:61.2KHz
//使能AFC,使能CRC,PH + FIFO模式
//每秒钟发射的固定测试数据为:0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d,
}
count_50hz++;
if(count_50hz==50) //
{
count_50hz=0;
Flag.reach_1s = 1;//一秒的定时器
}
TMR1IF=0;
}
}
void port_init(void)
{
ANSEL = 0;
ANSELH = 0;//不使用MCU的AD
WPUA = 0;//没有上拉电阻
#define nIRQRC0// MCU输入口
#define SDORC1// MCU输入口
#define nSELRC2// MCU输出口
#define SDIRC3// MCU输出口
#define SCKRC4// MCU输出口
#define SDNRC5// MCU输出口
#define nIRQ_setTRISC0//设置IO口的输入,数出的寄存器
for(i = 0;i<10;i++)
{
rx_buf[i] = spi_byte(0x00);
}
nSEL = 1;
spi_rw(0x07|0x80, SI4432_PWRSTATE_READY);//数据接收完成,退出接收模式,
chksum = 0;
for(i=0;i<9;i++)//计算Checksum
SDN = 1;
delay_1ms(10);// RF模块复位
SDN = 0;
delay_1ms(200);//延时150ms RF模块进入工作状态
SI4432_init(); // RF模块初始化
TX0_RX0;//天线开关不在发射,接收状态
timer_init();
count_50hz = 0;
IOCA = 0; //没有IO口中断
nIRQ_set = INPUT;
SDO_set = INPUT;
nSEL_set = OUTPUT;
SDI_set= OUTPUT;
SCK_set= OUTPUT;
SDN_set= OUTPUT;
TRISB5 = OUTPUT;
}
void SI4432_init(void)
#define TX1_RX0spi_rw(0x0e|0x80, 0x01)//发射状态的天线开关定义
#define TX0_RX1spi_rw(0x0e|0x80, 0x02)//接收状态的天线开关定义
#define TX0_RX0spi_rw(0x0e|0x80, 0x00) //非发射,接收状态的天线开关定义
#define SI4432_PWRSTATE_TX0x09//模块发射状态定义
#define SI4432_PWRSTATE_RX05//模块接收状态定义
#define SI4432_PACKET_SENT_INTERRUPT04//模块发射完成中断
#define SI4432_Rx_packet_received_interrupt 0x02 //模块收到数据包中断
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);
// 0x6d = (0x41 +0x42 +0x43 +0x44 +0x45 +0x46 +0x47 + 0x48 +0x49)
// MCU : Microchip high performance 8 bit MCU :PIC16F689
#include<pic.h>
#include<math.h>
{
ItStatus1 = spi_rw(0x03,0x00);//清RF模块中断
ItStatus2 = spi_rw(0x04,0x00);
spi_rw(0x06|0x80, 0x00); //关闭不需要的中断
spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); //进入Ready模式
const unsigned char tx_test_data[10] = {0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d}; //每秒发射的固定内容的测试信号,第10个数据是前9个数据的校验和
#define SI4432_PWRSTATE_READY01//模块Ready状态定义
相关文档
最新文档