在UART上手动实现CTS/RTS,在STM32上无硬件流控制
我正试图让Sara-R412和STM32F103VGT6TR相互通信,偶尔会遇到一些通信中断的问题,这听起来像是在R412还没有准备好的情况下STM试图通话。(有趣的是,我也使用SARA-U201,它一点问题都没有) R412连接到在UART上手动实现CTS/RTS,在STM32上无硬件流控制,stm32,uart,flow-control,Stm32,Uart,Flow Control,我正试图让Sara-R412和STM32F103VGT6TR相互通信,偶尔会遇到一些通信中断的问题,这听起来像是在R412还没有准备好的情况下STM试图通话。(有趣的是,我也使用SARA-U201,它一点问题都没有) R412连接到UART4上的STM,数据表上说它是UART,不支持CTS/RTS。根据R412的数据表,它不支持Xon/Xoff,但通过defualt明确支持CTS/RTS 因此,我的结论是,我需要手动支持CTS/RTS 从我所读到的内容来看,由于双向通信,我对如何使用RTS感到有
UART4
上的STM,数据表上说它是UART
,不支持CTS/RTS
。根据R412
的数据表,它不支持Xon/Xoff
,但通过defualt明确支持CTS/RTS
因此,我的结论是,我需要手动支持CTS/RTS
从我所读到的内容来看,由于双向通信,我对如何使用RTS
感到有点困惑。AFIK CTS相当直截了当:
- CTS:当
我可以发送数据低时
HIGH
,然后在完成后将其清除?还是应该反过来
这是我的gpio设置
// Port Pin Mode Default State Output speed Name
{GPIOE, GPIO_Pin_11, GPIO_Mode_Out_PP, GPIO_DEFAULT_LOW, GPIO_Speed_50MHz}, // CELL_RTS
{GPIOE, GPIO_Pin_12, GPIO_Mode_IN_FLOATING, GPIO_DEFAULT_NA, INPUT_SPEED}, // CELL_CTS
这是我用来控制线路的代码
/*
* Make sure the module is in a Tx configuration before trying to use the Tx parameters.
*/
if (uart4.tx_sending)
{
/*
* If the TX_LIST node has more data to transmit, write the next byte to the UART.
*/
if (uart4.tx_cnt < uart4.tx_list->len)
{
// We use mimicced hardware flow control. Don't send until we are clear to
if (pinGet(CELL_CTS) == FALSE) USART_SendData(UART4, uart4.tx_list->ptr[uart4.tx_cnt++]);
else pinSet(CELL_RTS);
}
else
{
/*
* The last byte has been sent. Disable subsequent Tx interrupts, but enable interrupt to
* indicate last byte sent and register now empty
*/
USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
USART_ITConfig(UART4, USART_IT_TC, ENABLE);
pinClear(CELL_RTS);
}
}
/*
*在尝试使用Tx参数之前,确保模块处于Tx配置中。
*/
如果(uart4.tx\U发送)
{
/*
*如果TX_列表节点有更多数据要传输,则将下一个字节写入UART。
*/
如果(uart4.tx\u cntlen)
{
//我们使用mimicced硬件流控制。在我们清楚地知道之前不要发送
if(pinGet(CELL_CTS)==FALSE)USART_SendData(UART4,UART4.tx_列表->ptr[UART4.tx_cnt++]);
else引脚集(单元RTS);
}
其他的
{
/*
*已发送最后一个字节。禁用后续Tx中断,但启用中断以
*指示发送的最后一个字节,寄存器现在为空
*/
USART_ITConfig(UART4,USART_IT_TXE,禁用);
USART_ITConfig(UART4,USART_IT_TC,启用);
pinClear(单元RTS);
}
}