📄 通用同步和异步串行接收器和转发器(usart).txt
字号:
ldi ZL,USARTAI_RCOMI ;置接收命令作业标志值
sts USARTAI_RXCOM,ZL
rcall USART_RXData_Process ;调用接收数据处理子程序
clr ZL ;清除接收作业己更新标志
sts USARTAI_RXUPD,ZL
clr ZL ;清除允许处理接收数据标志
sts DataUPD_RXALW,ZL
rjmp USART_RXD_Data_RET ;返回
USART_RXD_Data_Error:
rcall USART_RXD_Error ;调用接收错误处理子程序
USART_RXD_Data_RET:
ret ;子程序返回
;*** 此段程序用于对从 USART 端口上接收到的数据进行处理操作
USART_RXData_Process:
;此处插入接收数据处理程序
ret ;子程序返回
;*******************************************************************************
;*
;* 向 USART 端口上发送数据更新子程序 - “USART_TXD_Data”
;*
;* 说明:
;* 本子程序用于更新向 USART 端口上上发送数据,本子程序中包含有数据循环
;* 冗余检测校验子程序。
;* 本子程序要在主程序中不间断循环查询运行。
;*
;* SRAM 中标志字节用法:
;* 入口标志:本子程序将检查这个标志,只有这个标志置值后才允许更新数据。
;* 允许更新发送数据(DataUPD_TXALW)= $c0(DataUPD_TALWI)
;* 出口标志:更新发送数据操作得到执行后,将对下面这个标志置值。
;* 允许更新发送数据(DataUPD_TXALW)= $00
;*
;*******************************************************************************
USART_TXD_Data:
lds ZL,DataUPD_TXALW ;检查是否允许更新发送数据?
cpi ZL,DataUPD_TALWI ;是,则继续
brne USART_TXD_Data_RET ;否,直接返回
lds ZL,USARTAI_TXEnd ;发送作业是否全部结束?
cpi ZL,USARTAI_TEndI ;是,继续
brne USART_TXD_Data_RET ;否,返回,等待发送作业结束
rcall USART_TX_COMM_AskTX ;发送“向对方请求发送”命令
rcall USART_TXData_Process ;调用更新发送数据子程序
USART_TXD_Data_Check:
lds ZL,USARTAI_TXDAA ;取发送的数据长度值
adiw ZL,$03 ;发送的总长度=发送的数据长度值+
sts USARTAI_TXDAA,ZL ;1 个长度字符字节+ 2 个校验字节
mov USARTAI_TEMP2,ZL
ldi ZL,Low(USARTAI_TXDAA-2) ;发送数据的校验字节在发送数据序列
ldi ZH,High(USARTAI_TXDAA-2) ;尾部后两个字节
clr USARTAI_TEMP
add ZL,USARTAI_TEMP2 ;Z 指针指向发送数据的校验字节
adc ZH,USARTAI_TEMP
clr USARTAI_TEMP
st Z+,USARTAI_TEMP ;清除发送数据的尾部后两个字节
st Z+,USARTAI_TEMP ;的校验字节值
ldi ZL,Low(USARTAI_TXDAA) ;Z 指针指向发送数据首个字节
ldi ZH,High(USARTAI_TXDAA)
lds DCRC2B_DLength,USARTAI_TXDAA;置校验的数据长度初值
call DataCheck_CRC2B ;生成发送数据序列的 CRC 码
clr ZL ;清除允许更新发送数据标志
sts DataUPD_TXALW,ZL
USART_TXD_Data_RET:
ret ;子程序返回
;*** 此段程序用于向 USART 端口上发送数据的更新操作
USART_TXData_Process:
;此处插入更新发送数据程序
; 此段程序为示例数据的更新操作
mov USARTAI_TEMP,r3
ldi USARTAI_TEMP2,$fc
sts USARTAI_TXDAA,USARTAI_TEMP2
ldi YL,Low(USARTAI_TXDAA+1) ;置接收作业地址指针为
ldi YH,High(USARTAI_TXDAA+1) ;首个接收数据地址指针
USART_TXData_Process1:
st Y+,USARTAI_TEMP
inc USARTAI_TEMP
dec USARTAI_TEMP2
brne USART_TXData_Process1
inc r3
; 示例程序结束
ret ;子程序返回
;*******************************************************************************
;*
;* USART 通信发生错误处理子程序 - “USART_Error”
;*
;* 说明:
;* 本子程序用于当 USART 通信发生错误时的处理。
;*
;*******************************************************************************
USART_Error:
push ZL ;压入寄存器中的数值到堆栈
push ZH
in ZL,SREG ;压状态寄存器中的标志值到堆栈
push ZL
ldi ZH,(1<<RXCIE)|(1<<UDRIE)|(1<<RXEN)|(1<<TXEN)
com ZH ;禁止接收器和发送器,禁止 USART
in ZL,UCSRB ;接收结束中断和数据寄存器空中断
and ZL,ZH
out UCSRB,ZL
;此处插入错误处理程序
;此处插入从头开始重新进行数据处理操作程序
ldi ZH,(1<<FE)|(1<<DOR)|(1<<PE)
com ZH ;清除帧错误(FE)、数据溢出(DOR)
in ZL,UCSRA ;及奇偶校验错误(UPE)标志
and ZL,ZH
out UCSRA,ZL
ldi ZH,(1<<UDRE)
in ZL,UCSRA ;置数据寄存器空(UDRE)标志
or ZL,ZH
out UCSRA,ZL
call USART_AINT_INI ;重新初始化 USART 异步中断接收和发送
call USART_TX_COMM_REPINI ;向对方发送“要求其重新初始化”命令
USART_Error_RET:
pop ZL
out SREG,ZL ;弹出堆栈中的标志值到状态寄存器
pop ZH ;弹出堆栈中的数值到寄存器
pop ZL
ret ;子程序返回
;*******************************************************************************
;*
;* 所有通信协议命令开头标识字符串 - “COMAgreement_Head”
;*
;*******************************************************************************
COMAgreement_Head:
.DB $03,"COM" ;通信协议命令开头标识字符(COM)
; │ │
; │ 通信协议命令开头标识字符(COM)
; 本指令字符串字符长度数值(不包括自已在内共 3 个字符)
;*******************************************************************************
;*
;* 向对方请求发送命令字符串 - “USART_AskTX”
;*
;*******************************************************************************
USART_AskTX:
.DB "ATX" ;向对方请求发送命令字符串(ATX)
;*******************************************************************************
;*
;* 允许对方发送命令字符串 - “USART_OKRX”
;*
;*******************************************************************************
USART_OKRX:
.DB "YET" ;允许对方发送命令字符串(YET)
;*******************************************************************************
;*
;* 要求对方重新发送命令字符串 - “USART_REPTX”
;*
;*******************************************************************************
USART_REPTX:
.DB "RPT" ;要求对方重新发送命令字符串(RPT)
;*******************************************************************************
;*
;* 接收数据正确命令字符串 - “USART_DataOK”
;*
;*******************************************************************************
USART_DataOK:
.DB "OKD" ;接收数据正确命令字符串(OKD)
;*******************************************************************************
;*
;* 要求对方发送指定数据的命令字符串 - “USART_DCOMTX”
;*
;*******************************************************************************
USART_DCOMTX:
.DB "STD" ;要求对方发送指定数据的命令字符串(STD)
;*******************************************************************************
;*
;* 要求对方重新初始化 USART 端口状态命令字符串 - “USART_REPINI”
;*
;*******************************************************************************
USART_REPINI:
.DB "RII" ;要求对方重新初始化状态命令字符串(RII)
;*******************************************************************************
;*
;* 重新初始化 USART 端口状态完成命令字符串 - “USART_RINIOK”
;*
;*******************************************************************************
USART_RINIOK:
.DB "YRI" ;重新初始化状态完成命令字符串(YRI)
;*******************************************************************************
;*
;* 从 USART 端口传送控制操作指令命令字符串 - “USART_CTRLCOM”
;*
;*******************************************************************************
USART_CTRLCOM:
.DB "CIT" ;从端口传送控制操作指令命令字符串(CIT)
;*******************************************************************************
;*
;* USART 异步通信中断接收与发送协议命令和数据处理子程序 - “USART_INT_ACOM”
;*
;* 说明:
;* 本子程序用于 USART 异步通信中断接收与发送协议命令和数据处理。
;* 本子程序要在主程序中不间断地循环运行。
;*
;*******************************************************************************
USART_INT_ACOM:
in ZL,SREG ;压状态寄存器中的标志值到堆栈
push ZL
call USART_RXD_COMM ;接收通信协议命令处理程序
call USART_RXD_Data ;调用接收数据处理程序
call USART_TXD_Data ;调用更新发送数据程序
pop ZL ;弹出堆栈中的标志值到状态寄存器
out SREG,ZL
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -