1. 概述OM6220是北京昂瑞微电子技术有限公司(以下简称“昂瑞微”)2020年推出的一款2.4G收发芯片。是HS6200的增强版本,另外加入了很多新的功能。本使用手册是针对OM6220如何用来做BLE短包广播,BLE长包广播和扫描BLE广播包的应用。需要注意的是,OM6220有改版过,第一版的时候有些功能不是很好用,后面改版的时候修正了,旧版本的chip id小于0x0624,新版本的chip id在0x0624或者以上。所以程序里面初始化完成RF之后,先读取chip id,在根据chip id的情况分别走不通的流程,不过初始化都是一样的流程,只是后面使用的时候不太一样。 OM6220不管是旧版本还是新版本,做为广播发送的时候都是一样的使用。只是做为广播扫描的时候是有区别的,旧版本扫描到的广播包的内容是全部放入RX Payload里面的,实际的Payload只有32个字节,然而扫描下来的数据还包括了广播设备的6字节地址。所以实际只有32-6=26个字节的广播内容,也就是说超过这个长度的内容就没有办法读取出来,标准BLE广播包最长是31个字节的广播内容(不包括广播设备的地址)。新版本的OM622就解决了这个问题,广播包的header是在RX_HEADER读取的,广播设备的地址是在RX_ADVA_ADDR寄存器读取的,真正的广播包内容就在RX FIFO里面去读取,所以就可以接收完整的31个字节的广播包。 另外,旧版本的OM6220不能配合SPI速度比较低的MCU来使用,否则容易错过空中数据。新版本的OM6220由于接收内容的分开,所以可以配合SPI速度比较低的MCU来使用,目前测试SPI速率低到50k的都可以正常使用。还有一个是新版本的OM6220加入了8B状态机复位命令和D9这个CE脉冲命令,可以解决出错时死机的问题。 OM6220支持3线SPI和4线SPI,可以通过软件配置,不需要硬件决定。3线SPI的时候是CNS和SCK不变,区别在MOSI,4线时是数据输出,3线时是数据输入输出,所以3线是这个口要注意做输入输出的切换。
2. OM6220 SPI驱动编写介绍刚才前面有提到OM6220支持3线SPI和4线SPI,是可以通过软件配置来实现切换的。使用4线SPI的时候,可以配合MCU的硬件SPI速度快,也可以使用模拟的4线SPI,速度就慢一些,但是3线SPI就只能是模拟的了。在编写3线SPI驱动的时候一定要注意,SDIO (MOSI脚)这个脚是写的时候做为输出,读的时候做为输入,有些人写驱动的时候,再读这个操作的时候容易搞错,不知道读的是哪一个脚的电平,这个要特别注意。我们提供的SDK里面已经做好了硬件4线SPI,软件模拟4线SPI,以及软件模拟3线SPI的驱动,客户只需要修改bsp_spi.h这个文件里面的宏定义即可。SDK是基于STM32F103RBT6来写的,开发板上面有2个RF模块接口,所以客户会看到有RF端口选择这个宏,但是这个开发板已经没有了,不提供给客户,客户需自行找开发板。包括是否使用IRQ脚,是否硬件控制CE,都是宏控制的。
图表 1 OM6220的SPI驱动配置 下图是SPI操作的接口函数,最终对外使用的是SPI_SendByte和SPI_ReadByte函数,这两个函数里面就区分了硬件SPI还是软件SPI,是3线还是4线。 图表 2 SPI操作的接口函数 图表 3 封装起来后的对外SPI读写函数 客户移植的时候主要是针对下面这些函数进行移植,这些函数也是真正跟底层有关的。 1.SPI_Configuration()初始化配置SPI,不管是硬件还是模拟的IO口的初始化配置。 2. SPI_ce_write()操作CE拉高拉低的函数,不管是硬件控制还是寄存器控制。 3. SPI_csn_write()操作CSN拉高拉低的函数。 4. SPI_sck_write()操作SCK拉高拉低的函数。 5. SPI_mosi_write()模拟SPI的时候MOSI拉高拉低的操作。 6. SPI_mosi_read()和SPI_miso_read()模拟4线和3线SPI的时候数据输入脚的信号读取函数。 7. hw_4wire_spi_wrd()硬件SPI时的SPI读写操作函数。 8. sw_4wire_spi_wrd()软件模拟4线SPI时的读写操作。 9. sw_3wire_sendbyte()3线模拟SPI时的写函数。 10. sw_3wire_readbyte()3线模拟SPI时的读函数。 11. sw_3wire_gpio_Switch_Dir()3线模拟SPI是SDIO脚的输入输出配置切换函数。 3. OM6220读写RF寄存器的操作bsp_spi_rf.c/.h这2个文件是最基本的操作RF的SPI读写寄存器和写命令的操作接口,要操作RF,都是要基于这些函数的基础上去实现的。下面是接口函数的介绍。 1.SPI_Operation()这个函数是写命令的函数,像清fifo这样的操作,就是在CSN拉低拉高的过程中值王里面写一个字节。 2. SPI_wr_cmd()这个函数是在切换bank的时候用的,主要是这个函数的操作不用或上0x20这个写寄存器的命令。 3. SPI_write_byte()和SPI_wr_buffer()这2个函数是写1个字节和写多个字节操作的函数。 4. SPI_read_byte()和SPI_read_buffer()这2个函数是读1个字节和读多个字节操作的函数。 4. OM6220操作RF函数接口介绍bsp_rf.c/.h这2个文件是RF操作的接口,包括初始化RF,bank切换,切换通信地址,切换发射功率,切换通信频点,设置晶体负载电容值,开启/关闭数据白化功能,获取芯片chip ID,切换RF工作模式,清状态寄存器,清TX FIFO/RX FIFO,批量配置寄存器,发送数据包,读取数据包,进入和退出睡眠的操作,打印RF所有寄存器配置等等。详细的可以看bsp_rf.h。 图表 4 操作RF的接口函数 这里还需要注意一下的是RF初始化的函数,下图框出来的地方,软件复位初始化RF之后,如果等了35ms都没有查询到校准完成标志,则需要重新复位初始化RF避免因为SPI时序的问题导致RF初始化不成功,从而死在等校准标志的地方。下面是介绍如何将OM6220初始化配置成BLE模式。 图表 5 OM6220初始化校准并配置成BLE模式函数 FEATRUE寄存器的bit6是BLE使能位,为1就是启用BLE模式,bit4是高斯滤波器的使能位,BLE模式下需要使能。 EN_AA寄存器要置0,不能启用自动应答。 CONFIG_EXT寄存器配置边写边发送功能。 TX_ADVA_ADDR是配置OM6220做为广播设备时的设备地址,6个字节地址。 CRC_INIT这个寄存器的值默认初始化为3个0x55即可。 ACCESS_ADDR是广播访问地址,BLE广播的时候固定是0x8e89bed6。 BLE_CTL是设置工作模式。7:event abort,6:md dsb,5:nesn sn dsb,4:infiniterx, 3~0:3-ble broacast,5-ble connection,9-ble tx test,b-ble rx test。 5. OM6220的测试程序从main函数初始化完之后,所以的SDK都是按照test_app();的入口进入测试程序的。进来之后再选择是发载波,还是发BLE广播,还是扫描BLE广播。 5.1 OM6220载波测试载波测试可以看出RF射频信号的频偏,调制信号看不出频偏。1M速率的时候频偏在±160k范围内是可以的,当然频偏越小越好。注意做为BLE广播的时候,频偏最好控制在±30k以内。控制OM6220发送载波的位是在RF_SETUP这个寄存器的bit7,这个位设置为高,CE拉高就发载波,CE变低了就没有载波。然后频点根据客户需要去设置,可以通过调整OM6220内部寄存器来调整频偏。当然内部寄存器可调整的范围有限,不是并不是所有的板子或者说晶振都可以通过调整内部寄存器来把频偏调整回来,这个跟硬件关系很大,确实调不过来的只能在外部加晶体试试或者是换晶体试试。内部寄存器的值是从0到15可调。注意看频偏的时候频谱仪的SPAN要打到百k级,比如200k,这样看频偏才准。注意是要使用max hold的方式抓住载波信号,然后再通过peak其看载波顶点才能看出频偏是偏多少。当然一开始测试的时候如果是打到百k级的SPAN,可能你会看不到信号可以先设置到10M,去抓到频点的peak之后再设置中心频率到peak点,然后再设置SPAN到百k级。从下图中可以看出,数值越大频率越往小走,数值越小频率越往大走,然后步进值不是等幅步进的,数值从小到大变化的时候步进幅度越来越小。下面的测试是循环修改晶体负载电容值测出来的,实际如果固定一个频点的话,是只有一个载波信号出来的。从下图中可以看出,当设置寄存器值为1的时候测的频偏最小,只偏了300hZ。 图表 6 OM6220载波测试图片 图表 7 OM6220载波测试代码 5.2 OM6220发BLE短广播包的操作OM6220发BLE短广播(标准广播包,最长的广播包内容31字节)的操作。这个操作也很简单,代码里面要把OM6220_LONG_PACKET_ADV这个宏关闭,不使用长包广播功能。然后是确定好要发送的广播包的内容,根据格式填写好数组,然后清FIFO清状态寄存器,设置频点,填写广播包头,填写广播数据到TX FIFO,然后激活发送,等待发送完成。然后再延时至少25ms,再次发送。不能太频繁的发送。广播包的内容里面的AdvA(广播地址),不需要管,默认为00就行。 图表 8 OM6220的BLE短广播包的内容 图表 9 OM6220发BLE广播包的操作以及睡眠低电流数据 5.3 OM6220发BLE长广播包的操作OM6220发BLE长广播(最长的广播包内容249字节)的操作。这个操作有点难度,而且对SPI的速度有要求(需要硬件4线SPI速度在2M或者以上,8M以下,效率不要太低)。代码里面要把OM6220_LONG_PACKET_ADV这个宏打开,使用长包广播功能。然后是确定好要发送的广播包的内容,根据格式填写好数组,然后清FIFO清状态寄存器,设置频点,设置边写边发以及半空中断,填写广播包头,填写广播数据到TX FIFO,然后激活发送,然后查询半空中断补填FIFO数据,直到所有的数据填写完,等待发送完成,恢复边写边发配置。然后再延时至少25ms,再次发送。不能太频繁的发送。广播包的内容里面的AdvA(广播地址),不需要管,默认为00就行。(为了截图完整,把代码里面的分行等去掉了,格式不是那么好看,但是SDK里面不会去掉分行,保持代码美观)。 第一张图是长广播包的内容,第二张图是发长广播包的操作,以及睡眠时候的低电流,还有抓包器所抓到的空中包的内容。 图表 10 OM6220长广播包的内容 图表 11 OM6220发长包广播的代码,睡眠低电流,以及抓包器抓到的内容 5.4 OM6220扫描广播包(无白名单)的操作OM6220扫描广播包,没有白名单的情况下,新版本芯片和就版本芯片都可以,不过新版本和旧版本是有区别的,前面有提到过,就是广播包的内容读取的位置不一样,广播包的长度是有区别的,可以回头去看看。 图表 12 OM6220扫描广播包,无白名单的操作代码 5.5 OM6220扫描广播包(有白名单)的操作新版本的OM6220才有白名单的功能,且只有最多2个白名单可以设置,设置好之后,非白名单之外的数据不会被收取下来。设置白名单地址的两个寄存器是是WHITE_LIST_RXADDR_1和WHITE_LIST_RXADDR_2,同时需要把BLE_CTL寄存器改成0x07,就是过滤扫描模式,如果中途需要取消白名单,则把BLE_CTL寄存器改成0x06。 图表 13 OM6220收取白名单内的广播包的代码 图表 14 OM6220收取白名单内的广播包+串口打印 5.6 OM6220广播和扫描来回切换的操作OM6220做LBE广播和扫描的模式,初始化配置都是一样的流程,不同的是CONFIG寄存器和BLE_CTL寄存器。CONFIG寄存器的bit0是控制发送还是接收模式,BLE_CTL是控制广播还是扫描模式等。强烈建议这种应用要使用新版本的OM6220的芯片,也就是chip id大于0x0624的芯片(chip id通过OM6220_Get_Chip_ID这个函数来读取)。在模式切换的时候先拉低CE,然后再切换,切换完之后发一个8B的命令复位状态机(新版本的芯片)。然后处于扫描模式下要一直去读取状态寄存器的值,看是否有扫描到数据,如果有扫描到数据就及时取走数据。有客户在使用的时候,由于扫描模式下是间隔5~6ms去读取状态寄存器的,导致错过了空中广播数据,认为是我们芯片扫描不到或者扫描性能不行,其实不是的,就是因为他没有实时在读取状态寄存器,及时取走数据导致的。做为发广播的时候,三个频点都要去发,而且不要只发一次,这样扫描端扫描到的几率才会高。当然目前做为扫描的时候OM6220只是在37信道扫描而已,客户也可以改成扫描一段时间之后切换到38信道扫,然后切到39信道去扫,但是在一个信道扫描的时间不要太短,否则会扫不到。不会使用的客户不建议切换信道扫了,就一个信道扫就行了。 图表 15 OM6220做广播和扫描来回切换的操作代码 5.7 OM6220广播模式下底电流功耗测试数据下面这几张图都是在发BLE广播的模式下测试的,不管是发BLE广播还是发2.4G数据,睡眠时候的低电流是一致的。第一张图是OM6220只设置进入睡眠模式,没有关晶体的睡眠低电流数据。第二张图是OM6220设置了睡眠模式并且关闭了晶体,而且是没有接逻辑分析仪(没有漏电)的睡眠低电流。第三张图是OM6220设置了睡眠模式并且关闭了晶体,而且接逻辑分析仪(有漏电)的睡眠低电流。 图表 16 OM6220只进入睡眠模式,没有关闭晶体,没有接逻辑分析仪的功耗 图表 17 OM6220只进入睡眠模式,关闭晶体,没有接逻辑分析仪的功耗 图表 18 OM6220只进入睡眠模式,关闭晶体,接逻辑分析仪的功耗 5.8 OM6220扫描模式下功耗测试数据以下测试数据是新版本的OM6220,chip id=0x0625测试的数据,由于扫描模式下没有去睡眠,所以低功耗会比发射模式下的有睡眠的底电流要高,然后由于是使用D9命令来启动接收的,所以接收到数据之后功耗就降下来了,只有重新发D9命令进入扫描的时候功耗才再次上去,一直处于扫描模式下的峰值电流大概是17mA左右。 图表 19 OM6220扫描模式下的大概平均功耗 图表 20 OM6220处于扫描模式下的峰值电流 图表 21 OM6220处于扫描模式下的底电流
|