Zigbee自学
记录学习过程中的一些想法,硬件设备和学习资料均来自安联德(淘宝)
一、串口通讯
CC2530有两个串行通讯接口USART0和USART1,对应的引脚位置分别为:
位置1:RX0----P0_2 TX0----P0_3
位置2:RX0----P1_4 TX0----P1_5
位置1:RX1----P0_5 TX1----P0_4
位置2:RX1----P1_7 TX1----P1_6
通过PERCFG寄存器设置对应引脚的位置。
1.串口输入
串口设置:
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
- PERCFG:选择端口及端口的位置
- P0SEL:根据选择的端口位置设置引脚
- P2DIR:选择中断优先级
- U0CSR:串口0控制
- U0GCR和U0BAUD为波特率控制
主函数:
void main(void)
{
CLKCONCMD &= ~0x40; //设置位OSC,系统时钟源为32MHZ晶振,
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统时钟速度,系统主时钟频率为32MHZ
InitUart(); //调置串口相关寄存器
memset(TxData, 0, TX_SIZE); //数据清0
memcpy(TxData, TX_STRING, sizeof(TX_STRING)); //复制发送字符串到TxData
while(1)
{
UartSendString(TxData, sizeof(TX_STRING)); //串口发送数据
DelayMS(1000); //延时
}
}
2.收发字符串
串口设置:
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0xC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断允许接收中断
}
增加了串口接受使能U0CSR与中断使能IEN0。
- 主函数
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
InitUart(); //调用串口初始化函数
UartState = UART0_RX; //串口0默认处于接收模式
memset(RxData, 0, SIZE);
while(1)
{
if(UartState == UART0_RX) //接收状态
{
if(RxBuf != 0)
{
if((RxBuf != '#')&&(count < 50))//以'#'为结束符,一次最多接收50个字符
RxData[count++] = RxBuf;
else
{
if(count >= 50) //判断数据合法性,防止溢出
{
count = 0; //计数清0
memset(RxData, 0, SIZE);//清空接收缓冲区
}
else
UartState = UART0_TX; //进入发送状态
}
RxBuf = 0;
}
}
if(UartState == UART0_TX) //发送状态
{
U0CSR &= ~0x40; //禁止接收
UartSendString(RxData, count); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
UartState = UART0_RX; //恢复到接收状态
count = 0; //计数清0
memset(RxData, 0, SIZE); //清空接收缓冲区
}
}
}
- char 是有符号的, uchar(unsigned char)是无符号的。
- memset()函数原型是:extern void *memset(void *buffer, int c, int count)
buffer:为指针或是数组, c:是赋给buffer的值,count:是赋予值的长度 - 注意char 0 与 int 0 区别
中断程序:
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
RxBuf = U0DBUF;
}
- 将接受到的数据保存到RxBuf中
串口发送程序:
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}