zigbee CC2530芯片概述
CC2530由TI公司生产的推出的支持协议栈的芯片;设备特点:
蓝牙:功耗低。
WiFi:通讯速率大
zigbee:功率低,可组建大规模网络。但是通讯速率比较低。速度250kbps,功耗一般8mh。最低2微安
自制开发板
网上卖的开发板价格是在太高了,成本其实很低,自己做得每块板子的成本才不到十元,一口气做了三块开发板。下面展示一下兼容树莓派螺丝孔的我自己做的这块开发板,有需要的同学可以到github上面下载开发板原理图和PCB文件:https://github.com/tianxiaohuahua/Zigbee/tree/master/PCB
一、IO的基本控制
控制一个IO的输出:
首先需要令该IO设置未普通IO的模式,如:P0SEL,P1SEL,P2SEL,一共就只有这三个寄存器来设置
让该IO设置未输出状态,而非输出状态,如:P0DIR,P1DIR,P2DIR
最后直接设置该IO未输出高低电平,如:P1_0 = 0;
P1SEL &= 0XFE; //普通IO寄存器,非外设模式定义寄存器 ,该寄存器处于1时是外设模式,0是普通IO模式
P1DIR |= 0X01; //设置IO处于输出状态,0是输出状态,1是输出状态
P1_0 = 1; //设置IO的寄存器的值
设置一个IO的输入:
和设置输出模式相同都需要设置三个寄存器,还需要配置上下拉模式:
1、设置为普通IO模式,配置P0SEL,P1SEL,P2SEL;
2、设置输入输出模式,配置P0DIR,P1DIR,P2DIR;
3、设置IO的输入为上拉、下拉或者三态状态,需要配置P0INP、P1INP、P2INP;
一般情况下,读取外部开关信号直接设置上下拉模式,读取AD信号一般使用三态状态模式
4、通过读取IO的寄存器读取IO的状态
特别需要注意的是PXINP寄存器,在输出模式下,该寄存器的每一位都对用了相对应的IO,0表示上下拉模式。1表示三态模式。但是由于设置为上下拉模式还要具体到设置为上拉模式或者下拉模式,因此,使用P2INP的高三为进行设置,把第五位设置为0就是上拉模式,1就是下拉模式:
P0SEL &= 0xBF; //设置P0.1为普通IO口 1011111
P0DIR &= 0xBF; //按键接在P0.1口上,设P0.1为输入模式 101111
P0INP &= 0xBF; //设置IO的模式为上下拉模式。 101111
P2INP &= 0xDF //设置IO 1101 1111
初始状态下的一些寄存器的值都是零,因此一些寄存器就不需要配置!!!
因此芯片在上电后吗,默认是所有的IO口都是上拉输出状态!!!
配置IO的外部中断:
注意:CC2530的每一个IO引脚都有中断功能;
1、初始化IO为普通IO模式;
2、配置IO的输入模式;
3、配置IO的上下拉;
4、配置上拉;
5、开启CPU中断,令EA = 1;
相当于一个最高级别的开关,控制所有IO的中断信号,只有这一位寄存器设置为1的时候才会开启中断;
6、打卡IO口组中断;一共三组,分别是P0组、P1组和P2组。
对应的寄存器为:P0IE、P1IE和P2IE;是一个只有1位的寄存器。相当于一个总开关下面的次级开关。分别控制了三组IO的中断信号。并且规定0是关断使能,1是开启使能;
7、打开组内的对应的某个IO的中断;相应为具体的某一个IO。
一共有三组寄存器,每个寄存器的八位对应了8个IO,可以进行分别控制。这三个寄存器是P0IEM、P1IEM和P2IEM。规定0代表复位,1代表使能;
8、确定上升沿触发还是下降;
只由单独的一个寄存器配置所有IO。0代表上升沿,1代表下降沿;
每一位分别对应了不同组的IO:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
IO驱动能力 | 无 | 无 | 无 | P2_0~P2_4 | P1_4~P1_7 | P1_0~P1_3 | P0_0~P0_7 |
具体到一个IO的设置如下:
//配置P0_5的外部中断为例
P0SEF &= 0XDF; //设置IO为普通IO 1101 1111
P0DIR &= 0XDF; //设置为输入模式 1101 1111
POINP &= 0XDF; //设置为上下拉模式 1101 1111
P2INP &= 0XDF; //设置为上拉模式 1101 1111
EA = 1; //开启中断总开关
P0IE = 1; //开启中断组开关
P0IEN |= 0X20; //开启中断IO开关 0010 0000
PICTL |= 0X01; //设置P0_0~P0_7为下降沿触发模式 0000 0001
设置中断函数,都是固定格式
#pragma optimze=none
#pragma vector=P0INT_VECTOR
__interrup void a_function()
{
if(P0IFG & 0X20) //读取中断寄存器的值,八位宽分别对应了8个IO的的值;这里对应的是第五位:0010 0000
{
do_something(); //中断后实现的具体功能
}
P0IFG = 0; //让中断寄存器的值清除
P0IF = 0; //组中断寄存器的值清除
}