CC2530学习(四)CC2530串行接口 您所在的位置:网站首页 cc2530是哪个公司的 CC2530学习(四)CC2530串行接口

CC2530学习(四)CC2530串行接口

#CC2530学习(四)CC2530串行接口| 来源: 网络整理| 查看: 265

并行通信与串行通信

微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。 并行通信:指数据的各位同时发送或接收,每个数据位使用单独的一条导线。传输速度快、效率高,但需要的数据线较多,成本高。 串行通信:指数据一位接一位地顺 序发送或接收。需要的数据线少,成本低,但传输速度慢,效率低。

从中我们可以了解到两种通信方式各有各自的优缺点,在实际应用中根据不同情况而定。

CC2530的串口通信模块

CC2530有两个串行通信接口USART0和USART1,并且它们都能够分别运行于异步UART模式或者同步SPI模式。具体用于那种模式通过设置U0CSR寄存器来选择。 两个USART接口具有相同的功能,且它们有对应的外部I/O引脚映射关系。通过 PERCFG寄存器设置。 映射关系: 位置1:RX0 — P0_2 TX0 — P0_3 RX1 — P0_5 TX1 — P0_4 位置2:RX0 — P1_4 TX0 — P1_5 RX1 — P1_7 TX1 — P1_6

对每个USART串口通信编程,本质是设置相关的5个寄存器: UxCSR: USARTx的控制和状态寄存器。 UxUCR: USARTx的UART控制寄存器。 UxGCR: USARTx的通用控制寄存器。 UxDBUF:USARTx的接收/发送数据缓冲寄存器。 UxBAUD:USARTx的波特率控制寄存器。

相关寄存器介绍

接下来的代码部分会涉及到一些寄存器的各个位作用

CLKCONCMD:时钟频率控制寄存器。 在这里插入图片描述 D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。 D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。 D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。 D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。

CLKCONSTA:时间频率状态寄存器。 在这里插入图片描述 D7位为当前32KHZ时间振荡器频率。0为32KRC震荡,1为32K晶振。 D6位为当前系统时钟选择。0为32M晶振,1为16M RC震荡。 D5~D3为当前定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。 D2~D0为当前系统主时钟。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。

PERCFG:设置部分外设的I/O位置,0为默认I位置1,1为默认位置2 在这里插入图片描述 U0CSR:USART0控制与状态; 在这里插入图片描述 D7为工作模式选择,0为SPI模式,1为USART模式 D6为UART接收器使能,0为禁用接收器,1为接收器使能。 D5为SPI主/从模式选择,0为SPI主模式,1为SPI从模式。 D4为帧错误检测状态,0为无错误,1为出现出错。 D3为奇偶错误检测,0为无错误出现,1为出现奇偶校验错误。 D2为字节接收状态,0为没有收到字节,1为准备好接收字节。 D1为字节传送状态,0为字节没有被传送,1为写到数据缓冲区的字节已经被发送。 D0为USART接收/传送主动状态,0为USART空闲,1为USART忙碌。

U0GCR:USART0通用控制寄存器; 在这里插入图片描述 D7为SPI时钟极性:0为负时钟极性,1为正时钟极性; D6为SPI时钟相位: D5为传送为顺序:0为最低有效位先传送,1为最高有效位先传送。 D4~D0为波特率设置: 对于波特率设置我们这还有介绍: CC2530的波特率由BAUD_E和BAUD_M共同决定: 在这里插入图片描述 F为微控制器的系统时钟频率:16MHz或32MHz。 在TI公司提供的数据手册中,给出了32MHz系统时钟下各常用波特率的参数值,由计算公式亦不难得出16MHz系统时钟下对应的参数值。 在这里插入图片描述

UART口与计算机的COM口连接

先认识两种电平:TTL电平和RS232电平。 TTL电平: 逻辑0----小于0.8V 逻辑1----大于2.4V。 RS232电平: 逻辑0----5~15V 逻辑1---- -5~-15V。

