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) 使能睡眠

MTK:UART串口收发数据相关推荐

  1. c8051f020C语言程序,C8051F020编程UART串口收发数据

    C8051F020编程UART串口收发数据 我编了一个 老是编译不过去 求高手改正 我用的是UART0端口 方式2 程序如下 //>>UART0串口编程--向PC发送和接受字符串<& ...

  2. MTK之UART串口收发数据

    寄存器 UARTn_RBR: Rx Buffer Register,通过读取该寄存器接收数据.要求LCR[7]=0.  UARTn_THR: Tx Holding Register,数据先写入该寄存器 ...

  3. 利用UART串口实现数据的收发

    cortex-A7核通过UART串口实现数据的收发 1.简单理解总线 总线即为各个部位之间通信的一种媒介,芯片内部的总线控制的是内部各个控制器和核之间的通信,例如SOC通过AHB4总线可以和RCC控制 ...

  4. 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭

    实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...

  5. Uart串口收发回环验证

    Uart串口收发回环验证 接受模块 发送模块 波特率设置模块 顶层模块 TB Modelsim仿真结果 板级验证 总结 本次所做的项目比较复杂(对我本人来讲),设计一个Uart IP核,在其基础,封装 ...

  6. c语言接收串口数据信息,C51通用串口收发数据C语言程序

    #include //C51通用串口收发数据C语言程序模块 #define  uchar unsigned char #define uint unsigned int uchar shu; bit ...

  7. STM32 HAL库串口收发数据

    STM32 HAL库串口收发数据 许多传感器的使用方法是:单片机给传感器发送一帧数据,然后传感器返回单片机一帧有用数据,所以串口的收发功能十分重要. STM32cubeMX的配置 时钟和下载方式就不讲 ...

  8. STM32开发板学习笔记【5】UART 串口 1 数据收发实验

    实验目的: 串口的使用对于我们开发调试过程中的作用是非常之大,可以用来查看,打印以及输入相关信息.所 以对串口的调试使用要熟练掌握. 实验内容: 编写串口 1 数据收发程序.调试编译好程序后,将程序下 ...

  9. 【CubeIDE】STM32 HAL库史上最详细教程(一):UART串口收发

    博主能力有限,有错误望大佬指出 0x00 文章内容: UART阻塞方式收发 UART中断方式收发 UART中断回调函数 UART DMA方式收发 printf()函数串口重定向 0x01 UART阻塞 ...

最新文章

  1. 互联网思维-标签思维(1)
  2. oracle 日期改字符格式_oracle怎么把数值型日期转换成日期字符型
  3. 基于EM参数估计的SAGE算法的MATLAB仿真
  4. vue2.0 MintUI安装和基本使用
  5. 计算机主机内部防尘装置,一种计算机主机用防尘装置的制作方法
  6. Eclipse安装插件的几种方式
  7. 拯救IT人的报表神器来了,不用写代码,还免费
  8. oracle分区存储过程示例,Oracle 存储过程示例
  9. 没有上司的舞会(洛谷-P1352)
  10. macosx 不允许无名信号量_信号量限流,高并发场景不得不说的秘密
  11. 自己动手实现STL 02:构造析构的基本工具construct()和destroy()(stl_construct.h)
  12. 解决Windos7中优盘安装centos7后无法引导原系统问题
  13. 详细理解中缀表达式并实现
  14. Python3 字节码详解
  15. pytdx 获取板块指数_通达信板块代码,怎么查看各行业板块指数?
  16. 设备商网管软件定制开发案例分析
  17. 2021年山东省安全员A证考试题及山东省安全员A证考试试卷
  18. multi_match 查询【muti_match和match区别】
  19. 计算机屏幕有条线,电脑屏幕出现一条白线怎么办?电脑显示器中间出现一条线解决方法...
  20. 在Python中实现对称矩阵

热门文章

  1. HTML/CSS 练习
  2. nginx通过反向代理实现未备案域名访问详解
  3. 百度前端学院-基础学院-第二课
  4. android的ant脚本build.xml自动生成模板
  5. 记2个月来,我在Csdn 掀起的微软面试风暴
  6. CentOS下SNMP的安装与使用
  7. 数据库系统原理设计题和综合体
  8. Linux流行病毒家族清除方法集锦
  9. Ubuntu中rsync配合inotify做服务器间文件同步
  10. Excel打印时,如何带上当前时间~