CC2650开发板DIY之六——TI CC2650的独门秘技bootloader
一、PCB设计和布线
续上一篇,完成了原理图设计,不过中间发现有些问题,想澄清一下。其中一个问题关于CC2590射频芯片的阻抗匹配问题在德仪在线上提问后回复说找伙伴去搞清楚,还没给信,等啊等,所以没有布线。把原理图初稿先贴上,请大家拍砖。
抽空先说说和开发板想实现的一个程序再入有关的功能吧。
二、BootLoader
在CC2650的开发中,需要了解Booting Sequence,并且要能够用这个功能实现CC2650最具有独特性的功能,就是多协议栈兼容的模式。
在通常的芯片开发中,项目开发完成后,形成最终产品后,不会再有想法去再次刷写内存去实现新的功能,也就是说在硬件设计完成后,把软件烧写在内存中后,不会再有冲动去完全改变产品的性能,实现其他不同的功能。这是因为,芯片内的软件是可以随时升级,那么只是为了更好地升级实现原有的功能,而不会再去执行其他的功能,因为即使有这样的想法,硬件已经完成了,这样的想法也就不可能了。
但是再CC2650,这样的想法不仅可能,而且应该是必须的。否则,选择其他的芯片就足够了,而且还会更便宜。(TI就是习惯搞些高大上的东西去挑战大家的想象力)那个怎么可能呢?
因为CC2650支持同时支持多个基于2.4GHz的无线射频通讯协议,其中以BlueTooth和ZigBee应用最广泛。这两种协议完全具有不同的特点,因此是不可以同时运行的,但是因为所以这些协议都是基于2.4GHz,因此有关射频部分的硬件设计是相同的,一般情况下,控制都是通过GPIO的访问来实现的,基于ARM的指令系统和电气性能对于输出端口的外部设备是完全相同的,那么硬件一致了,就使得软件更新使用不同的通讯协议成为可能。在CC2650中,可以采用的程序再入,就是可以通过BOOTLOADER的功能来实现的。在CC2540中,还有一种TI的专有技术是OAT,Over Air Download,就是在内存中先把一个块的内容写到另一个块中的内存写入方法,这个就更有些意思,不过好像在CC2650的资料中没有找到有关的介绍。下面简单介绍一下CC2650的Bootloader。
三、BOOTLOADER的启动和使用
BOOTLoader是通过串口写入,由常驻的ROM来实现的,实现BootLoader的芯片有CC2538,CC13XX和CC26XX系列,可以实现擦除和写入Flash内存的功能,选择的串行通讯协议可以是UART也可以是SPI,这样就可以有多种方式来作为主体程序。
常驻的bootloader是在Power-on启动后自动启动的。启动条件是自检发现flash中没有有效地应用映像img,这个有用的映像是由自定义区域的CCA/CCFG值来确定的。还有一种情况,就是bootloader的后门使能为有效,同时有关的引脚设置为正确的逻辑关系。当bootloader被激活时,在上电启动后10ms与外部的主机进行通讯。
在CC26xx中,用户自定义区域是CCFG,在flash的最高地址页,因此CCFG的绝对地址有芯片的flash容量来决定的,对128KB容量的CC2650来说,CCFG地址为0x0001.FFD8,为了便于方位,对各种容量的芯片,在0x5000.3000也有一个只读的映像区域,可以读取CCFG的数值。
采用UART或SPI通讯,所采用的数据包的结构是相同的。Bootloader所采用的芯片引脚是不同的,对于CC2650RGZ来说,UART_RX对应DIO2,UART_TX对应DIO3,SPI_CLK对应DIO10,SPI_CSn对应DIO9,SPI_MOSI对应DIO11,SPI_MISO对应DIO12。对于UART或者SPI的选择,bootloader自动选择首先激活的端口,并自动屏蔽另一个端口。如果希望更换端口,要重新启动一次。
对于不同的端口,有满足事先设定的端口参数值才能满足要求,对于内存的访问,有对应的命令来实现。为了便于实现bootload的功能,TI还提供了SBL库供开发者引用。同时还提供了范例项目演示这个功能的实现,
和主控主机的连接如下图
四、应用bootloader功能的程序再入
通过对于bootloader功能的描述,是希望说明在cc2650,,TI提供了一个其他芯片所不具有的可能性,就是在硬件确定的情况下,能够很容易地实现对于协议栈和应用程序的快捷升级和变化,只需要在上电时能够启动bootloader,就可以在蓝牙和Zigbee之间自如切换。
这个也是前文提出的NapOS的设计基础,只有在CC2650的开发平台上,才可以很方便地实现程序再入,在运行的过程中把内存中指定区域内存的数据写入另一个区域,在启动bootloader实现程序更新和自动启动新程序,从而切换成另一个不同的射频协议和控制方式。