历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | TI MSP430 如何实现模拟串口通信

发布者:古古斋 来源: eefocus关键字:TI  MSP430  模拟串口通信 手机看文章 扫描二维码
随时随地手机看文章

1、背景:


很多时候由于硬件资源有限,但又需要使用串口通信,此时可以考虑使用模拟串口;


2、前提:


要实现特定bps的串口速率,需要相应频率的定时器,保证误码率在可以接受的范围内;


例如:


1MHz的时钟最高可模拟9600bps的通信速率:1M/9600 = 104  误码率<1%


3、参考代码:


//******************************************************************************

//  ACLK = TACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO

//  //* An external watch crystal is required on XIN XOUT for ACLK *//  

//

//               MSP430G2xx1

//            -----------------

//        /||              XIN|-

//         | |                 | 32kHz

//         --|RST          XOUT|-

//           |                 |

//           |   CCI0B/TXD/P1.1|-------->

//           |                 | 9600 8N1

//           |   CCI0A/RXD/P1.2|<--------

//

//******************************************************************************

#include

 

//------------------------------------------------------------------------------

// Hardware-related definitions

//------------------------------------------------------------------------------

#define UART_TXD   0x02                     // TXD on P1.1 (Timer0_A.OUT0)

#define UART_RXD   0x04                     // RXD on P1.2 (Timer0_A.CCI1A)

 

 

//------------------------------------------------------------------------------

// Conditions for 9600 Baud SW UART, SMCLK = 1MHz

//------------------------------------------------------------------------------

#define UART_TBIT_DIV_2     (1000000 / (9600 * 2))

#define UART_TBIT           (1000000 / 9600)

 

 

//------------------------------------------------------------------------------

// Global variables used for full-duplex UART communication

//------------------------------------------------------------------------------

unsigned int txData;                        // UART internal variable for TX

unsigned char rxBuffer;                     // Received UART character

 

 

//------------------------------------------------------------------------------

// Function prototypes

//------------------------------------------------------------------------------

void TimerA_UART_init(void);

void TimerA_UART_tx(unsigned char byte);

void TimerA_UART_print(char *string);

 

 

//------------------------------------------------------------------------------

// main()

//------------------------------------------------------------------------------

int main(void)

{

    WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer

    if (CALBC1_1MHZ==0xFF) // If calibration constants erased

    {

      while(1);                             // do not load, trap CPU!!

    }

    DCOCTL = 0;                             // Select lowest DCOx and MODx settings

    BCSCTL1 = CALBC1_1MHZ;

    DCOCTL = CALDCO_1MHZ;

 

 

    P1OUT = 0x00;                           // Initialize all GPIO

    P1SEL = UART_TXD + UART_RXD;            // Timer function for TXD/RXD pins

    P1DIR = 0xFF & ~UART_RXD;               // Set all pins but RXD to output

    P2OUT = 0x00;

    P2SEL = 0x00;

    P2DIR = 0xFF;

 

 

    __enable_interrupt();

    

    TimerA_UART_init();                     // Start Timer_A UART

    TimerA_UART_print("G2xx1 TimerA UARTrn");

    TimerA_UART_print("READY.rn");

    

    for (;;)

    {

        // Wait for incoming character

        __bis_SR_register(LPM0_bits);

        

        // Update board outputs according to received byte

        if (rxBuffer & 0x01) P1OUT |= 0x01; else P1OUT &= ~0x01;    // P1.0

        if (rxBuffer & 0x02) P1OUT |= 0x08; else P1OUT &= ~0x08;    // P1.3

        if (rxBuffer & 0x04) P1OUT |= 0x10; else P1OUT &= ~0x10;    // P1.4

        if (rxBuffer & 0x08) P1OUT |= 0x20; else P1OUT &= ~0x20;    // P1.5

        if (rxBuffer & 0x10) P1OUT |= 0x40; else P1OUT &= ~0x40;    // P1.6

        if (rxBuffer & 0x20) P1OUT |= 0x80; else P1OUT &= ~0x80;    // P1.7

        if (rxBuffer & 0x40) P2OUT |= 0x40; else P2OUT &= ~0x40;    // P2.6

        if (rxBuffer & 0x80) P2OUT |= 0x80; else P2OUT &= ~0x80;    // P2.7

        

        // Echo received character

        TimerA_UART_tx(rxBuffer);

    }

}

