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.

[参考译文] TMS570LS3137:TMS570 SCI 发送问题(TX RDY 标志)

Guru**** 2481875 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/701474/tms570ls3137-tms570-sci-transmit-problem-tx-rdy-flag

器件型号:TMS570LS3137

我在 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];

}

} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    备注:器件在启用存储器保护的情况下运行。 SCI 初始化函数在特权模式下执行。 访问 TD 和 FLR 寄存器(LCD 功能)的任务具有 RESP 的 MPU R/W 权限。 I/O 存储器区域(0xFFF7E400 ...)
    但是、由于字符在线路上传输、我不认为在启用 MPU 的情况下操作 SCI 可能有任何其他问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、

    我在您的代码中看不到问题。 如果超时计数器(u16waitCnt < 0x1500)不在 while 循环中,则不会传输第3个数据。 向 SCITD 寄存器写入 u8DATA[0]会将 TXRDY 清零、并且只有在 TD 中的数据被移入移位寄存器(SCITXSHF)后、TXRDY 才会被置位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    非常感谢您的快速回复。

    无论我是否按如下所示更改代码,在带有 TX RDY 测试条件的 while 语句之后发送第一个字节的代码:

    结果始终相同-只有数组的最后一个字节在行(范围)上传输。 如果它只有3个字节或更多字节、则无寄存器。

    无论发送多少字节、计数器 u16waitCnt 都将始终为0。

    Michael

    void XX_Write_LCD (uint8* pU8data、uint8 u8len)
    {
    
    uint8 i;
    uint16 u16waitCnt;
    
    
    u16waitcnt = 0;
    
    对于(i=0;i< u8len;i++)
    {
    
    //等待 SCI TX 准备就绪- SCIFLR/位8 TXRDY
    while ((sciREG1->FLR 和 SCI_TX_INT)=0)
    {
    u16waitCnt++;
    }
    
    sciREG1->td = pU8data[i];
    
    }
    
    } 

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

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

    您好 QJ、

    感谢您的提问。 不、还没有。

     即使   我的代码与  论坛和 TI 应用手册中的其他示例进行了正确比较、也可能仍存在一些错误。

    其他器件的初始化可能会影响 SCI 的行为 -但我无法想象 SCIFLR 中的标志会发生这种情况。

    我将在此处发布任何发现。

    但是、我 打算只将 LIN/UART 端口用于开发、因此这并不是一个紧迫问题。

    此致、

    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW、我是否可以解决该问题?

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

    您好、Michael、

    我注释掉您代码的一条语句、它起作用。 在代码中、清除标志寄存器中的所有引脚、包括 TX_EMPTY、TX_RDY 和 IDLE 位。

    以下是工作代码:

    int main (空)

    /*用户代码开始(3)*/

      //sciInit();

      uint8 i、u8len=19;

      uint16 u16waitCnt;

      u16waitcnt = 0;

      uint8 u8data[19]={'T'、'E'、'X'、'A'、'S'、'、'N'、'T'、'R'、'U'、'M'、'E'、'N'、'T'、'S'、'n'、'r'};

    //  sciInit();

      scilinREG->GCR0 = 1U;//使模块脱离复位状态

      //停止设备进行配置

      scilinREG->GCR1 &=~(1 <<7);

      //禁用所有中断!!!!

      scilinREG->CLEARINT  = 0xFFFFFFFF;

      scilinREG->CLEARINTLVL = 0xFFFFFFFF;

      //为 LCD 设置 UART -> 1开始、1停止、无奇偶校验

      scilinREG->GCR1 = 0x0200002A;//仅启用发送功能!

      scilinREG->BRS = 520;//波特率-- 9600

      scilinREG->format = 7;// 8位数据长度

      scilinREG->PIO0 = 0x00000006;//启用 Tx 和 Rx 引脚

      scilinREG->PIO7 = 0x00000006;//启用 RX 和 TX 引脚的上拉功能

      //清除标志

    //  scilinREG->FLR = 0xFFFFFFFF;

      //设置位4,启动设备

      scilinREG->GCR1 |= 0x80;//模块配置结束

      // TX 第一个字节

      对于(i=0;i< u8len;i++)

      {

        //等待 SCI TX 准备就绪- SCIFLR/位8 TXRDY

        while ((scilinREG->FLR 和 SCI_TX_INT)=0)

        {

          u16waitCnt++;

        }

        scilinREG->TD =(uint32) u8data[i];

      }

      while (1);