找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3750|回复: 5
收起左侧

SI4432无线模块调试程序

[复制链接]
ID:74862 发表于 2015-6-16 14:34 | 显示全部楼层 |阅读模式
希望能帮到有需要的人
SI4432点对点收发自动切换程序分析

silabs官方给的DEMO是AN415_EZRadioPRO_Sample_Code.zip

版本号:
AN415_EZRadioPRO_Sample_Code 1.0 4/11/2011
收发在一体的主程序:
AN415_EZRadioPRO_Sample_Code\EZRadioPRO_Sample_Codes\Si4432_revV2\TRX_operation \main_SDBC_DK3.c
说明文档:
AN415.pdf    英文版的,大致解释了一下程序是怎么运行的,建议花时间仔细看一遍。

程序分析如下:

初始化:

1、读0x03和0x04中断状态寄存器,当读这个地址时,中断标志位将被自动清除;
2、软件复位所有的内部寄存器;
3、等待Power-on-reset (POR)中断,连续读两次0x03 0x04;
4、通信频率;
5、发送数据的波特率;
6、Filter Bandwidth滤宽、Clock Recovery始终恢复、deviation偏差;
7、报头长度,Preamble Detection Threshold.报头检测极值;
8、指定若干同步字(Synchronization Word),并填入值;
9、使能对数据包的收发,填入FIFO并进行CRC校验;
10、没有广播,接收头不用核对。No broadcast address enable, No Received Header check.
11、使能FIFO模式,是调制GFSK模式;
12、若干non-default Si4432 registers赋值;
13、打开接收模式,使能“有效数据包接收”、“CRC错误”两个中断;
14、再一次读两个中断状态寄存器,释放所有挂起的中断。

发送模式:

1、    检测到按键,首先关闭接收器,但keep the XTAL,确保可以及时的调整到发送模式;
2、    注意在发送前,必须要重新配置Tx deviation register;
3、    指定载荷(payload)大小,向FIFO中填入发送数据,在末尾填入回车键的ASSIC码;
4、    屏蔽其它中断,只打开“发送完毕”中断,这样当这个终端产生时,nIRQ引脚会被拉低;读中断状态寄存器,清除所有挂起中断,同时nIRQ引脚被再次拉高;
5、    使能发送,数据被打包发出去,同时FIFO被自动清空;
6、    MCU的程序,停在等待发送完毕中断处;中断发生后,读状态寄存器清除中断;
7、    再一次使能“有效数据包接收”“CRC错误”中断;
8、    重新配置Frequency Deviation register,再使能接收链路。

小记:不论是使能发送链路还是接收链路,之前都要重新配置频率偏差寄存器。

接收模式:

1、    关闭接收链路
2、    读中断状态,如果是CRC出错,则清空RX FIFO,方法是对ffclrrx先置1再置0;
3、    如果是有效数据中断,首先读报文长度,再从FIFO中,逐一读出数据;清空FIFO,方法如上;
4、    使能接收链路。

小记:demo里面貌似缺了配置Frequency Deviation register。

接收中嵌套发送:

1、    关闭接收链路;
2、    读中断状态,如果是CRC出错,则清空RX FIFO,方法是对ffclrrx先置1再置0;
3、    如果是有效数据中断,首先读报文长度,再从FIFO中,逐一读出数据;
4、    若需要回应ACK信号,配置Frequency Deviation register,填入报文长度和内容;
5、    使能发送完毕中断,打开发送模式,等待发送结束,清中断;
6、    再一次使能“有效数据包接收”“CRC错误”中断;
7、    重新配置Frequency Deviation register,清空FIFO,使能接收链路。

SI4432简单收发程序



