赞
踩
经过长期的测试,我惊奇的发现,e70模块在传输距离和质量上多么的不足(心疼我研究的时间,下次一定先测距离),于是我转移了重心到另一组模块上RF4463F30(思为无线),这同样是半双工模块,然后通讯质量却让我震惊,首先是速度,其次是距离,再三是稳定性,最后是可调节性。价格相近,性能优越,再加上充分的技术支持,OMG,买它!!!。
虽然后期官方给我提供了stm32的例程,但是前期我用的官方提供的vc的例程,因此给了我较大的发挥空间和理解工程的机会。本文主要讲解如何将vc的例程转为stm32的例程。
以下信息来自模块的介绍手册,想详细了解的请去官网下载。
链接:官网4463页面
首先我放出这个模块的基础工作外围电路
(作为软件开发,我最关心的的就是可操作的IO口了):
从上图来看,主要的控制IO口一共是7个,这7个IO具体的功能如下:
其中的SDI,SDO,SCK接入单片机时可以直接配置外设的SPI,nIRQ作为中断信号脚需配置为下拉输入(建议再配置外部中断),
SDN 作为芯片开关,对接单片机时应采用推挽输出,nSEL 同样是推挽输出。
接着附上引脚图:
最后贴上手册里描述的产品特点:
这些我觉得跟软件开发没什么关系,我就不介绍了。
这个模块的参数可以手动修改初始化程序里的spi写入部分,也可以直接使用厂家提供WDS配置软件,详细操作我不描述了,请购买后自行参照厂家提供的操作手册,我重点说一下几个核心:
实际通讯频率是:主频率+偏移频率*倍数。 请确保通讯的模块工作频率相同(频率越高速度越快,通讯距离约近,频率越低速度约慢,通讯距离和抗干扰性越强)。具体选择什么频率请根据实际工作需求进行抉择。
空速和频率决定模块的实际通讯速度。 这一部分我只建议修改这两处,其余还是选择默认值为好,其中根据官方技术支持的建议:当空速低于19200时,频率填5khz,当空速高于19200时,频率填10khz,平时建议空速低于38400,如果高于38400则建议提高频率到15khz。 我追求高速传输因此选择了空速是115200,频率为20khz。
点击这个按键,然后选择第二项:保存头文件。
然后你就可以获得一个头文件:radio_config_Si4463.h
注意,这个头文件不能直接替换,一共有4处修改地方,两处是在头文件里,两处是在例程里。
这一处要注释掉,很好理解吧。
很关键的修改,千万不能忘记,否则将直接导致模块发烫甚至损毁(我前期操作不当,损失了一块stm32)
我也不知道这是什么,反正就是这一处,原来是8,生成的文件里是10
同理,另外这个high_speed 是我自定义的,原理如下:
其中_n结尾的是原始的头文件,另一个是我自己生成的头文件我区分了名字都放在一个目录下(能看明白吧)
下文将对官方提供的例程做一个简单注解,并重点描述关键函数和关键参数
void sdn_reset(void) { U8 i; i = 0; while(i!=0xff) i = check_cts(); //新增优化 SDN_1; delay_1ms(2); SDN_0; delay_1ms(10); nSEL_1; SCK_0; nSEL_0; for (i = 0; i< 7; i++) spi_byte(RF_POWER_UP_data[i]); nSEL_1; delay_1ms(20); }
sdn_reset 这个函数是用于复位4463模块的其中有一个关键点就是这部分代码:(注释为新增优化的部分)
while(i!=0xff)
i = check_cts(); //新增优化
这块代码是用于让spi通讯纯净化的,可以防止残留的错误spi数据影响对模块的读写。在例程里对spi操作的所有地方都有这个代码块(我获得的例程里在这一部分没有这个代码块,请自行核对检查)。4463模块有一个特点如果spi初始化参数没有写入成功(一段对IO口电平配置的程序写入失败),按着原始的参数进行工作,那么模块就会发烫。这里也是一处很重要的操作。(原始例程里少了这一块,我恰好环境里噪声多,因此初始化失败,持续发烫导致我损耗一块元器件)
void SI4463_init(void) { U8 app_command_buf[20]; //spi_write(0x07, RF_GPIO_PIN_CFG_data); app_command_buf[0] = 0x13; // SET GPIO PORT app_command_buf[1] = 0x21; // gpio 0 ,Rx data//0 app_command_buf[2] = 0x20; // gpio1, output 0//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] = 0x31; // 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] = 0x81; // CRC = itu-c, enable 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。