一、问题背景
在使用tc397的aurix-code-example的uart代码时候,按照demo的示例配置好串口IO,中断、buffer之后
void init_ASCLIN_UART(void)
{
/* Initialize an instance of IfxAsclin_Asc_Config with default values */
IfxAsclin_Asc_Config ascConfig;
IfxAsclin_Asc_initModuleConfig(&ascConfig, &MODULE_ASCLIN1);
/* Set the desired baud rate */
ascConfig.baudrate.baudrate = UART_BAUDRATE;
/* ISR priorities and interrupt target */
ascConfig.interrupt.txPriority = INTPRIO_ASCLIN1_TX;
ascConfig.interrupt.rxPriority = INTPRIO_ASCLIN1_RX;
ascConfig.interrupt.typeOfService = IfxCpu_Irq_getTos(IfxCpu_getCoreIndex());
/* FIFO configuration */
ascConfig.txBuffer = &g_ascTxBuffer;
ascConfig.txBufferSize = UART_TX_BUFFER_SIZE;
ascConfig.rxBuffer = &g_ascRxBuffer;
ascConfig.rxBufferSize = UART_RX_BUFFER_SIZE;
/* Pin configuration */
const IfxAsclin_Asc_Pins pins =
{
NULL_PTR, IfxPort_InputMode_pullUp, /* CTS pin not used */
&UART_PIN_RX, IfxPort_InputMode_pullUp, /* RX pin */
NULL_PTR, IfxPort_OutputMode_pushPull, /* RTS pin not used */
&UART_PIN_TX, IfxPort_OutputMode_pushPull, /* TX pin */
IfxPort_PadDriver_cmosAutomotiveSpeed1
};
ascConfig.pins = &pins;
IfxAsclin_Asc_initModule(&g_ascHandle, &ascConfig); /* Initialize module with above parameters */
}
在部分接收下,会出现串口接收异常,与发送的数据不匹配的问题。
通过debug排查问题发现,串口中断接收的时候已经出现字符串乱码。问题应该出现在串口的硬件时序接收上。
二、问题解决
在AURIX的用户手册串口章节,对串口的描述中,串口可以设置oversampling和sample point,通过设置这两个参数可以设置串口模块在时序采样的时候的属性。
在串口初始化的时候添加该两个参数可以有效的避免串口通信乱码异常。
/* This function initializes the ASCLIN UART module */
void UART0_Init(float32 baudrate)
{
/* Initialize an instance of IfxAsclin_Asc_Config with default values */
IfxAsclin_Asc_Config ascConfig;
IfxAsclin_Asc_initModuleConfig(&ascConfig, &MODULE_ASCLIN0);
/* Set the desired baud rate */
ascConfig.baudrate.baudrate = baudrate;
ascConfig.baudrate.oversampling = IfxAsclin_OversamplingFactor_16; /* Set the oversampling factor */
/* Configure the sampling mode */
ascConfig.bitTiming.medianFilter = IfxAsclin_SamplesPerBit_three; /* Set the number of samples per bit*/
ascConfig.bitTiming.samplePointPosition = IfxAsclin_SamplePointPosition_8; /* Set the first sample position */
/* ISR priorities and interrupt target */
ascConfig.interrupt.txPriority = INTPRIO_UART0_TX;
ascConfig.interrupt.rxPriority = INTPRIO_UART0_RX;
ascConfig.interrupt.typeOfService = ISR_TOS_UART0;
/* FIFO configuration */
ascConfig.txBuffer = &g_asc0TxBuffer;
ascConfig.txBufferSize = UART0_TX_BUFFER_SIZE;
ascConfig.rxBuffer = &g_asc0RxBuffer;
ascConfig.rxBufferSize = UART0_RX_BUFFER_SIZE;
/* Pin configuration */
const IfxAsclin_Asc_Pins pins =
{
NULL_PTR, IfxPort_InputMode_pullUp, /* CTS pin not used */
&UART0_PIN_RX, IfxPort_InputMode_pullUp, /* RX pin */
NULL_PTR, IfxPort_OutputMode_pushPull, /* RTS pin not used */
&UART0_PIN_TX, IfxPort_OutputMode_pushPull, /* TX pin */
IfxPort_PadDriver_cmosAutomotiveSpeed1
};
ascConfig.pins = &pins;
IfxAsclin_Asc_initModule(&g_asc0Handle, &ascConfig); /* Initialize module with above parameters */
}
other tips: 但是在使用串口的时候还是应该避免线缆过长、波特率过快的情况。