使用STM32G030接收和发送RS485的数据,发送数据正常,接收数据时串口能进中断,但数据不正确(RXD和TXD外部都有上拉电阻10K)。使用USB转串口设备RXD脚接到MCU的RXD口(TTL电平),USB转串口设备能接收正确数据,看有没哪位高手帮忙分析下,代码如下:
void USART1_IRQHandler(void)
{
u8 UartData;
if( LL_USART_IsActiveFlag_RXNE(USART1) == RESET ) //未检测到串口中断
return;
UartData=LL_USART_ReceiveData8(USART1); //读取数据
LL_USART_RequestRxDataFlush(USART1);
USART1_SendByte(UartData);
if( (UartData==0x88)||(UartData==0x99)||(UartData==0xAA)||(UartData==0xBB)||(UartData==0xCC))
LL_GPIO_TogglePin(MCU_RUN_LED_GPIO_Port,MCU_RUN_LED_Pin);
}
void MX_USART1_UART_Init(void)
{
LL_USART_InitTypeDef USART_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
GPIO_InitStruct.Pin = RS485_CTRL_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
LL_GPIO_Init(RS485_CTRL_GPIO_Port, &GPIO_InitStruct);
LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin);
/***** USART1 GPIO Configuration *******************
PA9 ------> USART1_TX
PA10 ------> USART1_RX
******************************************************/
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
GPIO_InitStruct.Pin = Usart1_TXD_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
LL_GPIO_Init(Usart1_TXD_GPIO_Port, &GPIO_InitStruct);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
GPIO_InitStruct.Pin = Usart1_RXD_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
LL_GPIO_Init(Usart1_RXD_GPIO_Port, &GPIO_InitStruct);
/* USART1 interrupt Init */
NVIC_SetPriority(USART1_IRQn, 1);
NVIC_EnableIRQ(USART1_IRQn);
USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
USART_InitStruct.BaudRate = BAUDRATE;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
LL_USART_Init(USART1, &USART_InitStruct);
LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
LL_USART_DisableFIFO(USART1);
//LL_USART_EnableFIFO(USART1);
LL_USART_ConfigAsyncMode(USART1);
LL_USART_Enable(USART1);
LL_USART_EnableIT_RXNE(USART1);
LL_USART_EnableIT_PE(USART1);
/* Polling USART1 initialisation */
while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))))
{
}
}
void USART1_SendByte(u8 newData)
{
LL_GPIO_SetOutputPin (RS485_CTRL_GPIO_Port,RS485_CTRL_Pin);
while( LL_USART_IsActiveFlag_TC(USART1)==0 ); //等待串口旧数据发送完成
LL_USART_TransmitData8(USART1,newData); //数据从串口发送出去
while( LL_USART_IsActiveFlag_TC(USART1)==0 ); //等待串口旧数据发送完成
LL_GPIO_ResetOutputPin(RS485_CTRL_GPIO_Port,RS485_CTRL_Pin);
}
|