专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
技术问题:如何使用MSP430的timer_B 模拟UART收接口?有做过的兄弟给个例子参考下
2019-03-24 15:45
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
1588
4
1697
TB1(P4.1)作为mcu_txd;TB2(P4.2)作为mcu_rxd。当前MSP430发送侧已调通,可正常发送数据;但接收侧仍不能接收。
据相关资料,定时器B无输入信号锁存功能,故障定时器A的那一套接收流程不适用于定时器B。在这里集思广益,期望大
伙提些实用的建议。 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Main函数
1楼-- · 2019-03-24 17:49
< 你好,请参看下TImer模拟UART的例子,在TI官方的例程包中有完整的接受和发送的代码,你可以参考一下。
加载中...
eass_li
2楼-- · 2019-03-24 23:37
< :TI_MSP430_内容页_SA7 --> 已经参考了的,但TA与TB还是存在一些关键差异的:即定时器B无输入信号锁存功能(无SCCI);是否可通过CCI位来判断输入电平;
如下附上中断接收发送代码,劳烦各位帮忙看看,非常感谢啊:
#if __VER__ < 200
interrupt[TIMERB0_VECTOR] void Timer_B (void)
#else
#pragma vector=TIMERB1_VECTOR
__interrupt void TIMERB1_ISR (void)
#endif
{
// RX(接收字节)
if ( TBCCTL2 & CCIFG ) // RX on CCI2A?(如果CCI2A是捕获输入引脚)
{
TBCCR2 += Bitime; // Add Offset to CCR2(下一定时时间为1位时间)
if( TBCCTL2 & CAP ) // Capture mode = start bit edge(如果是在捕获模式,则是在等待起始位)
{
TBCCTL2 &= ~ CAP; // Switch from capture to compare mode(得到起始位后改为比较模式)
TBCCR2 += Bitime_5; //定时位置改到位的中间位置(加半个位的时间)
}
else
{
RX_DATA = RX_DATA >> 1; //先收到的是低位
if (TBCCTL2 & CCI) // Get bit waiting in receive latch,TIMREB 无SSCI锁存位
RX_DATA |= 0x80; //CCI中锁存的是比较相等时的输入引脚上的信号
BitCnt --; // All bits RXed? //位计数减1
if ( BitCnt == 0) //接收完一个字节?
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
BitCnt = 0x08;
TBCCTL2 &= ~ CCIE; // All bits RXed, disable interrupt(接收完一个字节后禁止中断)
//_BIC_SR_IRQ(LPM2_bits); // Clear LPM3 bits from 0(SR)(准备退出低功耗模式)
}
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
TBCCTL2 &= ~ CCIFG;
}
// TX(发送字节,在进入发送中断前已经置位OUTMOD0)
else if(TBCCTL1 & CCIFG)
{
TBCCR1 += Bitime; // Add Offset to CCR1(下一定时时间为1位时间)
if ( BitCnt == 0) //所有位发送完成
TBCCTL1 &= ~ CCIE; // All bits TXed, disable interrupt(禁止中断)
else
{
if (TX_DATA & 0x01)
TBCCTL1 &= ~ OUTMOD2; // TX Mark(输出模式OUTMOD0:置位)
else
TBCCTL1 |= OUTMOD2; // TX Space(输出模式OUTMOD2+OUTMOD0:复位)
TX_DATA = TX_DATA >> 1; //低位先发
BitCnt --; //位计数
}
TBCCTL1 &= ~ CCIFG;
}
}
加载中...
eass_li
3楼-- · 2019-03-25 00:24
精彩回答 2 元偷偷看……
加载中...
wstt
4楼-- · 2019-03-25 00:47
LZ能不能把解决的方法描述下
加载中...
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
如下附上中断接收发送代码,劳烦各位帮忙看看,非常感谢啊:
#if __VER__ < 200
interrupt[TIMERB0_VECTOR] void Timer_B (void)
#else
#pragma vector=TIMERB1_VECTOR
__interrupt void TIMERB1_ISR (void)
#endif
{
// RX(接收字节)
if ( TBCCTL2 & CCIFG ) // RX on CCI2A?(如果CCI2A是捕获输入引脚)
{
TBCCR2 += Bitime; // Add Offset to CCR2(下一定时时间为1位时间)
if( TBCCTL2 & CAP ) // Capture mode = start bit edge(如果是在捕获模式,则是在等待起始位)
{
TBCCTL2 &= ~ CAP; // Switch from capture to compare mode(得到起始位后改为比较模式)
TBCCR2 += Bitime_5; //定时位置改到位的中间位置(加半个位的时间)
}
else
{
RX_DATA = RX_DATA >> 1; //先收到的是低位
if (TBCCTL2 & CCI) // Get bit waiting in receive latch,TIMREB 无SSCI锁存位
RX_DATA |= 0x80; //CCI中锁存的是比较相等时的输入引脚上的信号
BitCnt --; // All bits RXed? //位计数减1
if ( BitCnt == 0) //接收完一个字节?
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
BitCnt = 0x08;
TBCCTL2 &= ~ CCIE; // All bits RXed, disable interrupt(接收完一个字节后禁止中断)
//_BIC_SR_IRQ(LPM2_bits); // Clear LPM3 bits from 0(SR)(准备退出低功耗模式)
}
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
TBCCTL2 &= ~ CCIFG;
}
// TX(发送字节,在进入发送中断前已经置位OUTMOD0)
else if(TBCCTL1 & CCIFG)
{
TBCCR1 += Bitime; // Add Offset to CCR1(下一定时时间为1位时间)
if ( BitCnt == 0) //所有位发送完成
TBCCTL1 &= ~ CCIE; // All bits TXed, disable interrupt(禁止中断)
else
{
if (TX_DATA & 0x01)
TBCCTL1 &= ~ OUTMOD2; // TX Mark(输出模式OUTMOD0:置位)
else
TBCCTL1 |= OUTMOD2; // TX Space(输出模式OUTMOD2+OUTMOD0:复位)
TX_DATA = TX_DATA >> 1; //低位先发
BitCnt --; //位计数
}
TBCCTL1 &= ~ CCIFG;
}
}
一周热门 更多>