0

CC2530, 负载均衡

 2 years ago
source link: http://antkillerfarm.github.io/technology/2014/12/27/CC2530_IR.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

CC2530配置红外载波

CC2530是德州仪器公司推出的用于物联网领域的基于8051架构的芯片,支持Zigbee、红外等多种无线通讯方式。本文仅对红外相关的寄存器配置做一个简单说明。

https://mp.weixin.qq.com/s/dzi0VmQzbLsN27y2rqw9wA

红外解码原来如此简单

1.配置时钟

配置时钟需要配置CLKCONCMD寄存器。但是需要注意的是OSC、TICKSPD和CLKSPD存在就低不就高的特点,所以如果稍有不慎,最终Timer输出的频率就不正确了。

2.配置pin复用

pin复用分为3个级别:

1)是GPIO,还是外设?(使用PnSEL选择。)

2)外设布局。(为了方便使用,每个外设都有两套布局,可用PERCFG选择。)

3)外设复用选择。(如果有两个外设,在第2步之后,仍然共用1个pin,则用P2DIR选择究竟用谁。注意只有P0的外设可以选,P1是不行的。)

3.配置IR载波

这一步主要是根据载波频率计算相关寄存器的值,主要是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双串口工作

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按键事件流程

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的样子添加新的按键即可。

CC2530 Target类型

CC2530EB—Evaluation Board

CC2530USB

CC2530ZNP—Zigbee Pro Network Processor

从各方面的信息综合来看,这应该是指三种不同类型的板子。

CC2530的竞争对手

目前已知的有Ember公司的EM250、atmel公司的产品、microchip公司的产品。国内的广州致远,也就是周立功,也有同类产品(采用NXP JN5168模块)。

CC2530 Option的几点解释

这里以IAR 8.10为例,说明一下菜单Project->Options里有哪些可选的内容以及它们的含义。由于可供选择的内容非常多且杂,这里仅列举个人实际使用到的几点常用功能。

如何确定设备类型?

General Options->Target->Device information->Device

这个常用于根据已有软件代码,反查设备型号。在代码移植的时候很有用。

printf & scanf

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版本无法烧写的结论,这是不正确的。

输出二进制文件的flash布局

在项目的生成路径下,不仅有存放二进制文件的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设备的三种模式

通常情况下,两个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

2)芯片不支持的,只能采用分时复用的方式,支持模式共存,又称softAP。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK