zoukankan      html  css  js  c++  java
  • MSP430学习笔记:UART

    串通可以两种方法其现

    一、USART硬件直接实现

    二、通过定时器软件实现

     

    该模块可现现:

    UART异步串行通讯

    SPI同步串行通讯

    I2C同步串行通讯

      

     

    UxCTL控制寄存器

    7:PENA

    6:PEV

    5:SPB

    4:CHAR

    3:LISTEN

    2:SYNC

    1:MM

    0:SWRST

    PENA 校验允许位

    校验禁止

    校验允许

    校验允许时,发送端发送校验,接收端接收该校验,地址位多机模式中,地址位包含校验操作.

    PEV 奇偶校验位,该位在校验允许时有效

    奇校验

    偶校验

    SPB 停止位选择.决定发送的停止位数,但接收时接收器只检测1位停止位.

    0 1位停止位

    1 2位停止位

    CHAR 字符长度

    0 7

    1 8

    LISTEN 反馈选择.选择是否发送数据由内部反馈给接收器

    无反馈

    有反馈,发送信号由内部反馈给接收器

    SYNC USART模块的模式选择

    0 UART模式[异步]

    1 SPI模式[同步]

    MM 多机模式选择位

    线路空闲多机协议

    地址位多机协议

    SWRST 控制位

    上电时该位置位,此时USART状态机和运行标志初始化成复状态(URXIFG=0,URXIE=0,UTXIE=0,UTXIFG=1)。所有受影响的逻辑保持在复位状态,直至SWRST复位。也就是说一次系统复位后,只有对SWRST复位,USART才能重新被允许。而接收和发送允许标志URXEUTXE不会因SWRST而更改。

    SWRST位会使URXIEUTXIEURXIFGRXWAKETXWAKERXERRBRKPEOEFE等复位。

    在串行口使用设置时,这一位起重要的作用。一次正确的USART模块初始化应该是这样设置过程的:先在SWRST=1时设置,设置完串口后再设置SWRST=0;最后如需要中断,则设置相应的中断使能。

    UxTCTL发送控制寄存器

    6:CKPL

    5:SSEL1

    4:SSEL0

    3:URXSE

    2:TXWAKE

    0:TXEPT

    CKPL时钟极性控制位

    0 UCLKI信号与UCLK信号极性相同

    1 UCLKI信号与UCLK信号极性相反

    SSEL1SSEL0时钟源选择,此两位确定波特率发生器的时钟源

    外部时钟UCLKI

    辅助时钟ACLK

    子系统时钟SMCLK

    子系统时钟SMCLK

    URXSE 接收触发沿控制位

    没有接收触发沿检测

    有接收触发沿检测

    TXWAKE 传输唤醒控制

    下一个要传输的字符为数据

    下一个要传输的字符是地址

    TXEPT 发送器空标志,在异步模式与同步模式时是不一样的。

    正在传输数据或者发送缓冲器(UTXBUF)有数据

    表示发送移位寄存器和UTXBUF空或者SWRST=1

    URCTL接收控制寄存器

    7:FE

    6:PE

    5:OE

    4:BRK

    3:URXEIE

    2:URXWIE

    1:RXWAKE

    0:RXERR

    FE 帧错误标志位

    没有帧错误

    帧错误

    PE 校验错误标志位

    校验正确

    校验错误

    OE 溢出标志位

    无溢出

    有溢出

    BRK 打断检测位

    没有被打断

    被打断

    URXEIE 接收出错中断允许位

    不允许中断,不接收出错字符并且不改变URXIFG标志

    允许中断,出错字符接收并且能够置位URXIFG

    URXWIE 接收唤醒中断允许位,当接收到地址字符时,该位能够置位URXIFG,当URXEIE=0,如果接收内容有错误,该位不能置位URXIFG

    所有接收的字符都能够置位URXIFG

    只能接收到地址字符才能置位URXIFG

    RXWAKE 接收唤醒检测位。在地址位多机模式,接收字符地址位置位时,该机被唤醒,在线路空闲多机模式,在接收到字符前检测到URXD线路空闲时,该机被唤起,RXWAKE置位。

    没有被唤醒,接收到的字符是数据

    唤醒,接收的字符是地址

    RXERR 接收错误标志位

    没有接收错误

    有接收到错误

    UxBR0UxBR1波特率选择寄存器

    这两个寄存器是用于存放波特率分频因子的整数部分。

    UxBR0波特率选择寄存器0

    UxBR1波特率选择寄存器1

    UxMCTL波特率调整控制寄存器

    M7

    M6

    M5

    M4

    M3

    M2

    M1

    M0

    若波特率发生器的输入频率BRCLK不是所需波特率的整数倍,带有一小数,则整数部分写UBR寄存器,小数部分由调整寄存器UxMCTL的内容反映。波特率由以下公式计算:

    波特率=BRCLK/(UBR+(M7+M6+M0)/8)

    URXBUF接收数据缓存

    接收缓存存放移位寄存器最后接收的字符,可由用户访问。读接收缓存可以复位接收时产生的各种错误标志、RXWAKE位和URXIFGx位。如果传输7位数据,接收缓存内容右对齐,最高位为0

    当收接和控制条件为真时,接收缓存装入当前接收到的字符。

    当接收和控制条件为真时接收数据缓存结果

    UTXBUF发送数据缓存

    发送缓存内容可以传至发送移位寄存器,然后由UTXDx传输。对发送缓存进行写操作可以复位UTXIFGx。如果传输出7位数据,发送缓存内容最高为0

     

     

    关于波特率:

    分频因子N分频计数器时钟BRCLK

    N= BRCLK/波特率

     

    UBRUXBR0 16位数据

    MX为调整数据

     

    波特率 = BRCLK/N=BRCLK/UBR+(M7+M6+…….M0)/8

     

    如:BRCLK = 32.768KHZ   要产生2400HZ波特

    32768/2400=13.65

    UXBR013

    调整是8位的:0.65x8=5,所以有5130写时最好差开 01101011

    简单例子:

    #include  <msp430f2274.h>
    volatile char Temp_Size;
    void DisplayCharacter(char array[], char size);
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
    BCSCTL1 |= XTS;
    // 设置时基寄存器1,使ACLK = LFXT1 = HF XTAL,也就是高频模式.
    P3DIR |= 0x1F; // 设置P3.4方向寄存器为输出
    char array[]= "dddddddddddd"; // Connection Established, display msg to hyperterminal

      while(1)
      {
        Temp_Size = sizeof(array);
        DisplayCharacter(array, Temp_Size);
      }
    }

    void DisplayCharacter(char array[], char size){
      
      _DINT();
      P3SEL |= 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
      UCA0CTL1 |= UCSSEL_2;                     // SMCLK
      UCA0BR0 = 0x41;                            // 8MHz 9600
      UCA0BR1 = 0x03;                              // 8MHz 9600
      UCA0MCTL = UCBRS1;                        // Modulation UCBRSx = 2
      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
      for(int count=0; count<size; count++){
      while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
      UCA0TXBUF = array[count];                    // TX -> RXed character
      _EINT();
      }
    }

  • 相关阅读:
    WebADI_数据验证1_建立基于PLSQL返回FND Message验证(案例)
    PLSQL_案例优化系列_探寻表设计对SQL优化的重要性(案例4)
    PLSQL_案例优化系列_学习左右SQL执行计划各种方法(案例14)
    PLSQL_案例优化系列_探讨该如何分析读懂析执行计划(案例9)
    WebADI_配置设定08_设定参数WebADI Parameters List(案例)
    WebADI_案例实施01_开发一个基于R12.1.3的简单WebADI Desktop(案例)
    PLSQL_案例优化系列_洞察表连接与SQL优化之间关系(案例8)
    WebADI_配置设定09_设定组件WebADI Components(案例)
    WebADI_配置设定07_设定显示WebADI Content / Mapping(案例)
    WebADI_案例实施03_利用FND_LOAD安装和迁移WEBADI以及设定(案例)
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589060.html
Copyright © 2011-2022 走看看