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.

[参考译文] TMS320F280025C:SCI 中断...发送中断

Guru**** 2457950 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1133821/tms320f280025c-sci-interrupts-transmit-interrupts

器件型号:TMS320F280025C

280025上的 SCI 似乎与上述 SCI、2407、28069、28388略有不同。

我有一段代码、在过去30年中、我已经为我的发送中断例程运行过。 已经在 Z80、8031、6502和上面提到的其他 TI DSP 上使用过它。  

非常基本的东西 设置一个非 FIFO 串行端口。 在缓冲器中传输消息。 在中断之外发送一个字符以"灌注泵"。 一旦 TXBUF 为空、就会发生中断、加载下一个字符、确认中断并离开。  

这将一直运行、直到达到 EOF 字符(在我的例子中为0xff)。  

280025不是这样。 我加载第一个字符、中断发生两次、然后再也不会中断。  

_interrupt void SCITXINTA_ISR (void)


asm (" CLRC INTM");/*启用全局中断*

if (通信标志.xming=1)

if ((TXBUF[IntTXPTR]!= 0xFF)&&(IntTXPTR <=XMITBufLen))//需要 xmit/

//SCI_writeCharBlockingNonFIFO (SCIA_BASE、TXBUF[IntTXPTR]);
 SCI_writeCharNonBlocking (SCIA_BASE、TXBUF[IntTXPTR]);

IntTXPTR++;


否则//xmit 已完成

对于(xser=0;xser < XMITBufLen;xser++)//填充具有0ff 的缓冲区以"清除"

TXBUF[xser]= 0xFF;
XMITString[xser]= 0;

通信 Flags.xming=0;

GPIO_writePin (DEVICE_GPIO_PIN_485_ENA、0);//关闭485发送器
SCI_writeCharNonBlocking (SCIA_BASE、255U);//发送换字符行。

}//结束其他
}//end if xming
else//this is here because the xmit register is ready for another character.(其他//因为 xmit 寄存器已准备好接收另一个
//但最后一个字符是

GPIO_writePin (DEVICE_GPIO_PIN_485_ENA、0);

// GpioDataRegs.GPBDAT.bit.GPIO50 = 0;//关闭发送器&=~0x0004;//was 0x0004


INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
返回;
}//end if ti

表扬? 绝妙的创意?

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

    好的、这里是280025 SCI 与其余 SCI 略有不同。 我可能没有提到这是一个485串行通信、因此 RX 会获得 TX 发出的信号。 SCI 之前的实现处理中断的确认有一点不同、因此 RX 的 ACK 不会为 TX 造成混乱。 不是这样。  

    解决方案...在发送时禁用 RX 中断。 完成后重新启用。 现在一切都好了。