;****************************************************************************** ; シリアル通信処理(チャンネル 0) ; (C)YdlProg ;****************************************************************************** INCLUDE (../lib3052/3052.inc) ;------------------------------------------------------------------------------ ; 設定値 ;------------------------------------------------------------------------------ SMR EQU SMR0 ; B シリアルモードレジスタ(R/W) BRR EQU BRR0 ; B ビットレートレジスタ(R/W) SCR EQU SCR0 ; B シリアルコントロールレジスタ(R/W) TDR EQU TDR0 ; B トランスミットデータレジスタ(R/W) SSR EQU SSR0 ; B シリアルステータスレジスタ(R/W) RDR EQU RDR0 ; B レシーブデータレジスタ(R/W) segment TEXT ;****************************************************************************** ; SCI 0 の初期化 ; ; _SciInit0 ; 2004/12/28 : 初期バージョン完成 ; ; [書式] void SciInit0(Uint8 mode,Uint8 bps) ; ; ; [IN] Uint8 mode = シリアルモードレジスタ値 ; Uint8 bps = ボーレートのウェイト値 ; ; [OUT] なし ; ; [DED] R0L,R1 ;****************************************************************************** public _SciInit0 _SciInit0: MOV.B @(5,ER7),R1L ; R1L = mode MOV.B @(7,ER7),R1H ; R1H = bps SUB.W R0,R0 ; R0 = 0 MOV.B R0L,@SCR ; SCI の停止 MOV.B R1L,@SMR ; ビット長、パリティ、ストップビットの設定 MOV.B R1H,@BRR ; bps の設定 MOV.W R0,@SciRecvRead ; ワークのクリア MOV.W R0,@SciSendRead MOV.W #1,E0 ; 1 Bps Wait BSR WAIT_1ms MOV.B @SSR,R0L ; ダミーリード MOV.B #H'80,R0L ; エラーのクリア MOV.B R0L,@SSR MOV.B #H'70,R1L ; 受信データフル割込み、受信エラー割込み許可 MOV.B R1L,@SCR ; 送信、受信動作を許可 RTS ;****************************************************************************** ; SCI0 から 1 Byte 受信 ; ; _SciRead0 ; 2004/12/28 : 初期バージョン完成 ; ; [書式] BOOL SciRead0(char *code) ; ; ; [IN] char *code = 受信データを格納する場所のポインタ ; ; [OUT] BOOL = TRUE 受信成功 ; = FALSE 受信バッファは空 ; ; [DED] ER1,ER2,R3L ;****************************************************************************** public _SciRead0 _SciRead0: MOV.L @(4,ER7),ER2 ; ER2 = データ受信場所のポインタ SUB.W R0,R0 ; R0 = FALSE MOV.B @SciRecvRead,R1L ; 受信データはもうない? MOV.B @SciRecvWrite,R1H CMP.B R1L,R1H BEQ SCI_READ_END:8 EXTU.W R1 EXTU.L ER1 MOV.B @(SciRecvBuff,ER1),R3L MOV.B R3L,@ER2 INC.B R1L MOV.B R1L,@SciRecvRead INC.W #1,R0 ; R0 = TRUE SCI_READ_END: RTS ;****************************************************************************** ; SCI0 に 1 Byte 送信 ; ; _SciWrite0 ; 2004/12/28 : 初期バージョン完成 ; ; [書式] BOOL SciWrite0(char code) ; ; ; [IN] char code = 送信データ ; ; [OUT] BOOL = TRUE 送信成功 ; = FALSE 送信失敗 ; ; [DED] ER1,R2L ;****************************************************************************** public _SciWrite0 _SciWrite0: MOV.B @(5,ER7),R2L ; R2L = 送信データ SCI_WRITE0: SUB.W R0,R0 ; R0 = FALSE BTST.B #TEIE,@SCR ; 送信割り込み許可? BNE SCI_WRITE_SKIP:8 BTST.B #TDRE,@SSR ; 即送信はできない? BEQ SCI_WRITE_SKIP:8 MOV.B R2L,@TDR ; データ送信 BCLR.B #TDRE,@SSR BSET.B #TEIE,@SCR ; 送信割り込み許可 INC.W #1,R0 RTS SCI_WRITE_SKIP: MOV.B @SciSendWrite,R1L ; リングバッファは空いている? MOV.B @SciSendRead,R1H DEC.B R1H CMP R1L,R1H BEQ SCI_WRITE_END:8 EXTU.W R1 ; データの書き込み EXTU.L ER1 MOV.B R2L,@(SciSendBuff,ER1) INC.B R1L MOV.B R1L,@SciSendWrite ; 次の書き込み位置を保存 INC.W #1,R0 ; R0 = TRUE SCI_WRITE_END: RTS ;****************************************************************************** ; SCI0 に複数 Byte 送信 ; ; _SciWriteStr0 ; 2004/12/28 : 初期バージョン完成 ; ; [書式] int SciWrite0(Uint16 len,char *data) ; ; ; [IN] Uint16 len = データ長 ; char *data = 送信データのポインタ ; ; [OUT] int = 送信 Byte 数 ; ; [DED] E0,ER1,ER2,ER3 ;****************************************************************************** public _SciWriteStr0 _SciWriteStr0: MOV.W @(4,ER7),E2 ; E2 = データ長 MOV.L @(6,ER7),ER3 ; ER3 = 送信データのポインタ SUB.W E0,E0 WRITE_STR_LOOP: MOV.B @ER3+,R2L BSR SCI_WRITE0:8 OR.W R0,R0 BEQ WRITE_STR_END:8 INC.W #1,E0 CMP.W E0,E2 BNE WRITE_STR_LOOP:8 WRITE_STR_END: MOV.W E0,R0 RTS ;****************************************************************************** ; エラー割り込み(52) ; ; INT_SCI_ER0 ; 2004/11/09 : 初期バージョン完成 ; ; [IN] なし ; ; [OUT] なし ; ; [DED] なし ;****************************************************************************** public INT_SCI_ER0 INT_SCI_ER0: BCLR.B #ORER,@SSR ; オーバランエラーのクリア BCLR.B #FER,@SSR ; フレーミングエラーのクリア BCLR.B #PER,@SSR ; パリティエラーのクリア RTE ;****************************************************************************** ; 受信割り込み(53) ; ; INT_SCI_RX0 ; 2004/12/28 : 初期バージョン完成 ; ; [IN] なし ; ; [OUT] なし ; ; [DED] なし ;****************************************************************************** public INT_SCI_RX0 INT_SCI_RX0: PUSH.W R0 PUSH.L ER1 MOV.B @SciRecvWrite,R1L ; 受信バッファが一杯? MOV.B @SciRecvRead,R1H DEC.B R1H CMP.B R1L,R1H BEQ INT_SCI_RX_END:8 MOV.B @RDR,R0L ; 1 Byte 受信 EXTU.W R1 ; データ保存 EXTU.L ER1 MOV.B R0L,@(SciRecvBuff,ER1) INC.B R1L MOV.B R1L,@SciRecvWrite INT_SCI_RX_END: POP.L ER1 POP.W R0 BCLR.B #RDRF,@SSR ; 次の受信許可 RTE ;****************************************************************************** ; 送信割り込み(55) ; ; INT_SCI_TX0 ; 2004/12/28 : 初期バージョン完成 ; ; [IN] なし ; ; [OUT] なし ; ; [DED] なし ;****************************************************************************** public INT_SCI_TX0 INT_SCI_TX0: PUSH.W R0 PUSH.L ER1 MOV.B @SciSendRead,R1L ; 送信データはもうない? MOV.B @SciSendWrite,R1H BCLR.B #TEIE,@SCR ; 送信割り込み禁止 CMP.B R1L,R1H BEQ INT_SCI_TX_END:8 EXTU.W R1 ; データ取得 EXTU.L ER1 MOV.B @(SciSendBuff,ER1),R0L INC.B R1L MOV.B R1L,@SciSendRead MOV.B R0L,@TDR ; データセット BCLR.B #TDRE,@SSR ; 次の送信許可 BSET.B #TEIE,@SCR ; 送信割り込み許可 INT_SCI_TX_END: POP.L ER1 POP.W R0 BCLR.B #TEND,@SSR ; 送信割り込み許可 RTE ;****************************************************************************** ; RAM 上のデータ(初期化なし) ;****************************************************************************** SEGMENT BSS ;------------------------------------------------------------------------------ ; 受信用 ;------------------------------------------------------------------------------ SciRecvRead: DC.B 0 ; 受信バッファの読み出し位置 SciRecvWrite: DC.B 0 ; 受信バッファの書き込み位置 SciRecvBuff: DS.B 256 ; 受信バッファ ;------------------------------------------------------------------------------ ; 送信用 ;------------------------------------------------------------------------------ SciSendRead: DC.B 0 ; 送信バッファの読み出し位置 SciSendWrite: DC.B 0 ; 送信バッファの書き込み位置 SciSendBuff: DS.B 256 ; 送信バッファ END