前言
由于这段时间搞了个安卓相关的项目,需要和安卓进行Uart通信。但是选用的芯片并没有自带uart功能,所以在充分评估项目后,考虑波特率不高的情况下,决定使用GPIO去模拟串口通信协议了。
提示:以下是本篇文章正文内容,下面案例可供参考
一、协议介绍
UART是一种通用串行数据总线,用于异步通信。UART能实现双向通信,在嵌入式设计中,常用于主机与辅助设备通信。UART包括RS232、RS449、RS423等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232等式对应各种异步串行通信口的接口标准和总线标准,它们规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容,实际上是属于通信网络中的物理层(最底层)的概念,与通信协议并没有关系。
二、通信协议
一帧数据的构成:起始位+ 数据位 + 校验位 + 停止位
起始位:1位,逻辑’0’
数据位:5~8位,可以在MCU中设置
校验位:0~1位, 无校验/奇校验/偶校验
奇校验:在数据位中有奇数个逻辑‘1’时,该位为0;否则为1
偶校验:在数据位中有偶数个逻辑‘1’时,该位为0;否则为1
停止位:0.5~2位,(传输每个都会占用固定时长),逻辑‘1’
数据传输顺序:先传送数据的低位
通信速度(波特率baud):在单片机应用,常用通信速度有2400、4800、9600、19200、115200 bit/s
1、Uart串口通信发射代码如下:
L_IntSrvUART_Tx:
BTRSS R_UartTx_CTL,B_UartTx_EnB
LGOTO L_SrvUartTX_HIGH
BTRSS R_UartTx_CTL,B_UartTx_TopF
LGOTO L_SrvUartTX_NByte
MOVIA ~(D_UartTx_TopF+D_UartTx_BCrX)
ANDAR R_UartTx_CTL,R
LGOTO L_SrvUartTX_LOW
L_SrvUartTX_NByte:
BTRSS R_UartTx_CTL,B_UartTx_BCrF
LGOTO L_SrvUartTX_NBit
BSR R_UartTX_Tmr,Bit3
BSR R_UartTx_CTL,B_UartTx_TopF
BCR R_UartTx_CTL,B_UartTx_BCrF
DECRSZ R_UartTx_DNo,R
LGOTO L_SrvUartTX_HIGH
BCR R_UartTx_CTL,B_UartTx_TopF
BCR R_UartTx_CTL,B_UartTx_EnB
LGOTO L_SrvUartTX_HIGH
L_SrvUartTX_NBit:
INCR R_UartTx_CTL,R
BCR P_Status,B_PSW_C
RRR R_UartTx_Data4,R
RRR R_UartTx_Data3,R
RRR R_UartTx_Data2,R
RRR R_UartTx_Data1,R
RRR R_UartTx_Data0,R
BTRSC P_Status,B_PSW_C
LGOTO L_SrvUartTX_HIGH
L_SrvUartTX_LOW:
BCR P_PortB,IO_Uart_TX
RET
L_SrvUartTX_HIGH:
BSR P_PortB,IO_Uart_TX
RET
2、Uart串口通信接收代码如下:
L_IntSrvUART_Rx:
BTRSC R_UartRx_CTL,B_UartRx_EnB
LGOTO L_IntSrvUART_RxT
BTRSS P_PortB,IO_Uart_RX
LGOTO L_IntSrvUART_RxS
MOVIA 1
BTRSS R_SystemFlag,B_Power_SW
MOVIA 7
MOVAR R_UartRx_Tmr
BCR R_UartRx_CTL,B_UartRx_TopF
LGOTO L_IntSrvUART_Tx
L_IntSrvUART_RxS:
BSR R_UartRx_CTL,B_UartRx_EnB
BTRSC R_UartRx_CTL,B_UartRx_TopF
LGOTO L_IntSrvUART_Tx
BSR R_UartRx_CTL,B_UartRx_TopF
MOVIA 5
MOVAR R_UartRx_DNo
CLRR R_UartRx_Data0
CLRR R_UartRx_Data1
CLRR R_UartRx_Data2
CLRR R_UartRx_Data3
CLRR R_UartRx_Data4
CLRR R_UartRx_Data
LGOTO L_IntSrvUART_Tx
L_IntSrvUART_RxT:
DECRSZ R_UartRx_Tmr,R
LGOTO L_IntSrvUART_Tx
BSR R_UartRx_Tmr,Bit0
BTRSC R_UartRx_CTL,B_UartRx_EnD
LGOTO L_IntSrvUART_RxC
BCR P_Status,B_PSW_C
RRR R_UartRx_Data,R
BTRSC P_PortB,IO_Uart_RX
BSR R_UartRx_Data,Bit7
INCR R_UartRx_CTL,R
LGOTO L_IntSrvUART_Tx
L_IntSrvUART_RxC:
BTRSS P_PortB,IO_UART_RX
LGOTO L_IntSrvUART_Tx
MOVR R_UartRx_Data1,A
MOVAR R_UartRx_Data0
MOVR R_UartRx_Data2,A
MOVAR R_UartRx_Data1
MOVR R_UartRx_Data3,A
MOVAR R_UartRx_Data2
MOVR R_UartRx_Data4,A
MOVAR R_UartRx_Data3
MOVR R_UartRx_Data,A
MOVAR R_UartRx_Data4
DECRSZ R_UartRx_DNo,R
LGOTO L_IntSrvUART_RxD
BCR R_UartRx_CTL,B_UartRx_EnB
BSR R_UartRx_CTL,B_UartRx_NSD
L_IntSrvUART_RxD:
MOVIA 0xF0
ANDAR R_UartRx_CTL,R
MOVIA 2
MOVAR R_UartRx_Tmr
RET
总结
1、选择不同的波特率时,需要对每收发1Bit的中断寄存器的进行时间更改,以便符合需求。
2、当接收到的数据不对或者错位时,先确定芯片是否通过串口从休眠中唤醒的,如果是,需要将第一次进入接收端的等待时间改为N-1(N:初始中断次数)。如果不是,则需要更改发完1字节后的等待时间N+1(N:零等待基数1)。