我目前正在使用 CC1352上的 UART2驱动 程序,似乎该驱动程序无法以1毫秒的轮询间隔正确返回接收到的数据。 以下是我在 ti_drivers_config.c 中的配置:
static const UART2CC26X2_HWAttrs uart2CC26X2HWAttrs[CONFIG_UART2_COUNT] = {
{
.baseAddr = UART0_BASE,
.intNum = INT_UART0_COMB,
.intPriority = 0xc0,
.rxPin = IOID_12,
.txPin = IOID_13,
.ctsPin = PIN_UNASSIGNED,
.rtsPin = PIN_UNASSIGNED,
.flowControl = UART2_FLOWCTRL_NONE,
.rxBufPtr = uart2RxRingBuffer1,
.rxBufSize = sizeof(uart2RxRingBuffer1),
.txBufPtr = uart2TxRingBuffer1,
.txBufSize = sizeof(uart2TxRingBuffer1),
.rxChannelMask = 1 << UDMA_CHAN_UART0_RX,
.txChannelMask = 1 << UDMA_CHAN_UART0_TX,
.txIntFifoThr = UART2CC26X2_FIFO_THRESHOLD_1_8,
.rxIntFifoThr = UART2CC26X2_FIFO_THRESHOLD_1_8
},
};
和传递给 UART2_Open()的参数:
UART2_Params rs485UARTParams = {
/*!< Mode for all read calls */
UART2_Mode_NONBLOCKING,
/*!< Mode for all write calls */
UART2_Mode_NONBLOCKING,
/*!< Pointer to read callback function for callback mode. */
NULL,
/*!< Pointer to write callback function for callback mode. */
NULL,
/*!< Pointer to event callback function. */
_RS485_eventCb,
/*!< mask of events that the application is interested in */
UART2_EVENT_OVERRUN | UART2_EVENT_BREAK | UART2_EVENT_PARITY
| UART2_EVENT_FRAMING | UART2_EVENT_TX_BEGIN
| UART2_EVENT_TX_FINISHED,
/*!< Receive return mode */
UART2_ReadReturnMode_FULL,
/*!< Baud rate for UART */
baud,
/*!< Data length for UART */
UART2_DataLen_8,
/*!< Stop bits for UART */
nStopBits,
/*!< Parity bit type for UART */
parity,
/*!< User supplied argument for callback functions */
NULL
};
我有 一个计时器配置为连续回叫模式,工作频率为1000 Hz (1 ms)。 回叫功能只需每隔1毫秒返回所有接收到的 UART 数据:
static UART2_Handle m_uart;
static void _1msPeriodicTimerCb(Timer_Handle handle, int_fast16_t status)
{
size_t nBytesRead;
uint8_t byte;
do
{
// Read 1 byte at a time.
UART2_read(m_uart, &byte, 1, &nBytesRead);
if(nBytesRead > 0)
// Pass byte to application.
getByte(byte);
} while(nBytesRead > 0);
}
以19200波特,偶校验和1个停止位运行,每字节传输需要11/19200 =0.57 ms。 由于最小中断级别为32级 FIFO 的1/8,我只看到以4字节 块返回的数据。 当我向 外围设备传输8个连续的 UART 数据字节时,需要对上述回调进行4次迭代才能返回所有数据,这是有意义的,因为4个字节的物理传输需要4 * 0.58 = 2.3 ms。
- 时间 t0 + 0 ms:4字节
- 时间 t0 + 1 ms:0字节
- 时间 t0 + 2 ms:0字节
- 时间 t0 + 3 ms:4字节
但是,驱动程序似乎定期检查 FIFO,查看 UART2_READ()呼叫之外的数据。 如果我只传输1字节,回调函数最终将返回1字节。 但我没有测量延迟是什么。 在这种情况下,驱动程序如何刷新 FIFO?
使用 UART2驱动程序的另一种方法是否允许我们以1 ms 的间隔正确接收数据?
