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:LIN 处于 SCI 模式、如果小于8字节、则具有多缓冲器发送最后一个部分两次

Guru**** 2445440 points
Other Parts Discussed in Thread: TMS320F280025C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1498722/tms320f280025c-lin-in-sci-mode-with-multibuffer-transmit-twice-last-part-if-it-less-than-8-byte

器件型号:TMS320F280025C

工具/软件:

我在 SCI 模式下在 TMS320F280025C 下使用 LINA、并在 TX 中断中填充多缓冲器。

我使用正在传输的数据长度填充 SCIFORMAT.bit.length、并且等于8个字节(多缓冲区最大长度)。

因此、在填充缓冲区后的最后一个中断中、我输入了 SCIFORMAT.bit.length 剩余数据长度、在大多数情况下小于8个字节。

例如、我想发送长度为9个字节的字符串012345678。

我用前8个字节填充 LINTD0和 LINTD1、 用7填充 SCIFORMAT.bit.length、然后启用中断。

中断只触发一次最后一个符号8,我把它放在多缓冲区和把字符! 其余部分中。 并 用0填充 SCIFORMAT.bit.length

我在终端中看到的是:

再次发送的缓冲区的内容。

我确认 LINA 的 PIE 组并清除中断标志。

会发生什么???

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

    Uint32 linLengthTX = 0;
    Uint64 linDataTX = 0;
    Uint16 txISRCount = 0;
    
    char buffer[] = "012345678";
    Uint16 bufferPos = 0;
    Uint16 bufferLen = sizeof(buffer) - 1;
    
    void txSetBuffer(Uint16 _data)
    {
       linDataTX |= (Uint64)_data << ((7 - linLengthTX++) * 8);
    }
    
    interrupt void doTXISR(void)
    {
       while (linLengthTX < 8)
       {
          txSetBuffer(buffer[bufferPos++]);
    
          if (bufferPos >= bufferLen)
          {
             LinaRegs.SCICLEARINT.bit.CLRTXINT = 1;
             break;
          }
       }
    
       if (linLengthTX < 8)
          for (Uint32 i = 0; i < 700; i++) ;
    
       LinaRegs.SCIFORMAT.bit.LENGTH = linLengthTX - 1;
    
       LinaRegs.LINTD0.all = linDataTX >> 32;
       LinaRegs.LINTD1.all = linDataTX;
    
       linDataTX = 0;
       linLengthTX = 0;
    
       PieCtrlRegs.PIEACK.bit.ACK8 = 1;
       LinaRegs.LIN_GLB_INT_CLR.all = 2;
    }
    
    int main(void)
    {
       init_flash();
       //init_wd();
       disable_wd();
       init_cpu(CPU_MULTIPLIER);
       init_pie();
       init_gpio();
    
       EINTRTM;
    
       EALLOW;
       GPIO_INIT_OUTPUT(GPIO_16, GPIO_OFF, PU_DISABLE);
       GPIO_INIT_OUTPUT(GPIO_17, GPIO_ON, PU_DISABLE);
       EDIS;
    
       EALLOW;
    
       CpuSysRegs.PCLKCR19.bit.LIN_A = 1;
    
       GPIO_INIT_PERIPHERAL(GPIO_23_LINA_RX, PU_DISABLE, QSEL_ASYNCHRONOUS);
       GPIO_INIT_PERIPHERAL(GPIO_22_LINA_TX, PU_DISABLE, QSEL_ASYNCHRONOUS);
    
       LinaRegs.SCIGCR0.bit.RESET = 1;
       LinaRegs.SCIGCR1.bit.SWnRST = 0;
       LinaRegs.SCIPIO0.bit.RXFUNC = 1;
       LinaRegs.SCIPIO0.bit.TXFUNC = 1;
       LinaRegs.SCIGCR1.bit.LINMODE = 0;
       LinaRegs.SCIGCR1.bit.CLK_MASTER = 1;
       LinaRegs.SCIGCR1.bit.TIMINGMODE = 1;
       LinaRegs.SCIGCR1.bit.COMMMODE = 0;
       LinaRegs.SCIGCR1.bit.STOP = 0;
       LinaRegs.SCIGCR1.bit.PARITYENA = 0;
       LinaRegs.SCIGCR1.bit.MBUFMODE = 1;
       LinaRegs.SCIGCR1.bit.CONT = 1;
    
       LinaRegs.SCIGCR1.bit.RXENA = 1;
       LinaRegs.SCIGCR1.bit.TXENA = 1;
    
       LinaRegs.SCIFORMAT.bit.CHAR = 7;
       LinaRegs.SCIFORMAT.bit.LENGTH = 0;
    
       LinaRegs.BRSR.bit.M = LIN_M(115200);
       LinaRegs.BRSR.bit.U = 0;
       LinaRegs.BRSR.bit.SCI_LIN_PSH = 0;
       LinaRegs.BRSR.bit.SCI_LIN_PSL = LIN_BAUD(115200) - 1;
    
       LinaRegs.SCISETINT.bit.SETTXINT = 1;
       LinaRegs.SCISETINT.bit.SETRXINT = 1;
    
       LinaRegs.SCISETINTLVL.all = 0x00000100UL;
       LinaRegs.LIN_GLB_INT_EN.all = 0x00000002UL;
    
       LinaRegs.SCIGCR1.bit.SWnRST = 1;
    
       PieVectTable.LINA_1_INT = doTXISR;
       PieCtrlRegs.PIEIER8.bit.INTx10 = 1;
       IER |= M_INT8;
    
       EDIS;
    
       bufferPos = 0;
       linLengthTX = 0;
       linDataTX = 0;
    
       while (linLengthTX < 8)
          txSetBuffer(buffer[bufferPos++]);
    
       LinaRegs.SCIFORMAT.bit.LENGTH = linLengthTX - 1;
       LinaRegs.LINTD0.all = linDataTX >> 32;
       LinaRegs.LINTD1.all = linDataTX;
    
       linDataTX = 0;
       linLengthTX = 0;
       txISRCount = 0;
    
       LinaRegs.SCISETINT.bit.SETTXINT = 1;
    
       while (1)
       {
          DELAY_1S;
          GPIO_SET(GPIO_16);
          GPIO_CLEAR(GPIO_17);
          DELAY_1S;
          GPIO_SET(GPIO_17);
          GPIO_CLEAR(GPIO_16);
       }
    }
    

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

    我的坏!!!

    尝试修复我使用的代码,意外地删除了所有的答案。

    问题与步进代码有关、答案是:
    当我逐步浏览此代码时、我只收到01234567、没有最后一个符号8。
    如果我在中断中放入断点、我会按预期得到012345678、但由于调试器中额外暂停。

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

    您好:

    别担心。 我想澄清一下、根据您配置的长度、LIN 将查看在数据传输中发送的 TD 寄存器数量(何时) TD0 任何字节。 写入 TD0是要传输的触发器、因此您需要确保写入寄存器的顺序(最后写入 TD0)。  

    另外、我想问 您为什么要 在运行时更新长度值。 您是否尝试对前2次 传输使用长度8、 然后将 长度更改为0 以尝试停止进一步的传输? 您是否确认长度是否按预期和预期变化? 如果在更改长度之前添加暂停以解决问题、这会向我表明可能存在计时问题。

    此致、

    Allison

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

    您好!

    我仅更改最后一部分数据的长度、因为在大多数情况下长度小于8字节。

    我在将数据放入 LINTDx 寄存器之前更改长度、暂停必须在更改长度之前(如代码示例中)、而不是在之后。

    要停止传输、我禁用 TX 中断(LinaRegs.SCICLEARINT.bit.CLRTXINT = 1;)

    我的问题有一个解决方案:长度小于8只应设置为发送的第一部分,其余的将是8字节长。

    但是测量长度很困难、因为新的部分数据可能会在发送过程中添加到内部缓冲区。

    我最后尝试在 TD0中填充数据、但没有任何变化。

    此致

    MFZ

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

    该专家目前不在办公室、将在下周返回时回复您的查询。

    此致、

    Aishwarya

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

    尊敬的 MFZ:

    感谢您的耐心。 我首先想检查一下、看看您的最终版本是否有任何更新-您正在使用的状态或程序是否有任何更改?  

    此致、

    Allison