我在 SCI/UART 模式下使用 LIN/SCI 器件。
将3个字节的序列写入 TD 寄存器后、只有最后一个字节通过行(范围)进行传输。
SCIFLR 寄存器中的 TX RDY 标志似乎从未被清除。
当我在将下一个字节写入 TD 之前轮询 TX RDY 标志时、很明显3个字节序列的最后一个字节会覆盖 TD 寄存器中的先例、并且只有最后一个字节会被传输。
我检查了汇编代码以验证 FLR (FFF7E41C)是否已读出并进行了比较(0x100 -位8 - TX RDY)。
请参阅以下代码:从不输入 while 循环的主体(只要 TX RDY = 0就等待)-在调试器中通过计数器变量进行验证。
只有通过计数器(u16waitCnt)忙碌等待才会导致正确的行为、即线路上的所有3个字符。
BTW。 该解决方案应无中断地工作。
谢谢、
Michael
_________________________________________________________________________________________
void XX_InitPriv (void) { sciREG1->GCR0 = 1U;//使模块脱离复位状态 //停止设备进行配置 sciREG1->GCR1 &=~(1 <<7); //禁用所有中断!!!! sciREG1->CLRINT = 0xFFFFFFFF; sciREG1->CLRINTLVL = 0xFFFFFFFF; //为 LCD 设置 UART -> 1开始、1停止、无奇偶校验 sciREG1->GCR1 = 0x0200002A;//仅启用发送功能! sciREG1->baud = 600;//波特率--从80MHz VCLK 开始9600 sciREG1->length = 7;// 8位数据长度 sciREG1->f趣味= 0x00000006;//启用 Tx 和 Rx 引脚 sciREG1->PSL = 0x00000006;//启用 RX 和 TX 引脚的上拉功能 //清除标志 sciREG1->FLR = 0xFFFFFFFF; //设置位4,启动设备 sciREG1->GCR1 |= 0x00000080;//End of Module Configuration } void XX_LCD (void) { 静态 uint8 u8blink = 0; uint8 i; uint16 u16waitCnt; //设置光标位置4,设置 A。 uint8 u8data[3]={0xFE、0x83、'.'}; //切换闪烁。 每隔一秒 如果(u8blink =0) { u8blink = 1; u8data[2]='; } 其他 { u8blink = 0; } //写入3个字符缓冲区 // TX 第一个字节 sciREG1->td = u8data[0]; 对于(i=1;i<3;i++) { u16waitcnt = 0; //等待 SCI TX 准备就绪- SCIFLR/位8 TXRDY while (((sciREG1->FLR & SCI_TX_INT)==0)|| (u16waitCnt < 0x1500)//<--不带此忙等待条件(计数器)的原始代码!! { u16waitCnt++; } sciREG1->td = u8data[i]; } }