【GPIO模拟串口通信协议】


前言

         由于这段时间搞了个安卓相关的项目,需要和安卓进行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)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值