//------------------------------------------------------------------------------

// Function configures Timer_A for full-duplex UART operation

//------------------------------------------------------------------------------

void TimerA_UART_init(void)

{

    TACCTL0 = OUT;                          // Set TXD Idle as Mark = '1'

    TACCTL1 = SCS + CM1 + CAP + CCIE;       // Sync, Neg Edge, Capture, Int

    TACTL = TASSEL_2 + MC_2;                // SMCLK, start in continuous mode

}

//------------------------------------------------------------------------------

// Outputs one byte using the Timer_A UART

//------------------------------------------------------------------------------

void TimerA_UART_tx(unsigned char byte)

{

    while (TACCTL0 & CCIE);                 // Ensure last char got TX'd

    TACCR0 = TAR;                           // Current state of TA counter

    TACCR0 += UART_TBIT;                    // One bit time till first bit

    TACCTL0 = OUTMOD0 + CCIE;               // Set TXD on EQU0, Int

    txData = byte;                          // Load global variable

    txData |= 0x100;                        // Add mark stop bit to TXData

    txData <<= 1;                           // Add space start bit

}

//------------------------------------------------------------------------------

// Prints a string over using the Timer_A UART

//------------------------------------------------------------------------------

void TimerA_UART_print(char *string)

{

    while (*string) {

        TimerA_UART_tx(*string++);

    }

}

//------------------------------------------------------------------------------

// Timer_A UART - Transmit Interrupt Handler

//------------------------------------------------------------------------------

#pragma vector = TIMERA0_VECTOR

__interrupt void Timer_A0_ISR(void)

{

    static unsigned char txBitCnt = 10;

    TACCR0 += UART_TBIT;                    // Add Offset to CCRx

    if (txBitCnt == 0) {                    // All bits TXed?

        TACCTL0 &= ~CCIE;                   // All bits TXed, disable interrupt

        txBitCnt = 10;                      // Re-load bit counter

    }

    else {

        if (txData & 0x01) {

          TACCTL0 &= ~OUTMOD2;              // TX Mark '1'

        }

        else {

          TACCTL0 |= OUTMOD2;               // TX Space '0'

        }

        txData >>= 1;

        txBitCnt--;

    }

}      

//------------------------------------------------------------------------------

// Timer_A UART - Receive Interrupt Handler

//------------------------------------------------------------------------------

#pragma vector = TIMERA1_VECTOR

__interrupt void Timer_A1_ISR(void)

