文旺C擦、 发表于 2016-12-24 19:09

CC2530启梦之旅

本帖最后由 文旺C擦、 于 2016-12-24 19:09 编辑

CC2530简介图 1-1 的方框图显示了 CC253x 设备系列不同的构造模块。并没有列出 CC253x 所有设备的所有模块和外设的全部功能和函数,因此关于具体设备的方框图参见各个设备的数据手册。模块大致可以分为三种类型:CPU 和内存相关的模块;外设、时钟和电源管理相关的模块;无线电相关的模块。1.1.1 CPU 和内存CC253x 设备系列使用的 8051 CPU 内核是一个单周期的 8051 兼容内核。它有三个不同的存储器访问总线(SFR、DATA 和 CODE/XDATA),以单周期访问 SFR、DATA 和主 SRAM。它还包括一个调试接口和一个 18输入的扩展中断单元。中断控制器提供了 18 个中断源,分为六个中断组,每组与四个中断优先级相关。当设备从空闲模式回到活动模式,也会发出一个中断服务请求。一些中断还可以从睡眠模式唤醒设备(供电模式 1-3)内存仲裁器位于系统中心,因为它通过 SFR 总线,把 CPU 和 DMA 控制器和物理存储器和所有外设连接在一起。内存仲裁器有四个存取访问点,访问每一个可以映射到三个物理存储器之一:一个 8-KB SRAM、一个闪存存储器和一个 XREG/SFR 寄存器。它负责执行仲裁,并确定同时到同一个物理存储器的内存访问的顺序 。8-KB SRAM 映射到 DATA存储空间和 XDATA 存储空间的一部分。 8-KB SRAM 是一个超低功耗的 SRAM,当数字部分掉电时(供电模式 2 和 3)能够保留自己的内容。这对于低功耗应用是一个很重要的功能。32/64/128/256 KB 闪存块为设备提供了内电路可编程的非易失性程序存储器,映射到 CODE 和 XDATA 存储空间。除了保存程序代码和常量,非易失性程序存储器允许应用程序保存必须保留的数据,这样在设备重新启动之后可以使用这些数据。使用这个功能,例如可以利用已经保存的网络具体数据,就不需要经过完整的启动、网络寻找和加入过程。1.1.2 时钟和电源管理数字内核和外设由一个 1.8-V 低差稳压器供电。另外 CC253x 包括一个电源管理功能,可以实现使用不同供电模式的长电池寿命的低功耗应用运行。有五种不同的复位源来复位设备。1.1.3 外设CC2530 包括许多不同的外设,允许应用程序设计者开发先进的应用。    ​调试接口执行一个专有的两线串行接口,用于内电路调试。通过这个调试接口,可以执行整个闪存存储器的擦除、控制使能哪个振荡器、停止和开始执行用户程序、执行 8051 内核提供的指令、设置代码断点,以及内核中全部指令的单步调试。使用这些技术,可以很好地执行内电路的调试和外部闪存的编程。设备含有闪存存储器以存储程序代码。闪存存储器可通过用户软件和调试接口编(如上所述)。闪存控制器处理写入和擦除嵌入式闪存存储器。闪存控制器允许页面擦除和 4 字节编程。    ​I/O 控制器负责所有通用 I/O 引脚。CPU 可以配置外设模块是否控制某个引脚或它们是否受软件控制,如果是的话,每个引脚配置为一个输入还是输出,是否连接衬垫里的一个上拉或下拉电阻。CPU 中断可以分别在每个引脚上使能。每个连接到 I/O 引脚的外设可以在两个不同的 I/O 引脚位置之间选择,以确保在不同应用程序中的灵活性。    ​系统可以使用一个多功能的五通道 DMA 控制器,使用 XDATA 存储空间访问存储器,因此能够访问所有物理存储器。每个通道(触发器、优先级、传输模式、寻址模式、源和目标指针和传输计数)用 DMA描述符在存储器任何地方配置。许多硬件外设(AES 内核、闪存控制器、USART、定时器、ADC 接口)通过使用 DMA 控制器在 SFR 或 XREG 地址和闪存/SRAM 之间进行数据传输,获得高效率操作。    ​定时器1是一个 16 位定时器,具有定时器/计数器/PWM 功能。它有一个可编程的分频器,一个16 位周期值,和五个各自可编程的计数器/捕获通道,每个都有一个 16 位比较值。每个计数器/捕获通道可以用作一个 PWM 输出或捕获输入信号边沿的时序。它还可以配置在 IR 产生模式,计算定时器 3 周期,输出和定时器 3 的输出相与,用最小的 CPU 互动产生调制的消费型 IR 信号。    ​定时器 2(MAC 定时器)是专门为支持 IEEE 802.15.4 MAC 或软件中其他时槽的协议设计。定时器有一个可配置的定时器周期和一个 8 位溢出计数器,可以用于保持跟踪已经经过的周期数。一个 16 位捕获寄存器也用于记录收到/发送一个帧开始界定符的精确时间,或传输结束的精确时间,还有一个 16 位输出比较寄存器可以在具体时间产生不同的选通命令(开始 RX,开始 TX,等等)到无线模块。    ​定时器 3 和定时器 4是 8 位定时器,具有定时器/计数器/PWM 功能。它们有一个可编程的分频器,一个 8 位的周期值,一个可编程的计数器通道,具有一个 8 位的比较值。每个计数器通道可以用作一个 PWM输出。    ​睡眠定时器(第 11 章)是一个超低功耗的定时器,计算 32-kHz 晶振或 32-kHz RC 振荡器的周期。睡眠定时器在除了供电模式 3 的所有工作模式下不断运行。这一定时器的典型应用是作为实时计数器,或作为一个唤醒定时器跳出供电模式 1 或 2。    ​ADC支持 7 到 12 位的分辨率,分别在 30 kHz 或 4 kHz 的带宽。DC 和音频转换可以使用高达八个输入通道(端口 0)。输入可以选择作为单端或差分。参考电压可以是内部电压、AVDD 或是一个单端或差分外部信号。ADC 还有一个温度传感输入通道。ADC 可以自动执行定期抽样或转换通道序列的程序。    ​随机数发生器 使用一个 16 位 LFSR 来产生伪随机数,这可以被 CPU 读取或由选通命令处理器直接使用。例如随机数可以用作产生随机密钥,用于安全。    ​AES 协处理器允许用户使用带有 128 位密钥的 AES 算法加密和解密数据。这一内核能够支持IEEE 802.15.4 MAC 安全、ZigBee 网络层和应用层要求的 AES 操作。    ​一个内置的看门狗定时器、允许设备在固件挂起的情况下复位自身。当看门狗定时器由软件使能,它必须定期清除;否则,当它超时它就复位设备。或者它可以配置用作一个通用 32-kHz 定时器。    ​USART 0 和 USART 1每个被配置为一个 SPI 主/从或一个 UART。它们为 RX 和 TX 提供了双缓冲,以及硬件流控制,因此非常适合于高吞吐量的全双工应用。每个都有自己的高精度波特率发生器,因此可以使普通定时器空闲出来用作其他用途。    ​USB 2.0 全速控制器 (仅 CC2531 可用)有 5 个端点, 1KB FIFO RAM 的双缓冲。
1.1.4 无线电    ​CC253x 设备系列提供了一个 IEEE 802.15.4 兼容无线收发器。RF 内核控制模拟无线模块。另外,它提供了 MCU 和无线设备之间的一个接口,这使得可以发出命令、读取状态、自动操作和确定无线设备事件的顺序。无线设备还包括一个数据包过滤和地址识别模块。1.2 应用    ​如概述(1.1 节)所示,这一用户指南的重点是使用可用的不同模块,来建立基于 CC253x 设备系列的不同类型的应用程序。如果查看完整的应用程序开发过程,另外的一些信息很有用。但是,因为这样的信息和帮助不是设备特定的(即不是 CC253x 设备系列唯一有的),读者可以参考以下段落的另外的信息源。    ​第一步是通过购买一个开发套件(见设备具体的产品网站,找到相关开发套件的链接),设置开发环境(HW 工具等)。开发套件带有一个现成的演示和关于如何设置开发环境的信息;安装所需的驱动(通过安装SmartRF 软件可以轻松完成),设置编译器工具链,等等。只要已经安装了开发环境,就可以准备开始应用程序的开发了。    ​写应用程序软件的最简单的方法是把应用程序建立在可用的标准协议之一(RemoTI 网络协议,21.2 节;TIMAC 软件,21.4 节;或用于 ZigBee 兼容解决方案的 Z-Stack 软件,21.5 节)上面;或者专门的 SimpliciTI网络协议上面。它们都带有一些实例应用程序。    ​对于用户具体 HW 的硬件布局设计,设计人员可以在不同的产品页面(B.1 节)上找到参考设计。通过复制这些设计,设计人员能够获得最佳性能。已开发的 HW 可以使SmartRF Studio 软件很容易地进行测试。    ​如果最终的系统没有达到预期的性能,建议在开发套件的硬件上尝试开发的软件,看看在这里工作地如何。要检查用户具体的 HW,使用 SmartRF Studio 软件,在相同的设置下来比较开发套件性能和用户具体的 HW,这是一个良好的开端。    ​用户还可以通过加入低功耗 RF 网络社区(和订阅低功耗 RF 电子简讯,找到另外的信息和帮助。本文由作者整合资料所得,请勿用于商业用途。

文旺C擦、 发表于 2016-12-24 19:09

CC2530其实可以理解成一款单片机+无线模块学习之前希望大家先去了解51单片机和加深一下C语言,这对学习这款芯片是很有帮助的,本教程是基于有一点模拟电路基础和C语言基础的玩家,不时也会推出一些基础的干货,大神登门请多多指教,当然大家如果有什么疑问的话可以私下联系虎牙小哥。下面我们先复习一下单片机吧;
第一个学习教程:I/O端口·学习之前我们先看看芯片手册,打开我们的芯片手册(中英文资料在我的论坛帖子里面可以下载,我用的是中文版的,毕竟英语水平一般般),大家可以先浏览一下,有个认知;

文旺C擦、 发表于 2016-12-24 19:09

·玩转IO一般只用到三个常用的寄存器就好(看我们的芯片手册IO栏目里面有详细介绍)*P0SEL/P1SEL(0:普通 IO 口1:第二功能)*P0DIR/P1DIR(0:输入1:输出)*P0INP/P1INP(0:上拉/下拉1:三态)一般初始化流程:普通IO--->设置输入输出--->配置上拉/下拉/三态例如:P1SEL &= 0X01;    //功能选择---通用IOP1DIR |= 0X01;    //方向设定---输出P1INP &= ~0X01;   //输入模式选择---打开上拉/下拉 P0SEL &= 0X30;    //功能选择---通用IOP0DIR &= ~0X30;    //方向设定---输入P0INP &= ~0X30;   //输入模式选择---打开上拉/下拉由于 CC2530 寄存器初始化时默认是:P1SEL =0x00; P1DIR =0x00; P1INP =0X00;所以我们可以简化我们的初始化指令:P1DIR |= 0X01;    //方向设定---输出P0DIR &= ~0X30;   //方向设定---输入 大家都有点意思了吧,下面我们来实战一下;学习之前先配置好开发环境,第一步安装IAR此处省略---(回复IAR获取安装过程)大家可以看到IAR的初始界面(下图),点击project--->Create New Project

文旺C擦、 发表于 2016-12-24 19:09

弹出如下的界面,我们选择默认的配置就可以了,点击OK。然后选择储存路径。

文旺C擦、 发表于 2016-12-24 19:09

下面配置我们的开发环境,点击project--->Options(快捷键alt+F7),看到如下界面:

文旺C擦、 发表于 2016-12-24 19:09

第一步:Greneral Options---TargetDevice;选择我们的芯片型号---点击右边的超链接打开文件夹Texas Instruments选择CC2530F256.i51,图A所示;
第二步:Linker---Config---Linker configuration file---Override default打开文件夹Texas Instruments选择lnk51ew_CC2530F256.xcl,图B所示;
第三步:Debugger---SETUP---Driver,选择Texas Instruments,图C所示。

文旺C擦、 发表于 2016-12-24 19:09

配置完成,点击OK; 学过51单片机的同学是不是觉得很熟悉,步骤还是差不多,先新建一个文件,保存为.c文件,在右击Files下的工程(就是IO-Debug)---Add---Add “IO.c”

文旺C擦、 发表于 2016-12-24 19:09

下面开始码程序吧,先回想一下前面看的芯片手册,看下面代码:#include<ioCC2530.h>                                //添加我们芯片的头文件 #define led P1_0                                        //先宏定义下我们的IO,方便下面写代码#define key_1 P0_4                                        //*宏定义#define        A        常量B                #define key_2 P0_5                                        //*字面意思就是用A标识常量B /***函数声明,main函数在前面,我们必须在主函数前加入函数声明,不然调用会编译出错***/void Led_init(void);                                //LED初始化函数void Key_init(void);                                //按键初始化函数        void Delayms(unsigned int xms);        //毫秒延时函数 void main(void)                        //main函数{Led_init();                                //初始化LEDKey_init();                        //初始化按键while(1)                                //while(1)循环(在没有跳出语句的情况下,无限循环){    if(!key_1)                                //判断key_1有没有按下    {      Delayms(20);                //消抖      if(!key_1)                        //确定key_1有没有按下      led = 0;                         //led点亮,P1_0置0    }    if(!key_2)                                //判断key_2有没有按下    {              Delayms(20);                //消抖      if(!key_2)                        //确定key_2有没有按下      led = 1;                         //led灭,P1_0置1    }}} /***********        LED初始化函数:初始化LED        无返回值*/void Led_init(void){P1SEL &= 0X01;    //功能选择---通用IOP1DIR |= 0X01;    //方向设定---输出P1INP &= ~0X01;   //输入模式选择---打开上拉/下拉} /***********        按键初始化函数:初始化按键        无返回值*/void Key_init(void){P0SEL &= 0X30;    //功能选择---通用IOP0DIR &= ~0X30;    //方向设定---输入P0INP &= ~0X30;   //输入模式选择---打开上拉/下拉} /***********        延时函数:延时xms        x:unsigned int类型        无返回值*/void Delayms(unsigned int x)    { unsigned int i,j; for(i=x;i>0;i--)   for(j=587;j>0;j--);} 这段代码还是挺容易啃的,大家肯得下吗?有疑问的可以联系虎牙小哥哦;下面我们编译看看代码有没有错吧,第一次Compile的时候需要保存工作空间:

文旺C擦、 发表于 2016-12-24 19:09

再点一次,没有错误也没有警告;

文旺C擦、 发表于 2016-12-24 19:09

下面进入我们的仿真吧,我用的是网蜂科技的zigbee开发板,看图;连接我们的仿真器,马上开始实战吧。

文旺C擦、 发表于 2016-12-24 19:09

本帖最后由 文旺C擦、 于 2016-12-24 18:23 编辑

点击Download and Debug,下载程序并仿真进入仿真界面

文旺C擦、 发表于 2016-12-24 19:09

效果(按下KEY_1,LED亮,按下KEY_2,LED灭)

文旺C擦、 发表于 2016-12-24 19:09

我们看回代码吧,通过这次实验,大家基本上都会配置IO了吧,大家可以脑洞大开,按照技术手册去的更改两个init函数,然后玩出想要的效果,本次讲解就到这里了,后面会慢慢更新一些实验,让大家更好的体会!

lianglz616 发表于 2017-1-21 00:19

cc2530 技术交流
加入群,一起讨论,开发zigbee!   594507478
群主也有量产,上市公司使用的zigbee模块。加群后,可以联系群主。性能,稳定性,应该优于淘宝大部分。
知晓,谢谢!

lianglz616 发表于 2017-1-21 00:20

现在ti好像有cc2630了。m3核cpu+m0核RF.

ziiiro 发表于 2017-7-13 22:56

学习了
页: [1]
查看完整版本: CC2530启梦之旅