MTK:UART串口收发数据

MTK之UART串口收发数据

 

转:https://blog.csdn.net/ivy_reny/article/details/51192110

寄存器

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 READ消息,这时AT指令无效,直接发往MMI层。由于MMI层截获了这个消息,因此先响应MMI层的响应函数,如果在读取UART的buffer后将其清空,MOD_TST_READER自然得不到AT指令,因此无法做出任何AT响应。值得注意的是,所有串口在接到字符后响应的都是该消息,因此在读取的时候需要判断是否来自所需串口的信息。

打开串口

(1) 禁止休眠 
(2) 设置MSG_ID_UART_READY_TO_READ_IND消息的响应函数 
(3) 将串口所属MOD切换至将要使用的MOD(UART_GetOwnerID, UART_SetOwner) 
(4) 设置串口参数,波特率等(UART_SetDCBConfig) 
(5) 清空对应串口的接收Buffer(UART_ClrRxBuffer)

读取串口信息

(1) UART_GetBytesAvail 
(2) UART_GetBytes 
(3) 读完之后清空接收Buffer(UART_ClrRxBuffer)

向串口写信息

(1) 清空设备输入、输出FIFO(UART_Purge) 
(2) 清空发送、接收Buffer(UART_ClrTxBuffer,UART_ClrRxBuffer) 
(3) 写入数据UART_PutBytes

关闭串口

(1) 将所使用的串口MOD设置为原来的MOD 
(2) 使能睡眠

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值