{

    static unsigned char rxBitCnt = 8;

    static unsigned char rxData = 0;

 

 

    switch (__even_in_range(TAIV, TAIV_TAIFG)) { // Use calculated branching

        case TAIV_TACCR1:                        // TACCR1 CCIFG - UART RX

[1] [2]
关键字:TI  MSP430  模拟串口通信 引用地址:TI MSP430 如何实现模拟串口通信

上一篇:基于Energia的MPS430单片机编程
下一篇:MSP430学习笔记2---两个LED同时亮灭和顺闪

推荐阅读

之所以要讲这个滴答定时器,是因为它很特殊,stm32的定时器有内部也有外部的,而滴答定时器是在cortex内核里面的,明白滴答定时器,就可以根据这个思路去对stm32有更深的了解,可以说起到一个举一反三的作用吧。 滴答定时器在stm32手册中可以说是一笔带过,只是讲解了寄存器怎么用,很多童鞋可能对这个滴答定时器还是一头雾水,这第一篇先参考corte...
电磁流量计的研究流体噪声,探讨其产生的原因,找出降低流体噪声的方法,提高传感器信噪比特别是对微弱励磁电流(电磁水表、两线制电磁流量计)的发展和低流速(0.1m/s以下)及高流速(15m/s以上)流量测量范围的扩展具有重大意义。流体噪声电磁流量计在应用中除了受周围环境条件,电磁场、静电场等因素产生的噪声影响外,被测介质的流体噪声也是非常重要...
MSP430超低功耗(ULP)FRAM平台集成了独特的嵌入式FRAM和全面的超低功耗系统架构,让创新者能够以较低的能量预算提高性能。FRAM技术整合了SRAM的速度、灵活性和耐久性与闪存的稳定性和可靠性,大幅降低了功耗。MSP430 ULP FRAM产品系列包含丰富的器件,具有FRAM、ULP 16位MSP430 CPU和面向各种应用的智能外设。ULP架构展示了7种低功耗模式,能够延长电...
近日,华为内部发文,宣布正式成立海关和港口军团、智慧公路军团、数据中心能源军团和智能光伏军团,这是继今年2月华为宣布成立煤矿军团后,华为再次吹响军团集结号。美国制裁打压下,华为努力寻找更好的生存之道,开拓新业务领域,增加产业韧性。五大军团的成立,意味着华为企业业务走向深入。让科学家听得见炮火的声音“敢死队”、“城墙”、“阵地”“...

史海拾趣

问答坊 | AI 解惑

字大点好

漫步于站上文章主题及留言讨论,收获颇丰。可有的内容不错的文章却使用了很小的字号,特别是在日志上,再加上背景画面的托衬,看着觉得吃力,甚至干脆看不清。看来已经丢掉了很多很多学习机会,算是遗憾吧。…

查看全部问答∨

回复没有金币加吗

回复没有金币加吗…

查看全部问答∨

请推荐下好的单片机学习资料

请推荐下好的单片机学习资料…

查看全部问答∨

再问个关于keilC中内嵌汇编的问题

下面的程序编译通过,也没警告,想问下能这么引用内嵌汇编的延时函数吗delay(5);我吧RET注释掉了,不然只执行一次就退出来了??? #include<at89x51.h> #define  uint   unsigned int #define  uchar & ...…

查看全部问答∨

VxWorks+VmWare下使用串口的问题

  X86平台下用VxWorks编程控制串口,跟硬件最相关的就是对串口的读写操作。自己编了一个小的读写程序,在机器上跑不通。具体表现为:写操作无效(另一方用串口调试助手收不到数据),但是write()返回值正常,也能看到VmWare上的串口设备有闪动; ...…

查看全部问答∨

DSP6713开发板,DSP开发板,6713开发板

开发板中心网址:http://www.huanor.com 开发板中心论坛:http://www.huanor.com/bbs 淘宝网址:http://shop36289907.taobao.com QQ: 1060087047或者871001268 手机:13466617480或者15801405586 座机:010-82534219 Email:huanor_sales@hot ...…

查看全部问答∨

请问strrchr()函数如何使用

大家好,我能获取文件的整个路径"\\\\My Document\\\\1.txt",现在想获取文件名1.txt,请问该怎么用strrchr()函数来做?我是在win32 application中做的,请不要用mfc。谢谢了…

查看全部问答∨

有没有办法制作个相当于两口集线器的最简单的转接网线?

本意是想两台电脑用一个猫上网,又不想花钱买集线器,呵呵。…

查看全部问答∨

父亲的疑惑:为什么好人赚不到钱

忙了一下午,让父亲以前的客户A带我们去拆电路板的作坊了大量的拆机电解电容,回家吃饭已经比较晚了。 父亲今晚吃饭很慢,若有所思,突然冒出一句:A做了这么多年电路板生意,怎么还是一间老房子,怎么就没赚到钱。 我听了心里一酸,马上想起了两 ...…

查看全部问答∨

想了解下stm32f100c才11块,比M0还强啊

                                 f100的引脚和f103的一样是吗?code呢?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved