寄存器
UARTn_RBR: Rx Buffer Register,通过读取该寄存器接收数据。要求LCR[7]=0。
UARTn_THR: Tx Holding Register,数据先写入该寄存器,再送至PC端。要求LCR[7]=0。
UARTn_IER: Interrupt Enable Register,IER[3:0] are modified when LCR[7]=0. IER[7:4] are modified when LCR[7]=0 & EFR[4]=1.
EDSSI: 如果MSR[4:1] 有数据,产生中断。IER[3]=1
ERBFI: 如果Rx Buffer有数据,产生中断。IER[0]=1
UARTn_IIR: Interrupt Identification Register
Rx Data Received: Rx Data received or RX Trigger Level reached. IIR[5:0] = 000100
Rx Data Timeout: Timeout on character in RX FIFO. IIR[5:0] = 001100
串口流程
UART1_HISR //根据IIR类型判断tx or rx
// UART_IIR_CTI
UART1_HISR
=> UART_RecHandler(&UARTPort[uart_port1]);
=> UARTPort[UARTData->port_no].rx_cb(UARTData->port_no);
=> UART_dafault_rx_cb
=> UART_sendilm(port, MSG_ID_UART_READY_TO_READ_IND);
// from MOD_DRV_HISR to UARTPort[port].ownerid
默认发消息到MOD_TST_READER,处理后再调用
=> DclSerialPort_Control(handle, SIO_CMD_GET_BYTES, (DCL_CTRL_DATA_T*)&data_getbyte);
最终调用DCL_STATUS UART_Handler(DCL_DEV dev, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data) // return buffer
// UART_IIR_THRE
UART1_HISR
=> UART_TrxHandler(&UARTPort[uart_port1]);
=> UARTPort[UARTData->port_no].tx_cb(UARTData->port_no);
=> UART_datafault_tx_cb
=> UART_sendilm(port, MSG_ID_UART_READY_TO_WRITE_IND);
// from MOD_DRV_HISR to UARTPort[port].ownerid // MOD_ATCI==41
默认发消息到MOD_TST_READER,处理后再调用
=> DclSerialPort_Control(handle, SIO_CMD_PUT_BYTES, (DCL_CTRL_DATA_T*)&data_getbyte);
最终调用DCL_STATUS UART_Handler(DCL_DEV dev, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data) // send buffer
软件处理:直接发送MSG_ID_UART_READY_TO_READ_IND到MOD_ATCI,会调用UART_Handler中SIO_CMD_GET_BYTES获取AT命令,在此处给指针赋值并且中断从串口读取数据的流程,完成后MOD_ATCI会继续调用UART_Handler中SIO_CMD_PUT_BYTES输入AT命令返回的结果,在此处可以拷贝一份传给软件处理,此处同时会传递给串口往外输出。
软件流程
因为MSG_ID_UART_READY_TO_READ_IND属于驱动层的消息,通过串口发送AT指令的过程为MOD_DRV_HISR->MOD_TST_READER。如果在MMI层中设置响应函数来响应UART的READY TO RE

本文详细介绍了MTK平台下UART串口的通信过程,包括寄存器配置、串口流程、软件处理流程。涉及UARTn_RBR、UARTn_THR、UARTn_IER寄存器的使用,以及打开、读取、写入、关闭串口的步骤。在软件流程中,解释了如何处理数据接收和发送的中断,并强调了在读取串口信息时需要判断来源以确保正确响应。
最低0.47元/天 解锁文章
3386

被折叠的 条评论
为什么被折叠?