void IA4432_Init(void)
{
IA4432_Register((REG_WRITE | OperatingControl1), 0x80);
IA4432_Register((REG_WRITE | TXRampControl), 0x7F);
IA4432_Register((REG_WRITE | AFCLoopGearshiftOverride), 0x00);
IA4432_Register((REG_WRITE | FrequencyBandSelect), 0x53);    //set frequency
IA4432_Register((REG_WRITE | NominalCarrierFrequency1), 0x4b);  //433HZ
IA4432_Register((REG_WRITE | NominalCarrierFrequency0), 0x00);
IA4432_Register((REG_WRITE | ModulationModeControl1), 0x00);
IA4432_Register((REG_WRITE | ModulationModeControl2), 0x22); //asynchronous mode  FSK
IA4432_Register((REG_WRITE | HeaderControl2), 0x02); //no head; sync word 3 and 2
IA4432_Register((REG_WRITE | HeaderControl1), 0x00);
IA4432_Register((REG_WRITE | PreambleLength), 0x04);   //2byte
IA4432_Register((REG_WRITE | PreambleDetectionControl), 0x10); //8bit
IA4432_Register((REG_WRITE | SyncWord3), 0x2d);
IA4432_Register((REG_WRITE | SyncWord2), 0xd4);
//IA4432_Register((REG_WRITE | TransmitPacketLength), 0x40);
IA4432_Register((REG_WRITE | DataAccessControl), 0x88); //enable TX handling
IA4432_Register((REG_WRITE | IFFilterBandwidth), 0x03); //BW=90kHZ
IA4432_Register((REG_WRITE | ClockRecoveryOversamplingRatio), 0xa1);
IA4432_Register((REG_WRITE | ClockRecoveryOffset2), 0x20);
IA4432_Register((REG_WRITE | ClockRecoveryOffset1), 0x4e);
IA4432_Register((REG_WRITE | ClockRecoveryOffset0), 0xa5);
IA4432_Register((REG_WRITE | ClockRecoveryTimingLoopGain1), 0x00);
IA4432_Register((REG_WRITE | ClockRecoveryTimingLoopGain0), 0x36);
IA4432_Register((REG_WRITE | TXDataRate1), 0x02); //9600BPS
IA4432_Register((REG_WRITE | TXDataRate0), 0x75);
IA4432_Register((REG_WRITE | FrequencyDeviation), 0x48);
IA4432_Register((REG_WRITE | ClockRecoveryGearshiftOverride), 0x13);
IA4432_Register((REG_WRITE | GPIO0Configuration), 0x1f);
IA4432_Register((REG_WRITE | GPIO1Configuration), 0x12); //GPIO_1 TX state
IA4432_Register((REG_WRITE | GPIO2Configuration), 0x15); //GPIO_2 RX state
IA4432_Register((REG_WRITE | OperatingControl2), 0x02);
IA4432_Register((REG_WRITE | OperatingControl2), 0x00);
IA4432_Register((REG_WRITE | InterruptEnable1), 0x02);
}
void RF_R(unsigend char *d)
{
unsigned char index,yyy,ttt;
IA4432_Register((REG_WRITE | OperatingControl2), 0x02);
IA4432_Register((REG_WRITE | OperatingControl2), 0x00);
IA4432_Register((REG_WRITE | OperatingControl1), 0x05);
while(1)
{
yyy = IA4432_Register((REG_READ | InterruptStatus1),0x00);
if(yyy&0x02) break;
}
IA4432_Register((REG_WRITE | OperatingControl1), 0x01);
ttt = IA4432_Register((REG_WRITE | ReceivedPacketLength), 0x00);
for(index=0;index<tt;index++)
{
d[index]=IA4432_Register((REG_READ | FIFOAccess),0x00);
}
}
void RF_T(unsigned char *d,unsigned char l)
{
unsigned char i;
IA4432_Register((REG_WRITE | OperatingControl1), 0x01);
IA4432_Register((REG_WRITE | OperatingControl2), 0x01);
IA4432_Register((REG_WRITE | OperatingControl2), 0x00);
IA4432_Register((REG_WRITE | InterruptEnable1), 0x00);
IA4432_Register((REG_WRITE | InterruptEnable2), 0x00);
IA4432_Register((REG_WRITE | TransmitPacketLength),l);
for(i=0;i<l;i++)
{
IA4432_Register((REG_WRITE | FIFOAccess),*d);
d++;
}
IA4432_Register((REG_WRITE | OperatingControl1), 0x09);
IA4432_Register((REG_WRITE | InterruptEnable1), 0x04); //使能发送有效包中断
while((IA4432_Register((REG_READ | InterruptStatus1), 0x00)&0x04)==0);
}


回复

使用道具 举报

ID:74862 发表于 2015-6-16 14:38 | 显示全部楼层
没有上传就发了
回复

使用道具 举报

ID:73848 发表于 2015-6-17 11:40 来自手机 | 显示全部楼层
楼主能不能介绍一下这个模块呀
回复

使用道具 举报

ID:63094 发表于 2015-6-21 19:43 | 显示全部楼层
那里啊
回复

使用道具 举报

ID:1 发表于 2015-6-22 23:22 | 显示全部楼层

楼主,在回帖的时候点 高级模式  或者 编辑主题帖 均可上传附件  谢谢
回复

使用道具 举报

ID:364014 发表于 2018-7-3 15:08 | 显示全部楼层
好东西,我正在用它
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表