您好,欢迎访问三七文档
串口通信前言:无论学习哪款MUC串口对于我们进行实验调试都是非常方便实用的,我们可以把程序中涉及的某些中间量或者其他程序状态信息打印出来显示在电脑上进行调试,许多MUC和PC机通信都是通过串口来进行的。下面一起来学习BlueTooth的串口实验。实验现象:实验将使用BlueTooth开发板实现3个功能。发送、收发、控制LED。实验讲解:我们先来看看BlueTooth底板的USB转串口部分电路原理图:如图1所示。图2.12PL2303USB转串口电路11.1.1串口发送(HelloBlueTooth4.0)查看CC2540的datasheet可知:UART0对应的外部设备IO引脚关系为:P0_2------RXP0_3------TXUART1对应的外部设备IO引脚关系为:P0_5------RXP0_4------TX在CC2540中,USART0和USART1是串行通信接口,它们能够分别运行于异步USART模式或者同步SPI模式。两个USART的功能是一样的,可以通过设置在单独的IO引脚上。USART模式的操作具有下列特点:1、8位或者9位负载数据2、奇校验、偶校验或者无奇偶校验3、配置起始位和停止位电平4、配置LSB或者MSB首先传送5、独立收发中断6、独立收发DMA触发注:在本次实验中,我们用到的是UART0。CC2540配置串口的一般步骤:1、配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART02、配置相应串口的控制和状态寄存器。此处配置UART0的工作寄存器3、配置串口工作的波特率。此处配置为波特率为9600本次实验串口相关的寄存器或者标志位有:U0CSR、U0GCR、U0BAUD、U0DBUF、UTX0IF。各寄存器功能如下表所示:(详细参考CC253xandCC2540User'sGuide.pdf)表2.6CC2540UART寄存器2U0CSR(UART0控制和状态寄存器)Bit7:MODE0:SPI模式1:UART模式Bit6:RE0:接收器禁止1:接收器使能Bit5:SLAVE0:SPI主模式1:SPI从模式Bit4:FE0:没有检测出帧错误1:收到字节停止位电平出错Bit3:ERR0:没有检测出奇偶检验出错1:收到字节奇偶检验出错Bit2:RX_BYTE0:没有收到字节1:收到字节就绪Bit1:TX_BYTE0:没有发送字节1写到数据缓冲区寄存器的最后字节已经发送Bit0:ACTIVE0:USART空闲1:USART忙U0GCR(UART0通用控制寄存器)Bit7:CPOL0:SPI负时钟极性1:SPI正时钟极性Bit6:CPHA0:当来自CPOL的SCK反相之后又返回CPOL时,数据输出到MOSI;当来自CPOL的SCK返回CPOL反相时,输入数据采样到MISO1:当来自CPOL的SCK返回CPOL反相时,数据输出到MOSI;当来自CPOL的SCK反相之后又返回CPOL时,输入数据采样到MISOBit5:ORDER0:LSB先传送1:MSB先传送Bit[4-0]:BAUD_E波特率指数值BAUD_E连同BAUD_M一起决定了UART的波特率3U0BAUD(UART0波特率控制寄存器)Bit[7-0]:BAUD_M波特率尾数值BAUD_M连同BAUD_E一起决定了UART的波特率U0DBUF(UART0收发数据缓冲区)串口发送/接收数据缓冲区UTX0IF(发送中断标志)中断标志5IRCON2的Bit10:中断未挂起1:中断挂起串口的波特率设置可以从CC2540的datasheet中查得波特率由下式求得:本次实验设置波特率为115200bps,具体的参数设置如下:寄存器具体配置如下:PERCFG=0x00;//位置1P0口P0SEL=0x0c;//P0_2,P0_3用作串口(外部设备功能)P2DIR&=~0XC0;//P0优先作为UART0U0CSR|=0x80;//设置为UART方式4U0GCR|=11;U0BAUD|=216;//波特率设为115200UTX0IF=0;//UART0TX中断标志初始置位0串口发送函数请参考下面源程序:源程序代码(全)/**************************************描述:在串口调试助手上可以看到不停地收到CC2540发过来的:HelloBlueTooth4.0波特率:115200bps**************************************/#includeioCC2540.h#includestring.h#defineuintunsignedint#defineucharunsignedchar//定义LED的端口#defineLED1P1_0#defineLED2P1_1//函数声明voidDelay_ms(uint);voidinitUART(void);voidUartSend_String(char*Data,intlen);charTxdata[19];//存放HelloBlueTooth4.0\n共19个字符串/****************************************************************延时函数5****************************************************************/voidDelay_ms(uintn){uintI,j;for(i=0;in;i++){for(j=0;j1774;j++);}}voidIO_Init(){P1DIR=0x01;//P1_0IO方向输出LED1=0;//关LED}/***************************************************************串口初始化函数***************************************************************/voidInitUART(void){PERCFG=0x00;//位置1P0口P0SEL=0x0c;//P0_2,P0_3用作串口(外部设备功能)P2DIR&=~0XC0;//P0优先作为UART0U0CSR|=0x80;//设置为UART方式U0GCR|=11;U0BAUD|=216;//波特率设为115200UTX0IF=0;//UART0TX中断标志初始置位06}/***************************************************************串口发送字符串函数***************************************************************/voidUartSend_String(char*Data,intlen){intj;for(j=0;jlen;j++){U0DBUF=*Data++;while(UTX0IF==0);UTX0IF=0;}}/***************************************************************主函数***************************************************************/voidmain(void){CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定为32MCLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZIO_Init();InitUART();strcpy(Txdata,HelloBlueTooth4.0\n);//将发送内容copy到Txdata;while(1){//串口发送数据UartSend_String(Txdata,sizeof(HelloBlueTooth4.0\n));7Delay_ms(500);//延时LED1=!LED1;//标志发送状态}}实验1图片图2.13USB转串口连接方法8图2.14上位机接收到发来的HelloBlueTooth4.0”1.1.2串口接收和发送(send&receive)寄存器配置请参考上方实验1的表格。实验1较实验1增加了串口接收功能,故寄存器配置有所改变,如下。9CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定CLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZPERCFG=0x00;//位置1P0口P0SEL=0x3c;//P0_2,P0_3,P0_4,P0_5用作串口,第二功能P2DIR&=~0XC0;//P0优先作为UART0,优先级U0CSR|=0x80;//UART方式U0GCR|=11;//U0GCR与U0BAUD配合U0BAUD|=216;//波特率设为115200UTX0IF=0;//UART0TX中断标志初始置位1(收发时候)U0CSR|=0X40;//允许接收IEN0|=0x84;//开总中断,接收中断源程序代码(部分)请读者自行分析/**************************************程序描述:例以abc#方式发送,#为结束符,返回abc。波特率:115200bps**************************************/……/***************************************************************串口初始化函数***************************************************************/voidInitUart()10{CLKCONCMD&=~0x40;//设置系统时钟源为32MHZ晶振while(CLKCONSTA&0x40);//等待晶振稳定CLKCONCMD&=~0x47;//设置系统主时钟频率为32MHZPERCFG=0x00;//位置1P0口P0SEL=0x3c;//P0_2,P0_3,P0_4,P0_5用作串口,第二功能P2DIR&=~0XC0;//P0优先作为UART0,优先级U0CSR|=0x80;//UART方式U0GCR|=11;//U0GCR与U0BAUD配合U0BAUD|=216;//波特率设为115200UTX0IF=0;//UART0TX中断标志初始置位1(收发时候)U0CSR|=0X40;//允许接收IEN0|=0x84;//开总中断,接收中断}/****************************************************************串口发送字符串函数****************************************************************/voidUart_Send_String(char*Data,intlen){intj;for(j=0;jlen;j++){U0DBUF=*Data++;while(UTX0IF==0);//发送完成标志位UTX0IF=0;}11}/***************************主函数***************************/voidmain(void){InitLed();//调用初始化函数InitUart();while(1){if(RXTXflag==1)//接收状态{LED1=1;//接收状态指示if(temp!=0){if((temp!=’#’)&&(datanumber50))//’#’被定义为结束字符,最多能接收50个字符Rxdata[datanumber++]=temp;else{RXTXflag=3;//进入发送状态LED1=0;//关指示灯}temp=0;}}if(
本文标题:串口通信
链接地址:https://www.777doc.com/doc-5519391 .html