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.

[参考译文] MSP430F5329:如果UCA1TXBUF中没有任何内容,什么会导致UCTXIFG标志不为1?

Guru**** 2502075 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/618984/msp430f5329-what-would-cause-uctxifg-flag-to-not-be-1-if-there-was-nothing-in-the-uca1txbuf

部件号:MSP430F5329

我正在写入一个带有圆形缓冲器的UART传输驱动程序。 现在我在A1上

每个字符都经过相同的kputchar((uint8_t c)例程。  

Int16_t kputchar1 (uint8_t c){

uint16_t Head,Tail;

Head = T1Head;
Tail = T1Tail;
// U1STAbits.UTXEN = 1;
// I = 0;
如果(Head = Tail){// My buffer is empty so check UART

如果(UCA1IFG & UCTXIFG)== UCTXIFG)// UCA1TXBUF为空
{
UCA1TXBUF = c;

_T1INT_ENABLE;
返回2;}

}

Head++;
IF (Head == T1BUF_Size) Head = 0;
IF (Head == Tail)
{
while (Head == T1Tail);//等待字符离开缓冲
区}

T1BUF[Head]= c;
T1Head = Head;
_T1INT_ENable;

Return 1;
} 


我的ISR如下所示:

#pragma vector=USI_A1_vector
__interrupt void USI_A1_ISR(void)
{
A1VectorCnt++;
switch(__偶 数_in_range(UCA1IV,4)){


案例0:
中断; //矢量0-无中断

情况2: //矢量2 - RXIFG
{
UINT8_t头;
头部= R1Head;
HEAD ++;
如果(头部>= R1BUF_SIZE)头部= 0;
如果(头= R1Tail) R1Overflow = 1;

R1BUF[Head]= UCA1RXBUF;// TX -> RXed字符
R1Head = Head;
}
中断;

案例4: //矢量4 - TXIFG
{
UINT8_t尾线= T1Tail;
IF (T1Head == Tail)
{
//没有更多要处理的内容
_T1INT_DISABLE;//禁用中断
}
否则
{

tail++;
如果(Tail >= T1BUF_SIZE) Tail = 0;
UCA1TXBUF = T1BUF[尾端];
T1Tail = Tail;
}
}
中断;

默认:
中断;
}

所以我写了一串数据,暂停,然后再写,暂停,再写,永远。  

我已经暂停了足够长的时间,以确保在发送下一个字符串之前写入所有数据。 字符串以比9600波特能处理的速度更快的速度发送数据,因此它进入循环缓冲区。 通过ISR,当我等待时,循环缓冲区将被清除。  

所有操作都与第一个字符串的工作方式相同。 将写入缓冲区中的所有内容。  

当我准备好写入UCA1IFG中的第二个字符串UCTXIFG未设置时,表示UCA1TXBUF不为空。  

在调试器中,我可以看到要写入的循环缓冲区中的数据。  
T1Head = 109
T1Tail = 10

UCA1IFG = 0
UCA1IE = 3
UCA1CTL0 = 0
UCA1CTL1 = 0x80

UCABR0 = 0x60

UCAR1 = 0

(这不是波特率问题,我的晶体是14.7456 MHz,第一个字符串以9600波特正确输出)  


文档显示  

36.3 15.1 传输中断操作
UCTXIFG中断标志由发射器设置,以指示UCAxTXBUF已准备好接受
另一个字符。 如果还设置了UCTXIE和GIE,则会生成中断请求。 UCTXIFG是
将字符写入UCAxTXBUF时自动重置。
UCTXIFG在PUC之后或UCSWRST = 1时设置。 UCTXIE在PUC或时间后重置
UCSWRST = 1。

所以我在调试器中查看它,发射器一直处于空闲状态,UCTXIFG不是1。 是什么原因造成的?


我唯一能想到的是,我响应了ISR,当我成功写入字符串并且当时没有更多数据要写入时,我关闭了TX中断启用。 因此ISR不会再次触发。 但旗帜仍应很高。 还是不能这样做?  

调试器是否在做一些意外的事情,而不是让其触发? 我正在使用IAR 7.10 .................3.

我感到困惑。

基普

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

    在您询问之前,还有一些其他内容。  

    #define _T0INT_ENABLE	UCA0IE |= UCTXIE
    #define _T0INT_DISABLE	UCA0IE &=~(UCTXIE)
    #define _R0INT_ENABLE	UCA0IE |= UCRXIE#define
    _R0INT_DISABLE	UCA1BIE #DIE ~ UCA1BIE_DIE= UCA1DIE=
    
    	
    	~ UC1BIE=
    	
    	~#define UC1DIE= UC1DIE
    
    
    
    
    
    
    挥发性uint8_t T1BUF[T1BUF_size];
    挥发性uint16_t R1Head,R1Tail,R1Overflow, T1Head,T1Tail,T1Overflow;
    volatile uint16_t A1VectorCnt=0; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    其他人也有同样的问题。 在文档中未看到此信息。

    stackoverflow.com/.../msp430-uart-tx-interrupt-enabling-disabling
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文件中说:
    UCTXIFG中断标志由发射器设置,以指示UCAxTXBUF已准备好接受另一个字符。
    它应该说:
    UCTXIFG中断标志由发射器设置,以指示UCAxTXBUF刚刚准备好接受另一个字符。

    不同之处在于它是在过渡而不是在级别上设置的。 这是一个微妙的差异,但很重要。


    在UCAxIFG Register表中,它还显示:
    传输中断标志。 UCTXIFG是在UCAxTXBUF为空时设置的。
    它应该说:
    传输中断标志。 UCTXIFG是在UCAxTXBUF首次变为空时设置的。


    也在UCAxIV中的36.3 .15.3 中断矢量发生器
    任何对UCAxIV寄存器的访问(读或写)都会自动重置最高待处理中断标志。
    应添加:
    这将清除UCTXIFG,即使UCAxTXBUF已准备好接受另一个字符。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kipton:

    非常感谢您发布解决方案。很抱歉,用户指南中没有明确说明此详细信息,我将提醒文档团队您的反馈。

    此致,
    Ryan