This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430F5172:我想使用I/0来实现UART,但我无法完成它。

Guru**** 2587345 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/619143/compiler-msp430f5172-i-want-to-use-i-0-to-realize-the-uart-but-i-can-t-finish-it

部件号:MSP430F5172

工具/软件:TI C/C++编译器

尊敬的各位,

我想通过Timer0_D使用I/O来实现UART,因为USCI模块已经用完,但我的代码无法实现,我需要工程师的帮助。

// 1200波特SW UART的条件,ACLK = 3.2768万

#Define BiTime_5 0x0E //~ 0.5 位长度+小调整
#define Bi Time 0x1B // 427us位长度~ 2341波特

无符号int RXTXData;
无符号字符位计数;

//void TX_Byte (void);
void TX_Byte (无符号字符字节);
void RX_Ready (void);


#include <msp430f5172.h>


int main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
TD1CCTL0 =输出; // TXD空闲状态标记为
TD1CTL0 = tassel_1 + MC_2; // ACLK,连续模式
P2SEL |=BIT1; //为TXD功能
P2DIR |=BITS1;2.1
|= BITS2;
P1DIR |= BITS0;
P1OUT |=BIT0;


// Mainloop
for (;;)
{
RX_Ready(); // UART准备接收一字节
__bis_sr_register (LPM3_bits + GIE); //输入LPM3 w/ interr,直到字符RXED
TX_Byte (5); //接收到的TX Back RXed Byte
}
//


函数从RXTXData缓冲区
void TX_Byte (无符号字符字节)传输字符
{
RXTXData=Byte;
BitCnt = 0xA; //加载位计数器,8data + ST/SP
unsigned int t=TD1R;
while (TD1CCR0 != t) //防止异步捕获
TD1CCR0 = TD1R; // TA计数
器TD1CCR0 += Bitime的当前状态; //第一位之前的某个时间
RXTXData |= 0x100; //向RXTXData
RXTXData添加标记停止位= RXTXData <<1; //添加空间起始位
TD1CCTL0 = OUTMOD0 + CCIE; // TXD = MARK =空闲
时间( TD1CCTL0 & CCIE ); //等待TX完成
}//


函数读取UART以将字符接收到RXTXData缓冲区
void RX_Ready (void){

BitCnt = 0x8; //加载位计数
器TD1CCTL0 = SCS +D3+ OUTMOD0 + CM1 + CAP + CCIE;//同步,Neg Edge,Cap
}
#pragma vector=TIMER0_D1_Vector
__interrupt TIMER0_D1_ISR (void)
{
TD1CCR0+= Bitime; //向CCR0添加偏移

// RX
IF (TD1CCTL0和DOR0) // CCI0B上的RX?
{
IF( TD1CCTL0和CAP ) //捕获模式=起始位边缘
{
TD1CCTL0 &=~μ L容量; //从捕获模式切换到比较模式
TD1CCR0 += Bibete_5;
}
否则
{
RXTXData = RXTXData >> 1;
IF (TD1CCTL0和SCCI) //在接收锁定中获取等待位
RXTXData |= 0x80;
位计数--; //所有位均已RXed?
如果( BitCnt == 0)
//>>>>> 此处接收字节解码<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
TD1CCTL0 &=~ CCIE; //所有位RXed,禁用中断
__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);//从0 (SR)清除LPM3位
}
//>>>>> 此处为接收字节的解码<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}

}//
TX
else
{
IF (BitCnt == 0)
TD1CCTL0 &=~ CCIE; //所有位TXED,禁用中断
否则
{
TD1CCTL0 |= OUTMOD2; // TX空间
IF (RXTXData和0x01)
TD1CCTL0 &=~ OUTMOD2; // TX标记
RXTXData = RXTXData >> 1;
BitCnt --;
}
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否查看过TI提供的软件UART的代码示例? 此文件 包含基于计时器的软件UART。 这是一个例子

    • Msp430x20x3_TA_uart240.c       Timer_A,超低功耗UART 2400回波,32kHz ACLK

    在您的案例中,哪些不起作用? 如果您要提供有关未按预期工作的确切部件的更多详细信息,则查找问题会更容易。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法传输或接收数据。