# Contiki(TI CC26XX)入门 本文档让你能够在TI的CC26xx上使用Contiki。该平台支持多个评估板: 能够兼容CC26xx或CC13xx评估模块的SmartRF 06评估板(相关文件和驱动程序在`srf06/`路径下) * CC2650 SensorTag 2.0(相关驱动程序在`sensortag/cc2650`路径下) * CC1350 SensorTag 2.0(相关驱动程序在`sensortag/cc1350`路径下) * CC2650 LaunchPad(相关驱动程序在`launchpad/cc2650`路径下) * CC1310 LaunchPad(相关驱动程序在`launchpad/cc1310`路径下) * CC1350 LaunchPad(相关驱动程序在`launchpad/cc1350`路径下) 两个平台通用的CPU代码在`$(CONTIKI)/cpu/cc26xx-cc13xx`路径下。 **该端口**是在CC2650s上开发和测试的,但是也能在CC2630上工作。欢迎提供这两种芯片的错误报告。CC2630以及CC13XX芯片是没有BLE功能的。该端口只适用于7x7mm封装的芯片。 在使用本文档之前您需要对如何使用命令行和在UNIX系列操作系统上执行基本管理任务有基本的了解。 ## 端口特性 该平台具有以下主要功能: * 深度睡眠保持RAM的超低能耗。 * 在IEEE中支持CC26xx RF以及BLE模式(由于Contiki不提供BLE协议栈所以支持BLE是很有意义的)。 * 支持CC13xx pro 模式:IEEE 802.15.4g兼容 sub GHz操作 在硬件支持方面,已经实现了以下驱动程序: * SmartRF06 EB 外设 * LEDs * 按键 * 通过XDS100v3反向通道连接的UART * SensorTag 2.0 * LEDs * 按键(其中一个按剪可以用作关机按键) * 干簧管继电器 * 运动处理单元(MPU9250-加速度计,陀螺仪) * BMP280传感器 * TMP007传感器 * HDC1000传感器 * OPT3001传感器 * 蜂鸣器 * 外部SPI闪存 * LaunchPads * LEDs * 按键 * 外部SPI闪存 ## 要求 您需要使用的端口: * TI的CC26xxware源文件。当您复制Contiki时,正确的版本会作为子模块自动安装。 * TI的CC13xxware源文件。当您复制Contiki时,正确的版本会作为子模块自动安装。 * Contiki可以使用附带的[cc2538-bsl](https://github.com/JelmerT/cc2538-bsl)脚本通过串口自动将固件下载到节点。 注意,通过串口下载不适用于Sensortag,这时您可以使用TI的SmartRF Flash编程器。 * 编译固件的工具链:**该端口**由ARM嵌入式处理器的GNU工具([https://launchpad.net/gcc-arm-embedded](https://launchpad.net/gcc-arm-embedded))开发和测试。当前推荐的版本以及Contiki对Travis的回归测试使用的版本如下所示。 ``` $ arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.2.1 20151202 (release) [ARM/embedded-5-branch revision 231848] Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ``` * srecord([http://srecord.sourceforge.net/](http://srecord.sourceforge.net/)) * 你可以在CC2538DK readme 中的驱动程序这一节["Drivers" in the CC2538DK readme](https://github.com/contiki-os/contiki/tree/master/platform/cc2538dk#drivers)查看其它驱动程序,以便让SmartRF与您的操作系统进行通信以及使用芯片的UART的I/O口。 ## 例程 **该端口**有三个例程: * 一个用于演示如何读取传感器以及如何使用开发板外围设备的基础例程。这个例程也演示了如何发送BLE广播。 * 一个包括CoAP服务器,连接并发布到IBM快速启动服务的MQTT客户端,基于网络的UART以及最后一个可用于配置其余示例的Web服务器的高级例程。 * 一个展示深度睡眠的例子。 想详细了解这三个例程你可以查看它们的readme文件。 ## 编译你的第一个例子 建议你从`examples/cc26xx/`下面的`cc26xx-demo`开始你的学习。这是一个非常简单的例子,可以帮助您熟悉硬件和环境。该示例可在Sensortag和SmartRF06 EB上运行。 严格来说,要想编译它,你需要运行`make TARGET=srf06-cc26xx BOARD=srf06/cc26xx`。但是在该示例目录下包含一个Makefile.target自动包含了该目录,并且指定了正确的`TARGET=`参数,同样将`BOARD=`环境变量默认为`srf06/cc26xx`(SmartRF06 EB + CC26XXEM)。所以对于cc26xx目录下的示例,以及使用SmartRF06 EB时,您只需要运行make就行了。 `BOARD`变量的其他编译选项有: * Srf06+CC26xxEM:设置`BOARD=srf06/cc26xx` * Srf06+CC13xxEM:设置`BOARD=srf06/cc13xx` * CC2650 tag:设置`BOARD=sensortag/cc2650` * CC1350 tag:设置`BOARD=sensortag/cc1350` * CC2650 Launchpad:设置`BOARD=launchpad/cc2650` * CC1310 Launchpad:设置`BOARD=launchpad/cc1310` * CC1350 Launchpad:设置`BOARD=launchpad/cc1350` 如果`BOARD`变量没有设置,将会编译用于Srf06 CC26XXEM的镜像文件。 如果例程正在编译,这个时候你想切换平台编译,在你切换平台编译之前必须执行`make clean`,否则将导致链接器错误。 至于`cc26xx-demo`例程在做什么你可以查看它的readme文件详细了解。 如果你需要生成程序编译的汇编列表,请运行`make cc26xx-demo.lst`。汇编列表对你调试或优化应用程序代码很有用。要在汇编列表中插入C源代码,您需要通过添加`CFLAGS += -g`到项目的Makefile中使编译器包含调试信息然后运行`make clean cc26xx-demo.lst`重新编译。 ## 下载程序到设备 在Windows上你可以使用TI的[SmartRF Flash Programmer](http://www.ti.com/tool/flash-programmer)(FLASH-PROGRAMMER-2)对设备进行编程。 在Linux和OS X上,您可以通过芯片的串口ROM bootloader对设备进行编程。当然你需要满足以下条件: * 开发板可以支持bootloader。对于可以搭载CC26xx/CC13xx EM的SmartRF06EB 以及LaunchPads是支持bootLoader,Sensortag不支持。 * 芯片没有下载其他有效的程序,或者程序的bootloader后门程序被没有上锁。这时你需要在你的程序中启用bootloader的后门程序,并且在`contiki-conf.h`中定义宏`ROM_BOOTLOADER_ENABLE`为1。 您需要手动启用bootloader,并使用`.upload`来编译目标文件(例如对于cc26xx-demo就`make cc26xx-demo.upload`)。在SmartRF06上,您需要按住select按钮来复位EM(EM RESET按钮)进而启动bootloader。对于LaunchPad,您需要按住`BTN_1`重置芯片来启动bootloader。你可以修改`boar.h`中的宏`SET_CCFG_BL_CONFIG_BL_LEVEL`和`SET_CCFG_BL_CONFIG_BL_PIN_NUMBER`来更改引脚及其相应的电平(高/低),进而触发bootLoader模式。 串口下载器脚本会自动选择第一个可用的串行端口。但是这个端口可能不是连接我们开发板的端口,这时你可以通过定义脚本中的`PORT`参数来强制脚本使用特定端口。例如`make cc26xx-demo.upload PORT=/dev/tty.usbserial`。 有关串口bootLoader的更多信息,请参阅`tools/cc2538-bsl`目录下的`README`。 ## CC13xx/CC26xx基于UART的边界路由 开发平台可以用作边界路由器(基于UART的SLIP)。在目录`examples/ipv6/rpl-border-router`下的示例代码就是做这件事的。此示例定义了以下内容: ```C #ifndef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 140 #endif #ifndef UIP_CONF_RECEIVE_WINDOW #define UIP_CONF_RECEIVE_WINDOW 60 #endif ``` 对于用作边界路由器,CC26xx端口比其他平台具有更高的功能。因此,在编译示例之前,建议删除上面的两个配置指令。这将允许平台默认值生效,从而提高性能和稳定性。 您还需要根据需要定义`RF_CORE_CONF_CHANNEL`来选择正确的通道。 ## CC13xx/CC26xx串口协议广播(slip-radio)以及6lbr 开发平台还可以基于UART作为串口协议广播,与[6lbr](http://cetic.github.io/6lbr/)一起使用。 与边界路由器配置类似,您需要删除限制uIP缓冲区大小的宏定义。即在`examples/ipv6/slip-radio/project-conf.h`路径下删除下面两行。 ```C #undef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 140 ``` 不要忘记根据需要定义`RF_CORE_CONF_CHANNEL`来选择正确的通道。 ## Contiki和CC26xxware之间的文件名冲突 在Contiki和CC26xxware中都有一个名为`timer.c`的文件。我们现在的配置是不使用CC26xxware中的`timer.c`文件。但是,如果在某些您需要使用它的时候,要按住以下方式对它进行重命名: 从`cpu/cc26xx/lib/cc26xxware/driverlib/timer.c`到`driverlib-timer.c` ## Sensortag UART的使用(有或没有调试器Devpack) 在Sensortag中有两种可以进行调试输出(printf等)的方法。 * 购买调试器Devpack并在contiki-conf.h或project-conf.h中设置宏`BOARD_CONF_DEBUGGER_DEVPACK`为1。保证调试器Devpack在修订后的1.2.0版本上运行。 * 如果你有一个较旧的(1.0.0版本的)Devpack,你需要做上面宏的设置来修改`board.h`,以便正确设置RX和TX DIO映射。(TX映射到`IOID_28`,RX映射到`IOID_29`)。 * 如果您没有或者不想用调试器Devpack,可以使用SmartRF并修改P408上的跳线配置,如 E2E上[this thread](https://e2e.ti.com/support/wireless_connectivity/zigbee_6lowpan_802-15-4_mac/f/158/p/411992/1483824#1483824)所述 。为了使其工作,您需要设置`BOARD_CONF_DEBUGGER_DEVPACK`为0。 ## IEEE与Sub-GHz操作 该平台支持两种操作模式,只要芯片也具有相应的功能。如果没有特殊设置平台将默认 为CC13xx设备的Sub-GHz模式而不是IEEE模式。要强制设置为IEEE模式,您需要将下面的宏添加到您的`project-conf.h`。 ```C #define CC13XX_CONF_PROP_MODE 0 ``` ## 低功耗运行 该平台充分利用CC26xx的省电功能。以下简单描述了它是如何工作的: * 当RF正在发送时,CPU会进入睡眠模式,在TX完成发送后才继续工作。 * 当Contiki事件队列中没有事件时,芯片会进入“some”低功耗模式(下面有更多描述)。 我们不使用预定义的功率配置文件(例如,如TRM中提到的或者像我们在CC2538上使用的LPM1,LPM2等一样)。每次进入低功耗运行时,我们要么使CM3休眠或者深度睡眠。深度休眠是高度可配置的:LPM引擎允许其他代码模块注册自己来接受通知以及允许配置为低功耗操作。有了这些功能配置,模块可以完全禁止深度睡眠,或者要求电源域保持供电等等。LPM引擎将尽可能关闭CC26xx组件,同时满足通过注册模块来设置的所有限制。 要确定要使用哪种电源模式,请遵循以下逻辑: * 通过使用LPM驱动程序(`lpm.[ch]`)中的LPM_MODE_MAX_SUPPORTED宏,可以对可用的最深低功耗模式进行硬编码。因此,可以完全禁止深度睡眠。 * 由于低功耗操作的设置代码模块可以使用LPM驱动程序自行注册。 * 如果工程的低功率持续时间比宏`STANDBY_MIN_DURATION`设置的还低,芯片会进入深度休眠。 * 如果低功率持续时间足够长,LPM将访问所有注册的模块以查询最大允许功耗模式(最大值意思是相对于深度休眠是否还有休眠模式)。然后它可以跳转到此电源模式。这就是为什么在需要的时候,代码模块可以禁止深度休眠。 * 当芯片即将进入深度休眠以及唤醒后,所有注册的模块都将被通知。 当芯片进入深度睡眠时: * RF Core,VIMS,SYSBUS和CPU的电源域会保持关闭,RFCORE PD也应该已经关闭了。 * 外设时钟停止 * 串口和外围电源域关闭,除非LPM模块要求它们保持运行。例如,net-uart demo让 串口电源域保持供电,然后UART时钟处于睡眠和深度睡眠状态,以保留UART RX功能。 * 如果SERIAL和PERIPH PDs都关闭,我们还会在深度睡眠下将电源切换到uLDO以实现超低泄漏。 芯片将因以下事件之一从低功耗模式下唤醒: * 按下按钮,或者在SensorTag中,使用单簧片继电器触发 * 软件时钟滴答(定时器)。时钟以128Hz为单位,因此在休眠模式持续的最大时间为7.8125毫秒。在硬件方面,这是一个AON RTC通道2的比较中断。 * Rtimer触发器,作为ContikiMAC的休眠/唤醒周期的一部分。rtimer位于AON RTC通道0。 ## 加入我们 文章所有代码、工具、文档开源。加入我们[**QQ群 591679055**](http://shang.qq.com/wpa/qunwpa?idkey=d94f12d37c3b37892af4b757c6dc34bea140f3f3128a8d68e556a3d728148e85)获取更多支持,共同研究CC2640R2F&BLE5.0。

CC2640R2F&BLE5.0-乐控畅联 © Copyright 2017, 成都乐控畅联科技有限公司.