4338|7

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大家帮看看413控制串口的程序 [复制链接]

这是在TI网站找到的例程:
//
// MSP430F413
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P1.0/CCI0A/TX|--------->
// | | 9600 8N1
// | P1.1/CCI0B/RX|<---------
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//*****************************************************************************
#include <msp430x41x.h>

#define RXD 0x02 // RXD on P1.1
#define TXD 0x01 // TXD on P1.0

// Conditions for 9600 Baud SW UART, SMCLK = 1048576

#define Bitime_5 0x47 // ~ 0.5 bit length + small adjustment
#define Bitime 0x6C // ~ 9620 baud

unsigned int RXTXData;
unsigned char BitCnt;

void TX_Byte (void);
void RX_Ready (void);

void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FLL_CTL0 |= XCAP14PF; // Configure load caps
CCTL0 = OUT; // TXD Idle as Mark
TACTL = TASSEL_2 + MC_2; // SMCLK, continuous mode
P1SEL = TXD + RXD; // P1.0/1 TA0 for TXD/RXD function
P1DIR = TXD; // TXD output on P1

// Mainloop
for (;;)
{
RX_Ready(); // UART ready to RX one Byte
_BIS_SR(CPUOFF + GIE); // Enter LPM0 Until character RXed
TX_Byte(); // TX Back RXed Byte Received
}
}


// Function Transmits Character from RXTXData Buffer
void TX_Byte (void)
{
BitCnt = 0xA; // Load Bit counter, 8data + ST/SP
CCR0 = TAR; // Current state of TA counter
CCR0 += Bitime; // Some time till first bit
RXTXData |= 0x100; // Add mark stop bit to RXTXData
RXTXData = RXTXData << 1; // Add space start bit
CCTL0 = OUTMOD0 + CCIE; // TXD = mark = idle
while ( CCTL0 & CCIE ); // Wait for TX completion
}


// Function Readies UART to Receive Character into RXTXData Buffer
void RX_Ready (void)
{
BitCnt = 0x8; // Load Bit counter
CCTL0 = SCS + CCIS0 + OUTMOD0 + CM1 + CAP + CCIE; // Sync, Neg Edge, Capture
}


// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
CCR0 += Bitime; // Add Offset to CCR0

// RX
if (CCTL0 & CCIS0) // RX on CCI0B?
{
if( CCTL0 & CAP ) // Capture mode = start bit edge
{
CCTL0 &= ~ CAP; // Capture to compare mode
CCR0 += Bitime_5;
}
else
{
RXTXData = RXTXData >> 1;
if (CCTL0 & SCCI) // Get bit waiting in receive latch
RXTXData |= 0x80;
BitCnt --; // All bits RXed?
if ( BitCnt == 0)
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
CCTL0 &= ~ CCIE; // All bits RXed, disa××e interrupt
_BIC_SR_IRQ(CPUOFF); // Clear LPM0 bits from 0(SR)
}
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
}
// TX
else
{
if ( BitCnt == 0)
CCTL0 &= ~ CCIE; // All bits TXed, disa××e interrupt
else
{
CCTL0 |= OUTMOD2; // TX Space
if (RXTXData & 0x01)
CCTL0 &= ~ OUTMOD2; // TX Mark
RXTXData = RXTXData >> 1;
BitCnt --;
}
}
}
但是我用的时候怎么会不好使呢?

最新回复

如果重新算时序的话,怎么算呢?  详情 回复 发表于 2005-12-15 16:46
 
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
现在程序好用了,但是我把_BIS_SR(CPUOFF + GIE); 改为_BIS_SR( GIE);时数据又接收不到了
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
把_BIS_SR(CPUOFF + GIE); 改为_BIS_SR( GIE),是何目的?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
不想进行低功耗
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
就是说整个程序不想进低功耗状态
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
从你的程序看,当不使用低功耗时,在主循环中不断调用RX_Ready()和 TX_Byte(),但TA0中断也在定期的对CCR0和CCTL0操作 ,时序乱了,当然收不到。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果重新算时序的话,怎么算呢?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表