基于Si4432和SX1212间无线通信的实现 一、引言
在为客户提供技术支持和RF定制的过程中,我们发现由于功能要求升级和产品更新换代等原因,经常会遇到需要内嵌不同无线芯片的模块能相互通信的问题,但芯片间的规格、参数、数据格式的各种区别让人不知从何着手。
本次测试选用的是深圳市思为无线科技有限公司自主研发的RF模块RF4432PRO(内嵌Si4432芯片)和RF4463PRO(内嵌Si4463芯片),并描述了详细实验过程、硬件接口和相关示例程序,希望为解决不同无线芯片间的通信问题提供一个参考的方法。
深圳市思为无线科技有限公司是一家专注于RF及传感器类模块应用开发的技术、服务及销售型公司。其针对不同的射频芯片开发了多种应用模块和方案。目前产品覆盖有20mW、100mW、500mW、1W、2W、3W、5W 等不同功率等级;SPI、UART(含TTL/RS232/RS485及USB)等多种通讯接口; 315/ 433/470/868/915 MHz及2.4 GHz等不同工作频率,总共上百种模块。多年的沉淀和积累使得深圳市思为无线科技有限公司在射频应用的软硬件方面都有着强劲的研发实力和丰富的应用经验。
二、实验系统硬件设计
1. 芯片性能和特点
图1:Si4432和Si4463芯片内置模块框图 RF4432PRO模块中的Si4432是美国Silabs研发的一款工作频段低于1GHz的高性能射频收发芯片,属于其EzRadioPro系类。在国内已经广泛应用于工业、科研、医疗(ISM)以及短距离无线通信设备(SRD),其输出功率可高达 +20 dBm,接收灵敏度亦达到 -121 dBm。
RF4463PRO模块采用的是Silicon Lab Si4463器件,这是一款高度集成的无线ISM频段收发芯片。极低的接收灵敏度(-126 dBm),再加上业界领先的+20 dBm的输出功率保证扩大范围和提高链路性能。同时内置天线多样性和对跳频支持可以用于进一步扩大范围,提高性能。
具体参数可见Si4432和Si4463的芯片手册。RF4432PRO和RF4463PRO模块内提供了Si4432和Si4463芯片内置功能的硬件支持,用户可直接根据芯片手册进行模块的编程开发与控制。
模块
| RF4432PRO | RF4463PRO | 频率范围
| 403MHz,433MHz,463MHz | 403MHz,433MHz,463MHz | 发射电流
| 85mA,@20dBm | 85mA,@20dBm | 接收电流
| 18.5mA | 13.5mA | 静态功耗
| <1uA | <0.1uA | 发射功率范围
| 1dBm~20dBm | -5dBm~20dBm | 接收灵敏度
| -121dbm @ data=1.2kbps | -126dbm @data=500bps |
表1: 经测试RF4432与RF1212射频参数对比 2.系统硬件设计
实验系统硬件使用了无线模块RF4432PRO和RF4463PRO及其相应的DEMO演示板。RF4432PRO和RF4463PRO模块内含了经严格测试通过的工业级高性能的芯片应用电路。将各模块通过插针连接在一起,便完成了硬件平台的搭建。通过DEMO演示板中单片机的SPI口控制,两个无线收发模块之间相互通信,从而实现数据的无线传输。
无线模块DEMO演示板(如下图2)是配合无线前端收发模块,为方便客户调试程序、测试距离而研发的开发板。该DEMO演示板外置无线模块引脚,设置参数可掉电保存。用户可通过按键设置修改模块的工作频率、发射功率以及通讯速率等相关参数。DEMO演示板共有5种工作模式,如表2。
表3和表4分别是RF4463PRO模块和RF4432PRO模块的脚位定义,具体可见深圳市思为无线科技有限公司官网中的RF4432PRO规格书和RF4463PRO规格书。
图2:DEMO演示板和无线模块硬件连接
图3: DEMO演示板LCD界面
工作模式 | 描 述 | 正常发射 (主模式) | 定时发射数据包,成功发射一个数据包后红灯亮,转入接收模式,接收到应答信号后蓝灯亮,LCD显示发射和接收数据包的数量
| 正常接收 (从模式) | 接收数据包,接收正确蓝灯亮,并将正确接收到的数据包再发射出去,发射成功后红灯亮,LCD显示发射和接收数据包的数量
| 常发射 (发射测试) | 模块处于常发状态,红灯长亮,不显示数据包数量
| 常接收 (接收测试) | 模块处于常接收状态,相应管脚实时输出接收波形,不计算接收数据包数量
| 休眠 | RF模块处于休眠状态,可在此模式下测量静态功耗
|
表2: DEMO演示板工作模式
脚位编号
| 引脚定义
| 描述 | 1 | GND
| 接电源地
| 2 | NC
| 空脚
| 3 | GPIO0
| 直接连芯片的GPIO0引脚
| 4 | GPIO1
| 直接连芯片的GPIO1引脚
| 5 | VCC
| 接电源正极3.3V
| 6 | SDO
| 0~VDD V数字输出,提供了对内部控制寄存器的串行回读功能
| 7 | SDI
| 串行数据输入。0~VDD V数字输入。该引脚为4线串行数据串行数据流总线。
| 8 | SCLK
| 串行时钟输入。0~VDD V数字输入。该引脚提供了4线串行数据时钟功能。
| 9 | nSEL
| 串行接口选择输入引脚。0~VDD V数字输入。这个引脚为4线串行数据总线提供选择/使能功能,这个信号也用于表示突发读/写模式。
| 10 | nIRQ
| 中断输出引脚
| 11 | SDN
| 关闭输入引脚。0~VDD V数字输入。在除关机模式的所有模式SDN=0。当SDN=1时芯片将彻底关闭并且寄存器的内容将丢失。
| 12 | GND
| 接电源地
| 13 | ANT
| 接50欧的同轴天线
| 14 | GND
| 接电源地
|
表3: RF4463PRO模块的脚位定义
脚位编号
| 引脚定义
| 描述 | 1 | GND
| 接电源地
| 2 | GPIO0
| 内部已接模块的发送控制脚
| 3 | GPIO1
| 内部已接模块的接收控制脚
| 4 | GPIO2
| 直接连芯片的GPIO2脚
| 5 | VCC
| 接电源正极3.3V
| 6 | SDO
| 0~VDD V数字输出,提供了对内部控制寄存器的串行回读功能
| 7 | SDI
| 串行数据输入。0~VDD V数字输入。该引脚为4线串行数据流总线
| 8 | SCLK
| 串行时钟输入。0~VDD V数字输入。该引脚提供了4线串行数据时钟功能
| 9 |
nSEL
| 串行接口选择输入引脚。0~VDD V数字输入。这个引脚为4线串行数据总线提供选择/使能功能,这个信号也用于表示突发读/写模式。
| 10 | nIRQ
| 中断输出引脚
| 11 |
SDN
| 关闭输入引脚。0~VDD V数字输入。在除关机模式的所有模式SDN=0。当SDN=1时芯片将被彻底关闭并且寄存器的内容将丢失
| 12 | GND
| 接电源地
| 13 | ANT
| 接50欧的同轴天线
| 14 | GND
| 接电源地
|
表4: RF4432PRO模块脚位定义 三、无线模块工作原理
无线信号的发射和接收是将信号调制和解调的过程。无论是相同还是不同的无线模块通信,发射和接收两部分调制格式、调制速率和频率、频偏和接收带宽等调制参数的差别都会导致模块之间无法通信的情况。
3.1 SPI总线控制时序
RF4432PRO和RF4463PRO模块与单片机的通信是RF模块根据单片机通过SPI总线写入的控制命令和数据将无线信号发射出去,并将接收到的数据和自身的相关信息通过SPI总线传送给单片机。Si4432与Si4463的SPI时序稍有区别。
图4:Si4432芯片SPI写时序
图5:Si4463芯片SPI写时序 3.2 测试模式
RF4432PRO和RF4463PRO模块的DEMO演示板都有常发和常收两种测试模式,便于调试程序。RF4432PRO和RF1212模块在DEMO演示板测试模式下共同点是不停地传送“101010......”,并可在相应引脚看到接收的实时波形。
图6:DEMO演示板测试模式波形 3.3 正常模式
RF4432PRO和RF4463PRO模块的DEMO演示板的正常收发模式运行在Si4432和Si4463的PH+FIFO模式。
Si4432与Si4463都配置了64字节的FIFO及相应的数据包处理功能。该模式下,芯片自动添加和侦测前导码、同步字、校验等,并通过中断表示通信状态,大大方便了通信过程。在正常模式下通信,必须保证通信的两个模块的数据包格式设置完全一致,否则芯片将无法产生中断。
图7:Si4432数据包格式 图8:Si4463数据包格式 3.4 总结
对比Si4432和Si4463芯片的数据包格式如表5。可以发现除了Si4463的数据包中可分为多个部分并各自设CRC校验外,其余部分基本一致。为保证两个芯片可以通信,将测试数据包格式设置如表6。
| Si4432 | Si4463 | 前导码Preamble | 1~8 Bytes | 1~8 Bytes | 同步字Sync Word | 1~4 Bytes | 1~4 Bytes | 字头TX Header | √ | √ | 数据长度Packet Length | √ | √ | 数据DATA | 0~64 Bytes | 0~64 Bytes | CRC | 0~2 Bytes | 0,2,4 Bytes |
表5: Si4432与Si4463数据包格式对比
| 前导码 | 同步字
| 字头 | 数据 | 长度 | Si4432 | 8 Bytes | 2 Bytes | 4 Bytes | 10 Bytes | Si4463 | 8 Bytes | 2 Bytes | 4 Bytes | 10 Bytes | 内容 | Si4432 | “010101...” | 0xb42b | “swwx” | “ABCDEFGHIm” | Si4463 | “010101...” | 0xb42b | “swwx” | “ABCDEFGHIm” |
表6:测试数据包格式 四、具体调试过程
系统通信采用的射频参数设置为:收发频率433.0 MHz、频偏20 KHz、RF速率:1.2 Kbps。发送的数据格式如表6所示。
为确保RF4432PRO和RF4463PRO模块都能正常工作和提供参考波形,首先分别使相同模块能在该设置下使用DEMO演示板的正常模式通信。
4.1 对比接收与发射波形
数据包模式由于芯片自动处理数据,只显示结果,不利于程序的调试。因此我们使用DEMO演示板测试模式和外置引脚,通过同步观察发送和接收波形这种最直观的方式,来判断通信质量的好坏。
将RF4432PRO和RF4463PRO的GPIO2和GPIO1设置为Rx Data output功能输出,使接收的数据可以分别从GPIO2和GPIO1脚上实时输出。使用逻辑分析仪来同步观察RF4463PRO和RF4432PRO模块发射、接收的波形并做相应的对比。如图10,可发现RF4432PRO和RF4463PRO能正确接收对方的发射信号。
图9:433MHz、1.2Kbps、20KHz频偏下RF4432与RF4463接收测试波形 持续在测试模式下接收一段时间,观察每个接收波形,如图11,发现接收信号没有变形,判断在该射频参数下RF4432PRO和RF4463PRO可以正常通信。
图10:433MHz、1.2Kbps、20KHz频偏下RF4432与RF4463长时间接收测试波形 如果RF4432PRO和RF4463PRO模块的接收波形不正确,可尝试调整两模块的调制频率、频偏、带宽等射频参数。如RF4432PRO和RF4463PRO模块的接收带宽与发射频偏设置不对应时,就会出现如图11的接收波形错误情况。 图11 433MHz 、1.2kbps、 30khz频偏下的RF4463接收波形 4.2 数据包模式接收
RF4432PRO模块和RF4463PRO模块互相接收波形正确,因此保留射频参数,将DEMO演示板的工作模式设为正常模式,看能否让芯片产生中断。发现没有RF4432PRO模块和RF4463PRO模块都没有产生接收中断。
分别将DEMO演示板设置成RF4432PRO正常发射、RF4463PRO测试接收,RF4463PRO正常发射、RF4432PRO测试接收,对比RF4432PRO和RF4463PRO发射的数据包波形,发现两模块的数据包格式设置不一致。
图12: 433MHz 、1.2kbps、20khz频偏下RF4432和RF4463发送数据包波形 经对比,发现4463的同步字与设置“0x2DD4”不符,而是“0xB42B”。且4432的前导码为“0101...”,不是之前默认的“1010...”。将两模块的数据包格式重新调整,用DEMO演示板正常模式通信。发现RF4432PRO和RF4463PRO模块都产生了接收中断。
图13:433MHz 、1.2kbps 、20khz频偏RF4463和RF4432中断
4.3总体流程图 图14: RF4432PRO和RF4463PRO通信调试流程图
五、实验结果
5.1 硬件结果 RF4463PRO工作在DEMO演示板的正常发射模式,RF4432PRO工作在DEMO演示板的正常接收模式。发送和接收的数据包数量显示在屏幕上。如图18,发送一段时间后没有丢包现象。
图15: RF4432PRO(左)与RF4463PRO通信实物图 5.2 软件结果
图19中4432IRQ为RF4432PRO中断引脚,4463IRQ为RF4463PRO的中断引脚。可见每个发送中断都有相应的接收中断。
图16: RF4432PRO和RF4463PRO通信中断 六、示例程序
实验的关键在于RF4432PRO和RF4463PRO模块的初始化设置部分,其余与相同模块间的通信程序一致。将以下测试可行的RF4432PRO和RF4463PRO模块初始化代码直接代入通信程序,即可实现RF4432PRO和RF4463PRO模块间的通信。本实验使用的完整测试程序可见深圳市思为无线科技有限公司官网的RF4432 DEMO CODE和RF4463 DEMO CODE。
6.1 RF4432PRO初始化示例
void SI4432_init(void)
{
ItStatus1 = spi_rw(0x03,0x00); // clr RF interrupt factor
ItStatus2 = spi_rw(0x04,0x00);
SpiWriteCfg(0x06|0x80, 0x00); // Set RF interrupt
SpiWriteCfg(0x07|0x80, SI4432_PWRSTATE_READY); // enter ready mode
SpiWriteCfg(0x09|0x80, 0x7f); // load cap = 12P
SpiWriteCfg(0x0a|0x80, 0x05); // output clk set
SpiWriteCfg(0x0b|0x80,0xea); // gpio0 for digital output
SpiWriteCfg(0x0c|0x80,0xea); // gpio0 for digital output
SpiWriteCfg(0x0d|0x80, 0xf4); // GPIO 2 = rx data
SpiWriteCfg(0x70|0x80, 0x2c);
SpiWriteCfg(0x1d|0x80, 0x40); // enable afc
// 1.2K bps setting
SpiWriteCfg(0x1c, 0x16); // according to Silabs's excel
SpiWriteCfg(0x20, 0x83);
SpiWriteCfg(0x21, 0xc0);
SpiWriteCfg(0x22, 0x13);
SpiWriteCfg(0x23, 0xa9);
SpiWriteCfg(0x24, 0x00);
SpiWriteCfg(0x25, 0x04);
SpiWriteCfg(0x2a, 0x14);
SpiWriteCfg(0x72, 0x20);
SpiWriteCfg(0x6e, 0x09);
SpiWriteCfg(0x6f, 0xd5);
SpiWriteCfg(0x70, 0x2c);
// 1.2K bps setting end
SpiWriteCfg(0x30|0x80, 0x88); // enable packet handler, msb first, enable crc,
SpiWriteCfg(0x32|0x80, 0xff); // 0x32address enable for headere byte 0, 1,2,3, receive header check for byte 0, 1,2,3
SpiWriteCfg(0x33|0x80, 0x4a); // header 3, 2, 1,0 used for head length, fixed packet length,
SpiWriteCfg(0x34|0x80, 64); // preamble = 64 nibbles
SpiWriteCfg(0x35|0x80, 0x20); // preamble detection = 20 bit
SpiWriteCfg(0x36|0x80,b4); // sync word = 0xb42b
SpiWriteCfg(0x37|0x80,2b);
SpiWriteCfg(0x38|0x80, 0x00);
SpiWriteCfg(0x39|0x80, 0x00);
SpiWriteCfg(0x3a|0x80, 's'); // tx header
SpiWriteCfg(0x3b|0x80, 'w');
SpiWriteCfg(0x3c|0x80, 'w');
SpiWriteCfg(0x3d|0x80, 'x');
SpiWriteCfg(0x3e|0x80, 10); // total tx 10 byte
SpiWriteCfg(0x3f|0x80, 's'); // check hearder
SpiWriteCfg(0x40|0x80, 'w');
SpiWriteCfg(0x41|0x80, 'w');
SpiWriteCfg(0x42|0x80, 'x');
SpiWriteCfg(0x43|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x44|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x45|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x46|0x80, 0xff); // all the bit to be checked
SpiWriteCfg(0x6d|0x80, 0x07); // maximum ouput power
SpiWriteCfg(0x79|0x80, 0x0); // non hop
SpiWriteCfg(0x7a|0x80, 0x0); // non hop
SpiWriteCfg(0x71|0x80, 0x22); // FiFo, FSK , not need clk
SpiWriteCfg(0x72|0x80, 0x50); // deviation: 50KHz
SpiWriteCfg(0x73|0x80, 0x0); // no frequency offset
SpiWriteCfg(0x74|0x80, 0x0); // no frequency offset
SpiWriteCfg(0x75|0x80,0x53);
SpiWriteCfg(0x76|0x80,0x57);
SpiWriteCfg(0x77|0x80,0x80); // frequency:433.5 MHz
}
6.2 RF4463初始化示例
const unsigned char RF_MODEM_CLKGEN_BAND_1_data[] = {RF_MODEM_CLKGEN_BAND_1};
//according to Silabs's wireless development suite
const unsigned char RF_FREQ_CONTROL_INTE_8_data[] = {RF_FREQ_CONTROL_INTE_8};
const unsigned char RF_POWER_UP_data[] = { RF_POWER_UP};
const unsigned char RF_GPIO_PIN_CFG_data[] = { RF_GPIO_PIN_CFG};
const unsigned char RF_GLOBAL_XO_TUNE_1_data[] = { RF_GLOBAL_XO_TUNE_1};
const unsigned char RF_GLOBAL_CONFIG_1_data[] = { RF_GLOBAL_CONFIG_1};
const unsigned char RF_FRR_CTL_A_MODE_4_data[] = { RF_FRR_CTL_A_MODE_4};
const unsigned char RF_PREAMBLE_TX_LENGTH_9_data[] = { RF_PREAMBLE_TX_LENGTH_9};
const unsigned char RF_SYNC_CONFIG_5_data[] = { RF_SYNC_CONFIG_5};
const unsigned char RF_PKT_CRC_CONFIG_1_data[] = { RF_PKT_CRC_CONFIG_1};
const unsigned char RF_PKT_CONFIG1_1_data[] = { RF_PKT_CONFIG1_1};
const unsigned char RF_PKT_LEN_3_data[] = { RF_PKT_LEN_3};
const unsigned char RF_PKT_FIELD_1_LENGTH_12_8_12_data[]={ RF_PKT_FIELD_1_LENGTH_12_8_12}; const unsigned char RF_PKT_FIELD_4_LENGTH_12_8_8_data[] = { RF_PKT_FIELD_4_LENGTH_12_8_8};
const unsigned char RF_MODEM_FREQ_DEV_0_1_data[] = { RF_MODEM_FREQ_DEV_0_1};
const unsigned char RF_MODEM_AGC_CONTROL_1_data[] ={ RF_MODEM_AGC_CONTROL_1};
const unsigned char RF_MATCH_VALUE_1_12_data[] ={ RF_MATCH_VALUE_1_12};
const unsigned char RF_MODEM_RSSI_COMP_1_data[] = { RF_MODEM_RSSI_COMP_1};
const unsigned char RF_MODEM_MOD_TYPE_12_data[]= {RF_MODEM_MOD_TYPE_12};
const unsigned char RF_MODEM_TX_RAMP_DELAY_8_data[]= {RF_MODEM_TX_RAMP_DELAY_8};
const unsigned char RF_MODEM_BCR_OSR_1_9_data[]={RF_MODEM_BCR_OSR_1_9};
const unsigned char RF_MODEM_AFC_GEAR_7_data[]={RF_MODEM_AFC_GEAR_7};
const unsigned charRF_MODEM_AGC_WINDOW_SIZE_9_data[]={RF_MODEM_AGC_WINDOW_SIZE_9}; const unsigned char RF_MODEM_OOK_CNT1_11_data[]={RF_MODEM_OOK_CNT1_11};
const unsigned char RF_MODEM_CHFLT_RX1_CHFLT_COE13_7_0_12_data[]= {RF_MODEM_CHFLT_RX1_CHFLT_COE13_7_0_12}; const unsigned char RF_MODEM_CHFLT_RX1_CHFLT_COE1_7_0_12_data[]
={RF_MODEM_CHFLT_RX1_CHFLT_COE1_7_0_12};
const unsigned char RF_MODEM_CHFLT_RX2_CHFLT_COE7_7_0_12_data[]=
{RF_MODEM_CHFLT_RX2_CHFLT_COE7_7_0_12};
const unsigned char RF_SYNTH_PFDCP_CPFF_7_data[]={RF_SYNTH_PFDCP_CPFF_7};
void SI4463_init(void)
{
U8 app_command_buf[20],i;
//spi_write(0x07, RF_GPIO_PIN_CFG_data);
app_command_buf[0] = 0x13; // SET GPIO PORT
app_command_buf[1] = 0x14; // gpio 0 ,Rx data
app_command_buf[2] = 0x02; // gpio1, output 0
app_command_buf[3] = 0x21; // gpio2, hign while in receive mode
app_command_buf[4] = 0x20; // gpio3, hign while in transmit mode
app_command_buf[5] = 0x27; // nIRQ
app_command_buf[6] = 0x0b; // sdo
spi_write(7, app_command_buf);
// spi_write(0x05, RF_GLOBAL_XO_TUNE_1_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x00;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x00;
app_command_buf[4] = 98; // freq adjustment
spi_write(5, app_command_buf);
// spi_write(0x05, RF_GLOBAL_CONFIG_1_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x00;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x03;
app_command_buf[4] = 0x40; // tx = rx = 64 byte,PH,high performance mode
spi_write(5, app_command_buf);
spi_write(0x08, RF_FRR_CTL_A_MODE_4_data); // disable all fast response register
// spi_write(0x0D, RF_PREAMBLE_TX_LENGTH_9_data); // set Preamble
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x10;
app_command_buf[2] = 0x09;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x08; // 8 bytes Preamble
app_command_buf[5] = 0x14; // detect 20 bits
app_command_buf[6] = 0x00;
app_command_buf[7] = 0x0f;
app_command_buf[8] = 0x32; // no manchest.1010...
app_command_buf[9] = 0x00;
app_command_buf[10] = 0x00;
app_command_buf[11] = 0x00;
app_command_buf[12] = 0x00;
spi_write(13, app_command_buf); //
// RF_SYNC_CONFIG_5_data, // set sync
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x11;
app_command_buf[2] = 0x05;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x01; // no manchest , 2 bytes
app_command_buf[5] = 0x2d; // sync byte3
app_command_buf[6] = 0xd4; // sync byte2
app_command_buf[7] = 0x00; // sync byte1
app_command_buf[8] = 0x00; // sync byte0
spi_write(9, app_command_buf);
// packet crc
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x80; // no crc
spi_write(5, app_command_buf);
// packet gernale configuration
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x06;
app_command_buf[4] = 0x02; // CRC MSB, data MSB
spi_write(5, app_command_buf);
// spi_write(0x07, RF_PKT_LEN_3_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x03;
app_command_buf[3] = 0x08;
app_command_buf[4] = 0x00;
app_command_buf[5] = 0x00;
app_command_buf[6] = 0x00;
spi_write(7, app_command_buf);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x0c;
app_command_buf[3] = 0x0d;
app_command_buf[4] = 0x00;
app_command_buf[5] = 14; //header(4)+10 bytes
app_command_buf[6] = 0x04;
app_command_buf[7] = 0xaa;
app_command_buf[8] = 0x00;
app_command_buf[9] = 0x00;
app_command_buf[10] = 0x00;
app_command_buf[11] = 0x00;
app_command_buf[12] = 0x00;
app_command_buf[13] = 0x00;
app_command_buf[14] = 0x00;
app_command_buf[15] = 0x00;
spi_write(16, app_command_buf); // set length of Field 1 -- 4
// spi_write(0x0C, RF_PKT_FIELD_4_LENGTH_12_8_8_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x12;
app_command_buf[2] = 0x08;
app_command_buf[3] = 0x19;
app_command_buf[4] = 0x00;
app_command_buf[5] = 0x00;
app_command_buf[6] = 0x00;
app_command_buf[7] = 0x00;
app_command_buf[8] = 0x00;
app_command_buf[9] = 0x00;
app_command_buf[10] = 0x00;
app_command_buf[11] = 0x00;
spi_write(12, app_command_buf);
spi_write(0x10, RF_MODEM_MOD_TYPE_12_data);
spi_write(0x05, RF_MODEM_FREQ_DEV_0_1_data);
spi_write(0x0C, RF_MODEM_TX_RAMP_DELAY_8_data);
spi_write(0x0D, RF_MODEM_BCR_OSR_1_9_data);
spi_write(0x0B, RF_MODEM_AFC_GEAR_7_data);
spi_write(0x05, RF_MODEM_AGC_CONTROL_1_data);
spi_write(0x0D, RF_MODEM_AGC_WINDOW_SIZE_9_data);
spi_write(0x0F, RF_MODEM_OOK_CNT1_11_data);
// spi_write(0x05, RF_MODEM_RSSI_COMP_1_data);
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x20;
app_command_buf[2] = 0x01;
app_command_buf[3] = 0x4e;
app_command_buf[4] = 0x40;
spi_write(5, app_command_buf);
spi_write(0x10, RF_MODEM_CHFLT_RX1_CHFLT_COE13_7_0_12_data);
spi_write(0x10, RF_MODEM_CHFLT_RX1_CHFLT_COE1_7_0_12_data);
spi_write(0x10, RF_MODEM_CHFLT_RX2_CHFLT_COE7_7_0_12_data);
// RF_PA
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x22;
app_command_buf[2] = 0x04;
app_command_buf[3] = 0x00;
app_command_buf[4] = 0x08;
app_command_buf[5] = 127; // set max power
app_command_buf[6] =0x00;
app_command_buf[7] = 0x3d;
spi_write(8, app_command_buf);
spi_write(0x0B, RF_SYNTH_PFDCP_CPFF_7_data);
// header match
app_command_buf[0] = 0x11;
app_command_buf[1] = 0x30;
app_command_buf[2] = 0x0c;
app_command_buf[3] = 0x00;
app_command_buf[4] = 's';
app_command_buf[5] = 0xff;
app_command_buf[6] = 0x40;
app_command_buf[7] = 'w';
app_command_buf[8] = 0xff;
app_command_buf[9] = 0x01;
app_command_buf[10] = 'w';
app_command_buf[11] =0xff;
app_command_buf[12] =0x02;
app_command_buf[13] = 'x';
app_command_buf[14] = 0xff;
app_command_buf[15] = 0x03;
spi_write(16, app_command_buf);
spi_write(5, RF_MODEM_CLKGEN_BAND_1_data);
spi_write(12, RF_FREQ_CONTROL_INTE_8_data); // set frequency =433.5
7 总结
本文描述了深圳市思为无线科技有限公司的无线收发模块通信RF4432PRO和RF4463PRO间的详细实现过程、硬件接口和示例程序,经实验验证可行。实现通信的基本方法是将RF4432PRO和RF4463PRO设置相同射频参数及数据格式。这个方法也可以引申至其他不同无线模块和无线芯片的通信。如遇到与文中不同的实验现象,对实验过程有疑问或其他想法欢迎与我们进行技术交流。
|