工具/软件:
您好:
我在发送结束时触发 Tx 中断时遇到问题。 我使用的是半双工收发器、因此需要在传输完成后立即切换 GPIO、使其开始接收。
以下是我为 UART 设置编写的代码:
UARTTxIntModeSet (UART4_BASE、UART_TXINT_MODE_EOT);
UARTIntClear (UART4_BASE、UART_INT_TX | UART_INT_RX | UART_INT_RT);
UARTEnable (UART4_BASE);
UARTConfigSetExpClk (UART4_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_ODD));
UARTFIFOEnable (UART4_BASE);
以下是发送数据的函数:
void ModbusVFD::RequestData (uint16_t 地址){
GPIOPinWrite (GPIO_PORTK_BASE、 GPIO_PIN_2、GPIO_PIN_2);//在发送之前打开 GPIO
uint8_t 缓冲器[8];
Buffer[0]= 0x01;//从器件地址
Buffer[1]= 0x03;//函数代码:读取保持寄存器
Buffer[2]=(地址>> 8);//寄存器地址的高字节
Buffer[3]=(地址和0xFF);//寄存器地址的低字节
Buffer[4]= 0x00;//要读取的地址数的高字节
Buffer[5]= 0x01;//要读取的地址数的低字节
uint16_t calculatedChecksum =
computeChecksum (buffer);//与请求一起发送的计算校验和
Buffer[6]=(calculatedChecksum >> 8);//计算出的校验和的高字节
Buffer[7]=(calculatedChecksum & 0xFF);//计算出的校验和的低字节
UARTSend (缓冲器、8);
task_sleep(consts_--> sleepTime);
下面是辅助函数 UARTSend()
Void
UARTSend (const uint8_t *pui8Buffer、uint32_t ui32Count)
{
//
//在有更多字符发送时循环。
//
while (ui32Count-)
{
//
//将下一个字符写入 UART。
//
UARTCharPutNonBlocking (UART4_BASE、*pui8Buffer++);
}
UARTIntEnable (UART4_BASE、UART_INT_TX);
}
中断连接到 ISR UartTxCallback、如下所示:
extern "C" void UartTxCallback (void){
GPIOPinWrite (GPIO_PORTK_BASE、GPIO_PIN_2、0);
UARTIntDisable (UART4_BASE、UART_INT_TX);
}
我看到的是、中断在发送每个字节后触发。 实际上、我希望它只在完成传输后触发一次。 我看到此代码的行为是 GPIO 通电、然后在第一个字节之后断电。 我还看到 UARTCTL 寄存器中设置了 EOT 位、因此我不确定这里会出现什么问题。
对此问题的任何帮助都将得到深切的感谢。
谢谢你。