MSP430异步串行通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MSP430F6638中断向量有:
串口中断向量:USCI_A0_VECTOR USCI_A1_VECTOR USCI_B0_VECTOR USCI_B1_VECTOR
外部中断向量:PORT1_VECTOR PORT2_VECTOR
定时器中断向量:TIMER0_A1_VECTOR TIMER0_A0_VECTOR TIMER1_A1_VECTOR TIMER1_A0_VECTOR
发送器
半双工方式 接收器
发送器 接收器
需要两根数据线
接收器 发送器
发送器 接收器
发送器 接收器
并行通信的数据线
时钟CLK 数据D0-D7 读写控制位R/W 数据地址控制位
串行通信的数据线(3线通信)
1根时钟线 1根发送线 1根接收线
串行通信协议的分类
1.UART 两线:异步+全双工 = 慢+可以多主机 2.SPI 三线:同步+全双工 = 快+不能多主机(再加数
= round((9.10–9)× 8)=round(0.8)=1
UCA0CTL1 |= UCSSEL_2;// 选SMCLK为时钟 UCAxBR0 = 9; UCAxBR1 = 0; UCAxMCTL| = UCBRS_1;
例2:32768Hz频率下驱动以2400波特率异步通信。 ACLK=32768Hz, MCLK = SMCLK = 1.045MHz
3.UCA0RXBUF接收到完整数据后,触发 UCA0RXIFG中断标志位,表明CPU应尽快将 UCA0RXBUF里的数据“取走”。
四、UART应用
MSP430G2xx3
/|\|
XIN|-
||
|
--|RST
XOUT|-
|
|
| P1.2/UCA0TXD|------------>
|
| 9600 - 8N1
}
MSP430G2553中断向量有:
串口中断向量:USCIAB0RX_VECTOR USCIAB0TX_VECTOR
外部中断向量:PORT1_VECTOR PORT2_VECTOR
定时器中断向量:TIMER0_A1_VECTOR TIMER0_A0_VECTOR TIMER1_A1_VECTOR TIMER1_A0_VECTOR
N == 32768/2400 = 13.65 UCBRx = INT(N) = INT(13.65) = 13 UCBRSx = round( ( N–INT(N) )×8 ) =round((13.65–13)× 8)=round(5.2)=5
UCA0CTL1 |= UCSSEL_1; // 选ACLK为时钟 UCAxBR0 = 13; UCAxBR1 = 0 ; UCAxMCTL| = UCBRS_5;
牛人的建议:
I2C线更少,比UART、SPI更为强大,但是技术上也更加麻烦些, 因为I2C需要有双向IO的支持,而且使用上拉电阻,抗干扰能力较 弱,一般用于同一板卡上芯片之间的通信,较少用于远距离通信。 SPI实现要简单一些,UART需要固定的波特率,就是说两位数据的 间隔要相等,而SPI则无所谓,因为它是有时钟的协议。 I2C的速度比SPI慢一点,协议比SPI复杂一点,但是连线也比标准 的SPI要少。
在过采样下(Oversampling Baud Rate Mode): UCBRx = INT(N/16)
UCBRFx = round( ( (N/16) – INT(N/16) ) × 16 )
UCAxMCTL:
例3:1048576Hz频率下驱动以9600波特率异步通讯
UCBRx = INT(N/16)=INT(fBRCLK/Baudrate/16)
// Stop WDT
UCA0CTL1 |= UCSWRST;
P1SEL = BIT1 + BIT2 ;
// P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ;
// P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_1;
// CLK = ACLK
二、UART原理
UART:通用异步收发器的缩写,一般简称为串口。 Universal Asynchronous Receive/Transmit
有两根数据线:发送Tx和接收Rx。
不需要时钟线,全双工工作。
UART双机通信
UART多机通信
波特率和比特率:
波特率是指:单片机或计算机在串口通信时的速率。 指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数 变化的次数。 如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个 停止位,8个数据位),这时的波特率为240Bd, 比特率为10位*240个/秒=2400bps。 又比如每秒钟传送240个二进制位,这时的波特率为240Bd, 比特率也是240bps。 波特率,可以通俗的理解为一个设备在一秒钟内发送(或接收)了 多少码元的数据。 它是对符号传输速率的一种度量,1波特即指每秒传输1个码元符号 (通过不同的调制方式,可以在一个码元符号上负载多个bit位信息), 1比特每秒是指每秒传输1比特(bit)。
| P1.1/UCA0RXD|<------------
#include <msp430g2553.h>
void main( )
{
WDTCTL = WDTPW + WDTHOLD;
UCA0CTL1 |= UCSWRST;
P1SEL |= BIT1 + BIT2 ;
// P1.1 = RXD, P1.2=TXD
TIMER0_B1_VECTOR TIMER0_B0_VECTOR TIMER2_A1_VECTOR TIMER2_A0_VECTOR
MSP430G2xx3
/|\|
XIN|-
||
| 32kHz
--|RST
XOUT|-
|
|
| P1.2/UCA0TXD|------------>
|
| 9600 - 8N1
I2C: 能用于替代标准的并行总线,能连接的各种集成电路和功能模块。 I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控 制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们 自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在 同一个I2C总线上共存。
IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且 任意两个设备间的长度不得超过2米;而对于串口而言,长度可达 1200米。
2.USCI_B模块 SPI、I2C模式
•USCI模块初始化
1.设置UCSWRST=1 2.初始化所有的USCI寄存器 3.配置端口 4.软件清除UCSWRST 5.设置UCRXIE或UCTXIE 使能中断
void USCI_A0_graceInit(void) {
UCA0CTL1 |= UCSWRST;
P1SEL2 |= BIT1 + BIT2 ;
// P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2;
// SMCLK
UCA0BR0 = 104;
// 1MHz 9600
UCA0BR1 = 0;
// 1MHz 9600
UCA0MCTL = UCBRS_1;
// Modulation UCபைடு நூலகம்RSx = 1
UCA0CTL1 &= ~UCSWRST;
// **Initialize USCI state machine**
IE2 |= UCA0RXIE;
// Enable USCI_A0 RX interrupt
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
异步串行通信
内容提要
通信的基本知识 UART通信 UART应用 IrDA通信
一、概述
分为同步通信与异步通信
异步通信:通信双方按照事先约定好的时钟速率来 进行通信,没有公共的时钟线。 同步通信:双方拥有公共时钟,按时钟信号来更新 数据。
分为单工、全双工、半双工
单工方式
A
发送器
B
接收器
全双工方式
发送器 接收器
在低频模式下: UCBRx = INT(N)
UCBRSx = round( ( N – INT(N) ) × 8 ) UCAxMCTL:
例1:1048576Hz频率下驱动以115200波特率异步通讯 (ACLK = 32768Hz, MCLK = SMCLK = 1048576Hz。)
N = 1048576/115200 = ~9.10 UCBRx = INT(N) = INT(9.10) = 9 UCBRSx = round((N–INT(N))×8)
| P1.1/UCA0RXD|<------------
#include <msp430g2553.h>
const char string1[] = { "Hello World\r\n" };
unsigned int i;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
据线才行) 3.I2C 两线:同步+半双工 = 慢+可以多主机
SPI:高速同步串行口。3~4线接口,收发独立、可同步进行 UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢
UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它 提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器 或其它使用RS-232C接口的串行设备通信了。 UART还提供以下功能: 将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计 算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器 件使用。
UCBRx = INT(1048576Hz/(16*9600)) = INT(6.8) UCBRFx = round( ( (N/16) – INT(N/16) ) × 16 )
= round( ( 6.8 – 6 ) × 16 )=13
UCAxCTL1 |= UCSSEL_2; // 选SMCLK为时钟
UCA0CTL1 = UCSSEL_2;//设时钟
UCA0MCTL = UCBRF_0 + UCBRS_1;//配置波特率
UCA0BR0 = 104;
//配置波特率
UCA0CTL1 &= ~UCSWRST;
}
UART工作过程
1.用Grace将USCI_A0模块配置为UART模式,并 初始化。
2.向UCA0TXBUF里扔数据,自动将数据发送出去。 当UCA0TXBUF为空时,触发UCA0TXIFG中断标 志位,表明可以向UCA0TXBUF里扔下一个数据。
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
while (!(IFG2&UCA0TXIFG));
// USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF;
// TX -> RXed character
UCA0BR0 = 0x03;
// 32kHz/9600 = 3.41
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS_3;
// Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST;
// **Initialize USCI state machine**
波特率的计算
1.设置波特率时要选择合适的时钟源
较低的波特率,一般是小于等于9600,可选择ACLK 大于9600,要选用SMCLK。
(因为波特率发生器分频系数要求大于3)
2.UCAxBR1和UCAxBR0、UCAxMCTL的设置 N = fBRCLK/Baudrate
如果N等于或大于16,可以设置UCOS16=1为高频模式
UCAxBR0 = 6;
// 1MHz 9600
UCAxBR1 = 0;
// 1MHz 9600
UCAxMCTL |= UCBRF_13 + UCOS16;
//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16
三、MSP430G2553UART
1.USCI_A模块 UART、LIN、IrDA、SPI模式
IE2 |= UCA0RXIE;
// Enable USCI_A0 RX interrupt
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ int until Byte RXed