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.

[参考译文] MSPM0G3507:DL_UART_transmitDataBlocking 不能正常工作

Guru**** 2455560 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1492734/mspm0g3507-dl_uart_transmitdatablocking-not-working-properly

器件型号:MSPM0G3507

工具与软件:

您好!


我使用 Uart2进行通信。
 发送 dl_uart_transmitdatablocking 函数形式的数据时我遇到问题。
有时、来自缓冲区的数据无法在 UART 上完全发送。
来自缓冲区的数据也可以在 UART2_TXDATA 寄存器中看到、并且还可以启用 FIFO。 (UART 波特率9600)
以下是供您参考的代码。  我还附上了缓冲区中要发送的 TX 数据和外部终端(docklight)中接收的数据的屏幕截图。

 

空 UartSendSlave (UARTFIFODATA * UART){
UINT16 TxPtr = 0;
datacntptr=0;

执行{
/*if (MAPE_UARTSpaceAvail(UART->BASE){
MAP_UARTCharPutNonBlocking (UART->BASE、UART->BUFF[TxPtr]);
TxPtr++;
其他{
//将任务休眠一段时间
OS_DELAY (1);
*/
/* DL_UART_transmitData (UART->base、UART->buff[TxPtr]);
TxPtr++;*/
// TxPtr=UART->buff[datacntptr];
DL_UART_transmitDataBlocking (UART->base、UART->buff[datacntptr]);
datacntptr++;


} while (datacntptr <uart->txcnt);
}

/
*函数: UartSlaveExecute
*
*参数:UARTFIFODATA * UARTFIFODATA
*
*描述:当从器件处于活动状态时,通过进程循环调用
*
(二 /
空 UartSlaveExecute (UARTFIFODATA * UART)

if (UART->mode!= U_SLAVE)
返回;

交换机(UART->STATUS)

用例 U_TX:
用例 U_WAIT:
UART->STATUS = U_WAIT;
uart->rxcnt = 0;

//永远等待新的消息
if (OS_semaphore_take ( UART->SemUartRXstart , OS_MAX_DELAY )!= pdTRUE)

//OS_DELAY (1);
返回;
}

用例 U_RX:
//循环直到数据包完成(一段时间内没有字符)
//数据包完成、分析
UART->STATUS = U_TX;

uart->protocol_func (UART);

//如果有响应,发送它
if (uart->txcnt)

// OS_DELAY (1);
//设置485方向(仅在定义时、用于半双工/双工)
如果(UART->TX_en_port!= 0)

if (UART->base ==(unsigned long) MB_SLV_B_INST)

TxEnable (UART);
}
设计

TxEnable2 (UART);
}
}

//要发送的 FIFO 模式
DL_UART_enableFIFOs (UART->BASE);

//发送数据包并等待传输完成(TX 中断给出的 SEM)

UartSendSlave (UART);

if (OS_semaphore_take (UART->SemUartTXend、30)=pdFALSE)

}
while (DL_UART_isBusy (UART->base));

// while (DL_UART_isBusy (UART->base));
//现在可以安全地将收发器置于 RX 模式。 注意:现在在 TX 中断中完成
}
UART->STATUS = U_WAIT;
uart->txcnt = 0;

休息;
问题 U_ERR:
uart->rxcnt = 0;
uart->txcnt = 0;
UART->STATUS = U_WAIT;
OS_DELAY (1);
休息;
}
}

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

    请尝试执行以下示例代码、以将同一帧发送到 PC:

        C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0G3507\driverlib\uart_rw_multibyte_fifo_poll

    请尝试捕获硬件 UART Tx 线路波形、以确认从 MSPM0 UART Tx 丢失数据。

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

    1 ) >//现在可以安全地将收发器置于 RX 模式。 注意:现在在 TX 中断中完成

    您能演示如何实现这一点吗?

    2)>f (OS_semaphore_take (UART->SemUartTXend、30)=pdFALSE)

    我猜"30"是30毫秒、9600bps 时为30字节。 很多数据包看起来都比这个时间长。 你应该考虑(虚假的)超时会做什么--或者可能只是增加超时。

    3)>  DL_UART_enableFIFOs (UART->BASE);

    是否在每次传输时启用/禁用 FIFO? 我不知道为什么这不会起作用,但它似乎是不寻常的。 我希望您在禁用 FIFO 内容时会丢失这些内容。

    4)> 案例 U_WAIT:

    该情况似乎属于 U_RX 的情况。 这是故意的吗? [我不太了解您的状态机、但它看起来很奇怪。]

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

    您好!

    我们尝试了建议的示例代码。 且未发现 MSPM0 UART Tx 丢失数据。

    但是、当我们根据代码中的示例代码尝试相同函数时、可以看到接收端口中的数据输出。

    因此、请提供其他可以解决我们问题的建议。

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

    在 数据包跟踪中、数据包跟踪中显示在1 (?) 在"[RX]"数据丢失的情况下、它是在数据包的末尾发生的、因此我怀疑您过早地停止了传输。 我以上的问题。

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

    是的、可以检查 UART 状态寄存器、以确保 UART Tx 缓冲区中的所有数据均已发送出去。

    TRM: 18.3.10 RIS (偏移= 1030h)[复位= 00000000h]:EOT 位、为 CPU 中断。

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

    我怀疑一个 isBusy()测试就足够了、但我们看到的 isBusy 调用发生在 RS -485在 ISR 中切换回 RX (未显示)之后(根据注释)。

    在我看来、(a)禁用 FIFO 或(b)过早地切换收发器可能会(过早)中断 TX、但我们看不到。  

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

    我同意 、时间需要考虑在内。