CC2530学习(四)CC2530串行接口

并行通信与串行通信

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

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

CC2530的串口通信模块

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

对每个USART串口通信编程,本质是设置相关的5个寄存器:
<1> UxCSR: USARTx的控制和状态寄存器。
<2> UxUCR: USARTx的UART控制寄存器。
<3> UxGCR: USARTx的通用控制寄存器。
<4> UxDBUF:USARTx的接收/发送数据缓冲寄存器。
<5> 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的波特率。从串口助手发送一个字符或者一个字符串到开发板,开发板又将收到的字符或者字符串回送到串口助手上。
设计思路:
<1> 初始化USART0口的各个寄存器
<2> 设计字节发送函数
<3> 设计接收完成中断服务函数
<4> 解析接收到的数据并执行相对应的操作

串口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<string.h>
#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;
    }
  }
}

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

发布了11 篇原创文章 · 获赞 42 · 访问量 7359

猜你喜欢

转载自blog.csdn.net/qq_42398342/article/details/102842323