?? 通用同步和異步串行接收器和轉發器(usart).txt
字號:
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否為“允許我方發送數據”?
brne USART_RXD_COMM6 ;否,則繼續
rcall USART_RX_COMM_OKRX ;是,調用處理此條命令處理程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM6:
ldi ZL,Low(USART_REPINI*2) ;置“要求我方重新初始化”命令地址指針
ldi ZH,High(USART_REPINI*2)
ldi CTRLCOM_CNT,USARTAI_CMANI ;置計數器初值=有效命令字長度數值
rcall CTRLCOMM_IdentifyCOM ;對此條命令進行識別
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否為“要求我方重新初始化”?
brne USART_RXD_COMM7 ;否,則繼續
rcall USART_RX_COMM_REPINI ;是,調用處理此條命令處理程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM7:
ldi ZL,Low(USART_RINIOK*2) ;置“對方重新初始化完成”命令地址指針
ldi ZH,High(USART_RINIOK*2)
ldi CTRLCOM_CNT,USARTAI_CMANI ;置計數器初值=有效命令字長度數值
rcall CTRLCOMM_IdentifyCOM ;對此條命令進行識別
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否為“對方重新初始化完成”?
brne USART_RXD_COMM8 ;否,則繼續
rcall USART_RX_COMM_RINIOK ;是,調用處理此條命令處理程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM8:
ldi ZL,Low(USART_CTRLCOM*2) ;置“傳送控制操作指令”命令地址指針
ldi ZH,High(USART_CTRLCOM*2)
ldi CTRLCOM_CNT,USARTAI_CMANI ;置計數器初值=有效命令字長度數值
rcall CTRLCOMM_IdentifyCOM ;對此條命令進行識別
cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否為“傳送控制操作指令”?
brne USART_RXD_COMM_Error ;否,轉至接收錯誤處理
rcall USART_RX_COMM_CTRLCOM ;是,調用處理此條命令處理程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM_Error:
rcall USART_RXD_Error ;調用接收錯誤處理子程序
rjmp USART_RXD_COMM_RET
USART_RXD_COMM_NOADDR:
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
USART_RXD_COMM_RET:
ret ;子程序返回
;*** 此段程序用于接收到[傳送控制操作指令]命令處理
USART_RX_COMM_CTRLCOM:
lds ZL,DataUPD_RXALW ;接收數據是否己處理?
cpi ZL,DataUPD_RALWI ;是,繼續
breq USART_RX_COMM_CTRLCOM_RET ;否,返回,等待處理接收數據
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_RX_COMM_CTRLCOM_RET ;否,返回,等待發送作業結束
lds ZL,CTRLCOM_MALWS ;是否有正在處理控制操作指令?
cpi ZL,CTRLCOM_MALWSI ;否,繼續
breq USART_RX_COMM_CTRLCOM_RET ;是,返回,等待處理控制操作指令結束
rcall USART_TX_COMM_OKRX ;向對方發送“允許對方發送”命令
clr ZL ;清除接收命令作業標志
sts USARTAI_RXCOM,ZL
ldi ZL,CTRLCOM_MALWSI ;置允許處理控制操作指令標志值
sts CTRLCOM_MALWS,ZL
ldi ZL,CCTSSDV_USARTI ;置控制操作指令發送者標志值
sts CCOM_TSourceS,ZL ;為 USART 端口送來控制操作指令
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
USART_RX_COMM_CTRLCOM_RET:
ret ;子程序返回
;*** 此段程序用于接收到[重新初始化完成]命令處理
USART_RX_COMM_RINIOK:
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
ret ;子程序返回
;*** 此段程序用于接收到[要求對方重新初始化]命令處理
USART_RX_COMM_REPINI:
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
rcall USART_AINT_INI ;重新初始化 USART 異步中斷接收和發送
rcall USART_TX_COMM_RINIOK ;向對方發送“重新初始化完成”命令
ret ;子程序返回
;*** 此段程序用于接收到[向對方請求發送]命令處理
USART_RX_COMM_AskTX:
lds ZL,DataUPD_RXALW ;接收數據是否己處理?
cpi ZL,DataUPD_RALWI ;是,繼續
breq USART_RX_COMM_AskTX_RET ;否,返回,等待處理接收數據
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_RX_COMM_AskTX_RET ;否,返回,等待發送作業結束
rcall USART_TX_COMM_OKRX ;向對方發送“允許對方發送”命令
clr ZL ;清除接收命令作業標志
sts USARTAI_RXCOM,ZL
ldi ZL,DataUPD_RALWI ;置允許處理接收數據標志值
sts DataUPD_RXALW,ZL
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
USART_RX_COMM_AskTX_RET:
ret ;子程序返回
;*** 此段程序用于接收到[允許對方發送]命令處理
USART_RX_COMM_OKRX:
lds ZL,DataUPD_TXALW ;發送數據是否己更新?
cpi ZL,DataUPD_TALWI ;是,繼續
breq USART_RX_COMM_OKRX_RET ;否,返回,等待更新發送數據
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_RX_COMM_OKRX_RET ;否,返回,等待發送作業結束
clr ZL ;清除發送命令作業標志
sts USARTAI_TXCOM,ZL
rcall USART_AINT_TXINI ;啟動發送數據
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
USART_RX_COMM_OKRX_RET:
ret ;子程序返回
;*** 此段程序用于接收到[要求對方重新發送]命令處理
USART_RX_COMM_REPTX:
lds ZL,USARTAI_ERRNum ;USART 發生收發錯誤次數是否超過允許次數?
cpi ZL,USARTAI_ENALWI ;是,轉至 USART 通信發生錯誤處理
brlo USART_RX_COMM_REPTX1 ;否,繼續
rcall USART_Error ;調用 USART 通信發生錯誤處理程序
rjmp USART_RX_COMM_REPTX_RET ;返回
USART_RX_COMM_REPTX1:
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_RX_COMM_REPTX_RET ;否,返回,等待發送作業結束
rcall USART_AINT_TXINI ;重新啟動原發送作業
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
lds ZL,USARTAI_ERRNum ;USART 發生收發錯誤次數+1
inc ZL
sts USARTAI_ERRNum,ZL
USART_RX_COMM_REPTX_RET:
ret ;子程序返回
;*** 此段程序用于接收到[接收數據正確]命令處理
USART_RX_COMM_DataOK:
ldi ZL,USARTAI_TCOMI ;置發送命令作業標志值
sts USARTAI_TXCOM,ZL
ldi ZL,DataUPD_TALWI ;置允許更新發送數據標志值
sts DataUPD_TXALW,ZL
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
ret ;子程序返回
;*** 此段程序用于接收到[要求對方發送指定數據]命令處理
USART_RX_COMM_DCOMTX:
ldi ZL,DataUPD_TALWI ;置允許更新發送數據標志值
sts DataUPD_TXALW,ZL
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
USART_RX_COMM_DCOMTX_RET:
ret ;子程序返回
;*** 此段程序用于“USART 接收器錯誤”和“接收命令或數據錯誤”處理
USART_RXD_Error:
lds ZL,USARTAI_ERRNum ;USART 發生收發錯誤次數是否超過允許次數?
cpi ZL,USARTAI_ENALWI ;是,轉至 USART 通信發生錯誤處理
brlo USART_RXD_Error1 ;否,繼續
rcall USART_Error ;調用 USART 通信發生錯誤處理程序
rjmp USART_RXD_Error_RET ;返回
USART_RXD_Error1:
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_RXD_Error_RET ;否,返回,等待發送作業結束
rcall USART_TX_COMM_REPTX ;向對方發送“要求重新發送”命令
ldi ZH,(1<<FE)|(1<<DOR)|(1<<PE)
com ZH ;清除幀錯誤(FE)、數據溢出(DOR)
in ZL,UCSRA ;及奇偶校驗錯誤(UPE)標志
and ZL,ZH
out UCSRA,ZL
ldi ZL,USARTAI_REndI ;置接收作業全部結束標志值
sts USARTAI_RXEnd,ZL
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
lds ZL,USARTAI_ERRNum ;USART 發生收發錯誤次數+1
inc ZL
sts USARTAI_ERRNum,ZL
USART_RXD_Error_RET:
ret ;子程序返回
;*******************************************************************************
;*
;* 從 USART 端口上接收到的數據處理子程序 - “USART_RXD_Data”
;*
;* 說明:
;* 本子程序用于處理從 USART 端口上接收到的數據,本子程序中包含有數據循環
;* 冗余檢測校驗子程序。
;* 本子程序要在主程序中不間斷循環查詢運行。
;*
;* SRAM 中標志字節用法:
;* 入口標志:本子程序將檢查這三個標志,只有這三個標志置值后才允許處理數據。
;* 允許處理接收數據(DataUPD_RXALW)= $03(DataUPD_RDALWI)
;* 接收作業己更新(USARTAI_RXUPD) = $0a(USARTAI_RUPDI)
;* 接收作業全部結束(USARTAI_RXEnd)= $0f(USARTAI_REndI)
;* 出口標志:接收數據處理操作得到執行后,將對下面這兩個標志置值。
;* 允許處理接收數據(DataUPD_RXALW)= $00
;* 接收作業己更新(USARTAI_RXUPD) = $00
;*
;*******************************************************************************
USART_RXD_Data:
lds ZL,DataUPD_RXALW ;檢查是否允許處理接收數據?
cpi ZL,DataUPD_RALWI ;是,則繼續
brne USART_RXD_Data_RET ;否,直接返回
lds ZL,USARTAI_RXUPD ;檢查接收作業是否己更新?
cpi ZL,USARTAI_RUPDI ;是,則繼續
brne USART_RXD_Data_RET ;否,直接返回
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_RXD_Data_RET ;否,返回,等待發送作業結束
lds ZL,USARTAI_RXEnd ;檢查接收作業是否全部結束?
cpi ZL,USARTAI_REndI ;是,則繼續
brne USART_RXD_Data_Error ;否,轉至接收錯誤處理
USART_RXD_Data_Check:
ldi ZL,Low(USARTAI_RXDAA) ;Z 指針指向接收數據的首字節
ldi ZH,High(USARTAI_RXDAA)
lds DCRC2B_DLength,USARTAI_RXDAA;置校驗的數據長度初值
call DataCheck_CRC2B ;校驗接收的數據是否正確?
or YL,YH ;是,繼續
brne USART_RXD_Data_Error ;否,轉至接收錯誤處理
rcall USART_TX_COMM_DataOK ;向對方發送“接收數據正確”命令
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -