CC2530是德州仪器公司推出的用于物联网领域的基于8051架构的芯片,支持Zigbee、红外等多种无线通讯方式。本文仅对红外相关的寄存器配置做一个简单说明。
https://mp.weixin.qq.com/s/dzi0VmQzbLsN27y2rqw9wA
红外解码原来如此简单
配置时钟需要配置CLKCONCMD寄存器。但是需要注意的是OSC、TICKSPD和CLKSPD存在就低不就高的特点,所以如果稍有不慎,最终Timer输出的频率就不正确了。
pin复用分为3个级别:
1)是GPIO,还是外设?(使用PnSEL选择。)
2)外设布局。(为了方便使用,每个外设都有两套布局,可用PERCFG选择。)
3)外设复用选择。(如果有两个外设,在第2步之后,仍然共用1个pin,则用P2DIR选择究竟用谁。注意只有P0的外设可以选,P1是不行的。)
这一步主要是根据载波频率计算相关寄存器的值,主要是TxCCn(其中x表示Timer x,n表示Channel n)的值。
1) 计算Timer 3的值,以38KHz载波为为例:
32000000 / 38000 = 842.1053只是计量单位变为载波周期而已。
这个值是无法直接用8位的寄存器表示的,因此需要首先4分频,也就是
842.1053 = 4 * 210.5263
所以T3CC0=211,如果需要占空比50%的载波的话,T3CC1=105。
这样实际生成的载波频率为:
32000000 / 4 / 211 = 37914.7
2)计算Timer 1的值。
这里需要注意的是,这里T1CCn中配置的值,不再以Timer tick为单位,而是以载波周期为单位。以NEC编码的逻辑1为例,载波周期为560us,整个周期为2.25ms。因此:
37914.7 / (1 / 0.00056) = 21.23
37914.7 / (1 / 0.00225) = 85.31
所以T1CC0=85,T1CC1=21
3)配置其他寄存器
IRCTL=1,打开载波模式。需要注意的是,只要载波模式打开,Timer 1的计量单位就变为载波周期,但只有Channel 1,会调制上载波信号。其他的channel只是计量单位变为载波周期而已。
还有要仔细配置相关的Timer中断,如果没有必要的话,最好把中断都关上。毕竟即使没有中断处理程序,中断还是要消耗CPU的运算资源的。
4) timer调制模式
T1CCTLn.CMP一般选择4 - Clear Output on Compare-Up,Set on 0。
但是信号发送的最后几帧,需要特殊处理。主要的原因是:对TxCCn的修改不是立即生效,而需等待下一次中断,但对于T1CCTLn.CMP的修改却是立即生效的。这两者的差异有时会造成意想不到的结果。
CC2530虽然有两个UART,但是所有的示例中都只用到了UART0。而网上使用UART1的例子多数是实验性的代码,没有用到ZStack框架。因此对于真正的Zigbee应用来说,如何使用UART1仍是一个难题。
通过阅读ZStack的代码,可以发现UART1的使用之所以困难,主要有以下几方面的问题:
1.Pin复用。由于Pin默认是用于GPIO的,因此要想使用UART1首先要配好相关的Pin。这个可以参考那些从零做起的实验性代码,这些代码主要聚焦于如何配置寄存器,而不是ZStack。
2.ZStack中使用HAL_UART_DMA和HAL_UART_ISR用于指定串口的端口和驱动类型。但由于宏的值是唯一的,因此并不能两个UART都采用DMA或者ISR。但是一个UART用DMA,另一个用ISR实际上是可以的。这也是最简单的同时使用双串口的方法。
3.如果简单的配置HAL_UART_DMA和HAL_UART_ISR,可能会链接失败。从提示可知是驱动所占的RAM超过了系统的RAM所致。这时需要缩小两个串口的缓冲区的大小,即修改HAL_UART_DMA_RX_MAX和HAL_UART_ISR_RX_MAX的大小。
4.如果继续深入代码的话,可以发现HAL_UART_DMA和HAL_UART_ISR的唯一性,并不是两个串口不能同时DMA的关键。问题的关键在于,HAL UART的代码中,DMA和ISR都只有一套数据结构。因此如果采用两套数据结构的话,理论上是可以双串口DMA或ISR的。
5.那么问题就来了,既然可以这样做,为什么TI不去做呢?一句话还是资源的问题。双串口会导致每个串口的缓冲区尺寸减小。同时DMA虽然有5个通道,但一个串口就要用掉两个(收发各一个)。按照ZStack默认的配置,DMA 0没有用,DMA1、2用于AES,只有DMA3、4用于串口。因此实际上TI是不推荐双串口同时工作的。
CC2530的按键事件是由GPIO的中断触发的。所有的GPIO都可以作为按键事件的中断源。但CPU的中断向量有限,只有3个中断向量P0INT、P1INT和P2INT可用于GPIO中断。在中断处理程序中,读取PxIFG寄存器可获得究竟是哪个GPIO产生的中断。
1.寄存器
P0IEN—中断控制器的中断开关。
IEN1.P0IE—CPU中断的开关。
IRCON—中断是否pending。
P0IFG—中断发生时,获取究竟是哪个GPIO产生的中断。
PICTL—上升沿还是下降沿触发中断。
2.软件流程
P0INT_VECTOR
halKeyPort0Isr
halProcessKeyInterrupt
HAL_KEY_EVENT
HalKeyPoll
HalKeyRead
HalKeyConfig/OnBoard_KeyCallback
OnBoard_SendKeys
KEY_CHANGE
以上的流程是针对中断式按键消息,轮询式的按键消息,从HAL_KEY_EVENT开始。系统在开机时自动执行一次HAL_KEY_EVENT的处理函数,然后发起下一次的定时查询请求。如此一直循环下去。
3.向框架添加一个新的按钮触发源
HAL代码中已经有HAL_KEY_SW_6_PORT等一系列的宏,并定义了KEY_SW_6的行为。照着KEY_SW_6的样子添加新的按键即可。
CC2530EB—Evaluation Board
CC2530USB
CC2530ZNP—Zigbee Pro Network Processor
从各方面的信息综合来看,这应该是指三种不同类型的板子。
目前已知的有Ember公司的EM250、atmel公司的产品、microchip公司的产品。国内的广州致远,也就是周立功,也有同类产品(采用NXP JN5168模块)。
这里以IAR 8.10为例,说明一下菜单Project->Options里有哪些可选的内容以及它们的含义。由于可供选择的内容非常多且杂,这里仅列举个人实际使用到的几点常用功能。
General Options->Target->Device information->Device
这个常用于根据已有软件代码,反查设备型号。在代码移植的时候很有用。
General Options->Library options
嵌入式设备由于硬件功能有限,常需对软件代码进行裁剪,以恰好满足需要为最终目标。具体到printf和scanf函数,亦可根据需要选择不同的功能集合。
C/C++ Compiler->Language->C dialect
可变长数组(variable length array,简称VLA)在我看来,是C99标准的最大福利。这一点VC至今都不支持,鄙视之。。。
VLA的实现一般是将栈寄存器向栈顶移动,不牵扯函数调用,因此它的速度远快于malloc函数。同时由于变量的局部性,VLA也无需调用free函数释放,这在代码的编写效率上也有一定的优势。
Linker->Output->Format
大的来说可分为两类:
1.Debug版本。也就是选择“Debug information for C-APY”选项。如果需要在IAR中,打断点调试的话,必须选择这个选项。
2.Release版本。选择“Other”选项。
这里说一下使用TI公司的SmartRF Flash Programmer烧写这两种类型文件的方法。
Release版本比较简单,直接选择“Erase and program”即可。
Debug版本需要首先选择“Read flash into hex-file”,然后再选择“Erase and program”。如下图所示:
网上有些人由于不晓得这一步,而得出Debug版本无法烧写的结论,这是不正确的。
在项目的生成路径下,不仅有存放二进制文件的Exe文件夹,还有个List文件夹。在List文件夹下有个.map文件,包含了很多的链接信息。
CC2530的空中升级可以使用以下两种方法:
1.OTA(Over The Air)。这是zigbee联盟制定的标准。具体到CC2530,就是需要添加ZCL的支持。
2.OAD(Over Air Download)。TI专有的空中升级文件的技术,比OAT更早面市。这也是TI官方的技术人员推荐的方法。
其实两者的原理都差不多。
并非所有的CC2530设备都能空中升级,TI官方的说法是要想升级需要满足以下条件之一:
1)有外接FLASH存储空间。
2)没有外接FLASH的设备,其image的大小 < (片上FLASH空间 - bootloader空间) / 2。
从第2个条件不难看出,空中升级的原理是将新的image下载到flash空闲区域,然后用新的image替换老的image。
但由于即使最优化的Zstack协议栈也至少有140KB,而CC2530最多只有256KB,因此第2个条件实际上是不可能满足的。
参考:
https://blog.csdn.net/weixin_40137252/article/details/111054011
浅谈汽车软件Boot的五种自刷新方式
http://home.eeworld.com.cn/home.php?mod=space&uid=361439&do=blog&id=118277
如何实现ZigBee休眠与唤醒
通常情况下,两个Wifi设备的连接方式如下所示:
Internet---
设备A***
设备B (---
表示有线连接,***
表示Wifi连接,下同。)
其中设备A的工作模式被称作AP(Access Point),设备B的工作模式被称作STA(Station)。
如果两个Wifi设备是这样连接的话:
Internet---
设备A***
设备B***
设备C
这种情况下,设备B对于设备C来说是AP,但对于设备A来说,却只是一个Client,因此这种模式又被称为AP Client或者AP+STA。这种模式也称作Wifi repeater。其实现原理有以下几种:
1.两个独立的物理网卡,一个AP,一个STA。
2.一个物理网卡上虚拟两个虚拟网卡,一个AP,一个STA。
这个类型又有两个子类型:
1)有的厂家芯片支持模式共存。这时只要驱动支持即可。
参考文献:
http://blog.csdn.net/xiaojsj111/article/details/30482001
ap与sta共存
2)芯片不支持的,只能采用分时复用的方式,支持模式共存,又称softAP。
最近对iOS开发产生了兴趣,于是准备在PC上搭建一个iOS的开发环境。
首先,我搜了一下在Linux上搭建相关环境的方法,搜到了一些结果。但历史比较老,基本都是3、4年前的东西,就算搭好,也不见得有什么用。
于是,目标改为在PC上使用Virtual Box搭建Mac OS X虚拟机。目标版本为Mac OS X 10.10。
1.下载镜像文件。
镜像文件主要有dmg和iso两种。前者必须在Mac OS X中才能执行,而后者和其他OS镜像差别不大。
2.boot
原版镜像由于Apple的硬件检测机制,并不能在PC上运行。这时就需要破解,这一步一般是在boot中做的。
可用的boot工具,早期有empireEFI、HackBoot。较新的有chameleon、Niresh。
您的打赏,是对我的鼓励