计算机的串行通信接口是RS-232的标准接口,而CC2530单片机的UART接口则是TTL电平,两者的电气规范不一致,所以要完成两者之间的数据通信,就需要借助接口芯片在两者之间进行电平转换,常用的有MAX232芯片。 在这里插入图片描述 注意:DB9接口中,公头和母头的排列顺序是不同的。

串口小实验

这次小实验做的是CC2530串口0与串口助手连接,在32HMz的内部系统时钟下产生19200的波特率。从串口助手发送一个字符或者一个字符串到开发板,开发板又将收到的字符或者字符串回送到串口助手上。 设计思路: 初始化USART0口的各个寄存器 设计字节发送函数 设计接收完成中断服务函数 解析接收到的数据并执行相对应的操作

串口0初始化函数

选择外设的引脚映射位置,并将对应的引脚设置为外设功能 ,然后对波特率、控制寄存器和中断的相关控制位进行设置。

void initUART(void) { CLKCONCMD &= ~0x40; //设置系统时钟源为32MHz晶振 while(CLKCONSTA & 0x40);//等待晶振稳定 CLKCONCMD &= ~0x47;//设置系统主时钟频率为32MHz PERCFG=0x00; //选择位置1即P0_2,P0_3 P0SEL=0x0c; //将P0_2,P0_3口设置为外设功能 U0CSR |= 0xc0; //串口设置为UART异步通信模式并使能接收器 U0GCR |=9; U0BAUD |=59; //设置波特率为19200 UTX0IF = 0; //UART0 TX中断标志初始置位1 URX0IF = 0; //UART0 RX中断标志初始置位1 //U0CSR |=0x40; //允许接收 //IEN0 |=0x84;//开总中断,接收中断 URX0IE = 1;//使能URAT0接收中断 EA = 1; //使能总中断 } 数据接收中断服务函数 #pragma vector =URX0_VECTOR __interrupt void UART0_ISR(void) { URX0IF = 0; //清中断标志 temp = U0DBUF; RxFlag=1;//接收标志置为1 } 发送字节函数 void UartTX_Send_char(uchar Data) { U0DBUF = Data; while(UTX0IF==0); //当发送成功标志位置为1后退出等待 UTX0IF=0; //软件清除发送标志 } 实验源代码 #include "iocc2530.h" #include #define uchar unsigned char #define uint unsigned int //函数申明 void initUART(void);//初始化串口 void UartTX_Send_char(uchar Data);//发送字符 uchar temp; uchar RxFlag=0; //串口初始化 void initUART(void) { CLKCONCMD &= ~0x40; //设置系统时钟源为32MHz晶振 while(CLKCONSTA & 0x40);//等待晶振稳定 CLKCONCMD &= ~0x47;//设置系统主时钟频率为32MHz PERCFG=0x00; //选择位置1即P0_2,P0_3 P0SEL=0x3c; //将P0_2,P0_3口设置为外设功能 U0CSR |= 0xc0; //串口设置为UART异步通信模式并使能接收器 U0GCR |=9; U0BAUD |=59; //设置波特率为19200 UTX0IF = 0; //UART0 TX中断标志初始置位1 URX0IF = 0; //UART0 RX中断标志初始置位1 //U0CSR |=0x40; //允许接收 //IEN0 |=0x84;//开总中断,接收中断 URX0IE = 1;//使能URAT0接收中断 EA = 1; //使能总中断 } void UartTX_Send_char(uchar Data) { U0DBUF = Data; while(UTX0IF==0); //当发送成功标志位置为1后退出等待 UTX0IF=0; //软件清除发送标志 } //串口中断函数 #pragma vector =URX0_VECTOR __interrupt void UART0_ISR(void) { URX0IF = 0; //清中断标志 temp = U0DBUF; RxFlag=1;//接收标志置为1 } void main(void) { initUART(); while(1) { if(RxFlag==1) { UartTX_Send_char(temp); RxFlag=0; } } }

本次介绍就到这了,谢谢大家的观看!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有