1、第四章 MSP430通信接口2 Copyright 2009 Texas Instruments All Rights Reservedwww.msp430.ubi.pt本章概述MSP430系列微控制器中具有通信模块系列微控制器中具有通信模块USCI (通用串行通信接口通用串行通信接口),可配置,可配置成以下三种通信接口:成以下三种通信接口: 它能够配置成UART(通用异步通信协议)(异步) SPI(串行外设接口协议) (同步) I2C(内部集成电路协议)模式(同步)此外,一些此外,一些MSP430系列还具有系列还具有USB模块,它完全兼容模块,它完全兼容USB 2.0全全速速 规规范范,扩,
2、扩展了展了MSP430的应用领域范围。的应用领域范围。3 Copyright 2009 Texas Instruments All Rights Reservedwww.msp430.ubi.pt本章结构 MSP430通信接口通信接口 4.1 通信系统概述 4.2 USCI模块概述 4.3 通用异步通信协议UART模式 4.4 串行外设接口协议SPI模式 4.5 内部集成电路协议I2C模式 4.6 通用串行总线协议USB模块 4.1 通信系统概述通信系统模型 所有数字通信系统都具有三种设备: 发送器:把信息处理成合适的格式,然后发送; 接收器:收集信息并抽取出原始数据; 通信介质:为信息流提供
3、物理介质,通常为双绞线、光纤或射频网络。通信常用术语 数据各位同时进行传送 数据逐位顺序进行传送 (串行通信)收/发可同时进行 (串行通信)收/发不可同时进行 单位时间传送的位数并行通信在并行通信系统中,要发送的数字值的每个位都具有独立的信号线。在并行通信系统中,要发送的数字值的每个位都具有独立的信号线。多条线上的逻辑电平共同形成了要发送的信息的值多条线上的逻辑电平共同形成了要发送的信息的值,下图为,下图为ASCII字字符符“W”并行传输并行传输。串口通信 (1/2) 串行通信的基本特征是数据逐位顺序进行传送串行通信的格式及约定(如:同步方式、通讯速率、数据块格式、信号电平等)不同,形成了多种
4、串行通信的协议与接口标准。常见的有: 通用异步收发器(UART) 通用串行总线(USB) I2C总线 CAN总线 SPI总线 RS-485,RS-232C,RS422A标准串行通信 (2/2) 在串行通信系统中,物理发送介质只需要一条信号线。发送器根据发送器和接收器之间指定的速率发送比特序列。要使通信双方同步,还需要一些额外的信息:起始位:加到要发送的信息的开头,以识别一个新数据的开始;停止位:加到要发送的信息的尾部,表示传输结束。图图 ASCII字符字符“W”串串行行传传输输同步、异步的概念处理器之间不使用公共的参考时钟,通信双方分别有自己的时钟源,但必须使用相同的波特率。例如UART就是属
5、于串行异步通信。由主机提供时钟与数据,从机使用该时钟接收数据或发送数据,即通信双方公用时钟源。例如:SPI和I2C就属于串行同步通信。 4.2 USCI模块概述USCI模块特性低功耗运行模式(自动启动)两个独立模块: USCI_A: 支持Lin/IrDA的UART; SPI( 主/从、3线和4线模式)。 USCI_B: SPI (主/从、3线和4线模式); I2C (主/从, 高达400 kHz)。双缓冲TX/RX;波特率/位时钟发生器: 自动波特率检测; 灵活的时钟源。RX干扰抑制;使能DMA;错误检测。初始化USCI模块 使用USCI模块之前,要先对其进行初始化配置。建议采用以下步骤初始化
6、或重配置USCI模块: 置位UCAxCTL1的UCSWRST; 初始化USCI寄存器; 配置相应引脚端口; 软件清零UCSWRST; 使能UCxRXIE和/或UCxTXIE中断。波特率生成 对于一个特定的时钟源的频率,分频值下列公式给出: 通常情况下,N不是一个整数,因此,需要使用调制器。低频波特率生成 当UCOS16 = 0时即选择为“低频波特率生成”模式。由于该模式使用低频时钟信号(32.768 kHz晶振),故其非常适合低功耗应用。 波特率是由分频器和调制器中获得。 寄存器将通过下面公式得出的值来进行配置。超采样波特率生成 当UCOS16 = 1时即选择为“超采样波特率生成”模式。这个模
7、式具有精确的位时序。它需要时钟源比所需的波特率高16倍。 通过以下两步可以产生波特率: 将时钟源16分频,结果存于BITCLK16,然后作为时钟源由分频器再次分频,然后供给第一个调制器。 BITCLK由BITCLK16定义,通过16分频及第二个调制器。 寄存器将通过下面公式得出的值来进行配置。 4.3 通用串行通信接口(USCI) UART模式主要内容 UART总线协议 总线结构 工作模式 数据传输时序 MSP430 UART模块 USCI概述 主从机模式 UART模块寄存器 应用示例全双工串行接口(UART)应用场合 UART(Universal Asynchronous Receiver
8、and Transmitter,异步异步通信收发器通信收发器),俗称“串口”。 串口是嵌入式系统与外界联系的重要手段,主要用于以下串口是嵌入式系统与外界联系的重要手段,主要用于以下两个方面:两个方面:1、UART直接和其他的控制器进行数据交换直接和其他的控制器进行数据交换2、UART和和PC机通信:由于机通信:由于PC机串口是机串口是RS232电平,所电平,所以连接时需要使用以连接时需要使用RS232转换器转换器片内片内UART模块模块其它其它通信设备通信设备片内片内UART模块模块PC机串口机串口RS232电平转换电平转换TxDRxDTxDRxDTxDRxDTxDRxDUART特性UART是
9、用硬件实现异步串行通信的通信接口电路。是用硬件实现异步串行通信的通信接口电路。全双工全双工异步模式可编程的异步模式可编程的7位、位、8位、位、9位数据位数据独立的波特率发生器独立的波特率发生器最大波特率是时钟频率的最大波特率是时钟频率的1/16两个缓冲器用于发送和接收两个缓冲器用于发送和接收CTS用于发送操作用于发送操作可编程的奇、偶和无校验可编程的奇、偶和无校验检测帧错误和纠正错误检测帧错误和纠正错误支持发送和接收中断支持发送和接收中断UART 工作原理 需选择一波特率作为发送(需选择一波特率作为发送(/接收)数据的时序,交互接收)数据的时序,交互双方的波特率必须一致。双方的波特率必须一致。
10、 UART的数据以帧为单位发送,一帧数据由以下几个的数据以帧为单位发送,一帧数据由以下几个部分顺序组成:开始位、数据位(可选位数部分顺序组成:开始位、数据位(可选位数7位或位或8位)、校验位(可选)、停止位(可选位数位)、校验位(可选)、停止位(可选位数1位或位或2位)。通信双方的可选部分的设置必须完全一致。位)。通信双方的可选部分的设置必须完全一致。 数据成功的发送和接收,都有专门的中断和状态位来数据成功的发送和接收,都有专门的中断和状态位来指出,例如,接收到一帧数据,如果相应的中断开启,指出,例如,接收到一帧数据,如果相应的中断开启,那么进入中断处理程序读出数据,如果未开启,则可那么进入中
11、断处理程序读出数据,如果未开启,则可以通过循环查看接收状态位来确定数否收到数据。以通过循环查看接收状态位来确定数否收到数据。UART帧结构图 8位数据、无校验、一位停止位的工作示例图起始位起始位1位位数据区(由低到高)数据区(由低到高)一般为一般为7位或位或8位位校验位校验位1位位停止位停止位一般可选为一般可选为1位或位或2位位使用UART通信使用使用UART通信需要两个引脚:通信需要两个引脚:常用UART接口 RS232:是美国电子工业协会是美国电子工业协会(EIA)制定的串行通讯标准,制定的串行通讯标准,又称又称RS-232-C 。RS232是一个全双工的通讯标准,它可是一个全双工的通讯标
12、准,它可以同时进行数据接收和发送的工作。以同时进行数据接收和发送的工作。 RS485:是美国电子工业协会是美国电子工业协会(EIA)制定的串行通讯标准,制定的串行通讯标准,又称又称RS-232-C 。RS232是一个全双工的通讯标准,它可是一个全双工的通讯标准,它可以同时进行数据接收和发送的工作。以同时进行数据接收和发送的工作。 串行异步通信的波特率 对于给定的BRCLK时钟源,所使用的波特率将决定分频因子N: 式中,fBRCLK为实际进入波特率发生器的时钟频率 Baud为实际所需要的波特率 如果两者之比 16,则令 UCOS16 = 0 低频模式 UCBR = INT(N) 取整 UCBRS
13、 = round( NINT(N) )8 四舍五入后取整如果两者之比 16,则令 UCOS16 = 1 低频模式 UCBR = INT(N/16) 取整 UCBRS = round(N/16)INT(N/16) 8 四舍五入后取整uart模式下可用的USCI寄存器名称描述访问复位值寄存器访问UCBxCTLW0USCI_Bx控制字0 读/写0001h字UCBxBRWUSCI_Bx波特率控制字读/写0000h字UCBxMCTLUSCI_Bx调制器控制 UCBxSTATUSCI_Bx状态寄存器 读/写00h字节UCBxRXBUFUSCI_Bx接收缓存读/写00h字节UCBxTXBUF USCI_Bx
14、发送缓存读/写00h字节UCBxI2COAUSCI_Bx I2C本机地址 读/写0000h字UCBxI2CSAUSCI_Bx I2C从机地址读/写0000h字UCBxICTL USCI_Bx中断控制读/写0200h 字UCBxIEUSCI_Bx中断使能读/写00h字节UCBxIFG USCI_Bx中断标志读/写02h字节UCBxIVUSCI_Bx中断向量 读0000h字USCI_Ax和USCI_Bx都有SPI模块,下面以USCI_Bx为例,介绍相关寄存器应用示例 SPI主机与从机通过三线SPI接口通信,主机发送数据给从机,同时又接收从机发来的数据,发送数据从0 x01开始递增,从机接收到数据,
15、就立马发出,主机接到这个数据,进入中断如果发送和接收数据相同,则点亮LED灯,否则熄灭。程序流程图RX ISR初始化SPI模块初始化发送数据MST_Data判断发送缓冲是否为空,判断发送缓冲是否为空,若是,则发送第一个字符若是,则发送第一个字符判断发送缓冲是否为空,判断发送缓冲是否为空,为空说明上次发送完毕为空说明上次发送完毕判断本次接收到的字符判断本次接收到的字符和上次发送是否相同,和上次发送是否相同,相同则亮灯相同则亮灯发送数据自加发送数据自加1,并赋值给发送缓冲并赋值给发送缓冲 主机RXISR初始化SPI模块判断发送缓冲是否为空,判断发送缓冲是否为空,为空说明上次发送完毕为空说明上次发送
16、完毕本次接收到的数据赋值给发送缓冲 从机主机端口初始化 P8SEL |= BIT2+BIT3; P8DIR |= BIT2+BIT3;选择P8.4P8.6为外设功能选择P8.4P8.6端口方向为输出 UCA1CTL1 |= UCSWRST; UCA1CTL1 |= UCSSEL_1; UCA1BR0 = 0 x03; UCA1BR1 = 0; UCA1MCTL = UCBRS_3+UCBRF_0; UCA1CTL1 &= UCSWRST UCA1IE |= UCRXIE;主机UART模块初始化USCI_Bx模块逻辑复位CLK = ACLK配置波特率, 32kHz/9600=3.41调制UCBR
17、Sx=3, UCBRFx=0USCI_Bx复位释放使能UART模块接收中断时钟配置 while(BAKCTL & LOCKIO) BAKCTL &= (LOCKIO); UCSCTL6 &= (XT1OFF); UCSCTL6 |= XCAP_3; do UCSCTL7 &= (XT2OFFG + XT1LFOFFG + DCOFFG); SFRIFG1 &= OFIFG; while (SFRIFG1&OFIFG);打开XT1解锁XT1引脚选择内接电容大小 清除XT2,XT1,DCO错误标志清除晶振错误中断标志测试晶振错误标志 主机接收中断#pragma vector=USCI_ B1_VE
18、CTOR_interrupt void USCI_ B1_ISR(void) switch(_even_in_range(UC B1IV,4) case 0: break; case 2: while (!(UC B1IFG&UCTXIFG); if (UC B1RXBUF=SLV_Data) P1OUT |= 0 x01; else P1OUT &= 0 x01; MST_Data+; SLV_Data+; UCB1TXBUF = MST_Data; _delay_cycles(500); break; case 4: break; default: break; 判断发送缓冲是否为空,如果
19、为空,标志位置位,则说明上个数据未发送完毕,等待直到数据发送完毕 如果接收与发送相同,点亮LED发送下一个字符从机端口初始化 P8SEL |= BIT4+BIT5+BIT6; P8DIR |= BIT4+BIT5+BIT6; P1REN |= BIT4; P1OUT |= BIT4; P1IES &=BIT4; P1IFG &=BIT4; P1IE |= BIT4;使能P1.4内部电阻P1.4输出为1选择P8.4P8.6为外设功能选择P8.4P8.6端口方向为输出P1.4上升沿捕获,进入中断P1.4 IFG 清零P1.4中断使能主机SPI模块初始化UCB1CTL1 |= UCSWRST;UCB
20、1CTL0 |= UCSYNC+UCCKPL+UCMSB; UCB1CTL1 &= UCSWRSTUSCI_Bx模块逻辑复位3线,8位,主机模式,时钟极性高,MSB先发送USCI_Bx复位释放从机接收中断#pragma vector=USCI_ B1_VECTOR_interrupt void USCI_ B1_ISR(void) switch(_even_in_range(UC B1IV,4) case 0: break; case 2: while (!(UC B1IFG&UCTXIFG); UCA0TXBUF = UCA0RXBUF; break; case 4: break; defa
21、ult: break; 判断发送缓冲是否为空,如果为空,标志位置位,则说明上个数据未发送完毕,等待直到数据发送完毕发送下一个字符从机接收中断#pragma vector=USCI_ B1_VECTOR_interrupt void USCI_ B1_ISR(void) switch(_even_in_range(UC B1IV,4) case 0: break; case 2: while (!(UC B1IFG&UCTXIFG); UCA0TXBUF = UCA0RXBUF; break; case 4: break; default: break; 判断发送缓冲是否为空,如果为空,标志位置
22、位,则说明上个数据未发送完毕,等待直到数据发送完毕发送下一个字符从机主机开始工作提示中断#pragma vector=PORT1_VECTOR_interrupt void Port_1(void) P1IFG &= BIT4; P1IE &= BIT4; UCB1CTL1 |= UCSWRST; UCB1CTL1 &= UCSWRST; UCB1IE |= UCRXIE;USCI_Bx复位释放主机准备就绪,USCI_Bx模块逻辑复位打开SPI中断主机端口初始化库/ Set P1.1 for slave reset GPIO_setOutputHighOnPin(_MSP430_BASEADD
23、RESS_PORT1_R_, GPIO_PORT_P1, GPIO_PIN1 );/ Set P1.0 to output direction GPIO_setAsOutputPin(_MSP430_BASEADDRESS_PORT1_R_, GPIO_PORT_P1, GPIO_PIN0 );/ P3.5,4,0 option select GPIO_setAsPeripheralModuleFunctionInputPin(_MSP430_BASEADDRESS_PORT8_R_, GPIO_PORT_P8, GPIO_PIN4 + GPIO_PIN5 + GPIO_PIN6 );USCI
24、介绍:UART模式 UART模块特征包括:模块特征包括: 带奇校验、偶校验或非奇偶校验的带奇校验、偶校验或非奇偶校验的7或或8位数据位数据 独立的发送和接收移位寄存器独立的发送和接收移位寄存器 独立的发送和接受缓冲寄存器独立的发送和接受缓冲寄存器 最低位优先或最高位优先的数据发送和接收最低位优先或最高位优先的数据发送和接收 多处理器系统的内置空闲线路和地址位通信协议多处理器系统的内置空闲线路和地址位通信协议 用于自动从用于自动从LPMx模式唤醒的接收机起始边沿检测模式唤醒的接收机起始边沿检测 波特率可编程控制,支持小数波特率调制波特率可编程控制,支持小数波特率调制 用于错误检测和抑制的状态标志
25、用于错误检测和抑制的状态标志 用于地址检测的状态标志用于地址检测的状态标志 发送和接收的独立中断能力发送和接收的独立中断能力串行异步通信的波特率在低频模式下,分频因子的整数部分通过预分频器实现:式中,fBRCLK 为实际进入波特率发生器的时钟频率 Baud为实际所需要的波特率如果两者之比 16,则令 UCOS16 = 0 UCBR = INT(N)UCBRS = round( N-INT(N) )8如果两者之比 16,则令UCOS16 = 1UCBR = INT(N/16)UCBRS = round(N/16)-INT(N/16)16USCI_Ax模块框图 UART模式在异步模式下,USCI_
26、Ax模块通过两个外部引脚UCAxRXD和UCAxTXD将芯片连接到外部系统。当UCSYNC = 0时,选择UART模式。UART通信字符格式 UART的字符格式,包括一个起始位,7或8位数据位,一个奇/偶/非奇偶校验位,地址位(地址位模式),以及1或2个停止位。UCMSB位控制传送方向,选择低位或高位优先,UART通讯的典型选择是低位优先。串行通信模式 MSP430单片机的串行通信模式有4种,他们分别是由UCMODE控制选择。这是最普遍采用的工作模式,也是最为简单的工作模式。示例:回应接收的字符,开启接收中断,每接收到一个字符,就进入中断处理函数,将接收缓冲寄存器的值赋给发送缓冲寄存器,波特率
27、为9600,ACLK = 32768Hz crystal, MCLK = SMCLK = DCO 1.045MHz,波特率配置计算方法:ACLK / Baud = 32768Hz 9600 = 3.41UCA1BR0 = 0 x03; UCA1BR1 = 0 x00; 由于ACLK / Baud 16,round(N-INT(N)16 = 3void main(void) UCACTL1 |= UCSWRST; / 复位USCI_A1状态机UCACTL1 |= UCSSEL_1; / CLK = ACLK = 32kHzUCABR0 = 0 x03; / 32kHz/9600=3.41 UCA
28、BR1 = 0 x00; UCAMCTL = UCBRS_3+UCBRF_0; / UCBRS = round(N-INT(N)8 = 3UCACTL1 &= UCSWRST; / 初始化复位USCI_A1状态机UCAIE |= UCRXIE; / 使能USCI_A1接收中断_bis_SR_register(LPM3_bits + GIE); / 进入LPM3,使能全局中断#pragma vector=USCI_A0_VECTOR_interrupt void USCI_A0_ISR(void)switch(_even_in_range(UCA0IV,4)case 0: break; / Vector 0 无中断case 2: / Vector 2 - RXIFGwhile (!(UCA0IFG&UCTXIFG); / USCI_A1发送缓冲是否准备就绪?UCA0TXBUF = UCA0RXBUF; / 将接收到的字符传递给发送缓冲break;case 4: break; / Vector 4 - TXIFGdefault: break; 波特率自检测序列波特率自检测同步序列谢谢