;****************************************************************************** ; EEPROM 処理(Microwire) ; (C)YdlProg ;****************************************************************************** INCLUDE (../lib3052/3052.inc) MICROWIRE_PORT EQU PB MICROWIRE_DR EQU PBDR MICROWIRE_CS EQU 0 MICROWIRE_SK EQU 1 MICROWIRE_DO EQU 2 MICROWIRE_DI EQU 3 MICROWIRE_MASK EQU ((1 << MICROWIRE_CS) | (1 << MICROWIRE_SK) | (1 << MICROWIRE_DO)) segment TEXT ;****************************************************************************** ; EEPROM の初期化(Microwire) ; ; _MicrowireInit ; 2004/12/20 : 初期バージョン完成 ; ; [書式] void MicrowireInit(Uint8 addr,Uint8 data) ; ; ; [IN] Uint8 addr = アドレスの bit 数 ; Uint8 data = データの bit 数 ; ; [OUT] なし ; ; [DED] R0 ;****************************************************************************** public _MicrowireInit _MicrowireInit: MOV.B @(5,ER7),R0H ; R0H = addr MOV.B @(7,ER7),R0L ; R0L = data MOV.W R0,@ADDR_BITS MOV.B #MICROWIRE_MASK,R0L ; ポートのディレクション設定 MOV.B R0L,@MICROWIRE_DR MOV.B @MICROWIRE_PORT,R0L ; 信号線のクリア AND.B #~MICROWIRE_MASK,R0L MOV.B R0L,@MICROWIRE_PORT RTS ;****************************************************************************** ; EEPROM の読み出し(Microwire) ; ; _MicrowireRead ; 2004/12/17 : 初期バージョン完成 ; ; [書式] BOOL MicrowireRead(int addr,void *buff,int size) ; ; ; [IN] int addr = 読み出し開始アドレス ; void *data = 読み込みバッファ ; int size = 読み出しサイズ ; ; [OUT] なし ; ; [DED] ER0,ER1,ER2 ;****************************************************************************** public _MicrowireRead _MicrowireRead: MOV.W @( 4,ER7),R1 ; R1 = addr MOV.L @( 6,ER7),ER2 ; ER2 = *buff MOV.W @(10,ER7),E1 ; E1 = size ; CS High LOOP_READ: BSET.B #MICROWIRE_CS,@MICROWIRE_PORT NOP ; 80ns MOV.W #110B,E0 ; READ 110 MOV.B #3,R0L BSR BIT_SEND MOV.W R1,E0 ; Address An-A0 INC.W #1,R1 ; Address ++ MOV.B @ADDR_BITS,R0L BSR BIT_SEND BSR BYTE_RECV ; n Byte 受信 MOV.B R0L,@ER2 INC.L #1,ER2 MOV.B @DATA_BITS,R0L ; 16Bit モードかチェック CMP.B #8,R0L BEQ READ_NEXT:8 MOV.B R0H,@ER2 INC.L #1,ER2 ; CS Low READ_NEXT: BCLR.B #MICROWIRE_CS,@MICROWIRE_PORT BSR WAIT500ns ; 500ns Wait DEC.W #1,E1 BNE LOOP_READ RTS ;****************************************************************************** ; EEPROM の書き込み(Microwire) ; ; _MicrowireWrite ; 2004/12/17 : 初期バージョン完成 ; ; [書式] BOOL MicrowireWrite(int addr,void *data,int size) ; ; ; [IN] int addr = 読み出し開始アドレス ; void *buff = 読み込みバッファ ; int size = 読み出しサイズ ; ; [OUT] なし ; ; [DED] ER0,ER1,ER2 ;****************************************************************************** public _MicrowireWrite _MicrowireWrite:MOV.W @( 4,ER7),R1 ; R1 = addr MOV.L @( 6,ER7),ER2 ; ER2 = *buff MOV.W @(10,ER7),E1 ; E1 = size ; CS High LOOP_WRITE: BSET.B #MICROWIRE_CS,@MICROWIRE_PORT NOP ; 80ns MOV.W #101B,E0 ; WRITE 101 MOV.B #3,R0L BSR BIT_SEND:8 MOV.W R1,E0 ; Address An-A0 INC.W #1,R1 ; Address ++ MOV.B @ADDR_BITS,R0L BSR BIT_SEND:8 MOV.B @ER2+,R0H ; Data の最初の 8 Bit MOV.W R0,E0 MOV.B @DATA_BITS,R0L ; 16Bit モードかチェック CMP.B #8,R0L BEQ DATA_SEND:8 MOV.B R0H,R0L ; Data の残りの 8 Bit MOV.B @ER2+,R0H MOV.W R0,E0 MOV.B #16,R0L DATA_SEND: BSR BIT_SEND_MSB:8 ; n Bit 送信 ; CS Low BCLR.B #MICROWIRE_CS,@MICROWIRE_PORT BSR WAIT500ns:8 ; 500ns Wait MOV.W #10,E0 ; 10ms Wait BSR WAIT_1ms DEC.W #1,E1 BNE LOOP_WRITE RTS ;****************************************************************************** ; EEPROM のプロテクト(Microwire) ; ; _MicrowireProtect ; 2004/12/20 : 初期バージョン完成 ; ; [書式] void MicrowireProtect(BOOL flag) ; ; ; [IN] flag = TRUE プロテクト ON ; = FALSE プロテクト OFF ; ; [OUT] なし ; ; [DED] ER0,E1 ;****************************************************************************** public _MicrowireProtect _MicrowireProtect: MOV.W @(4,ER7),E1 ; E1 = flag(0 or 1) DEC.W #1,E1 ; CS High BSET.B #MICROWIRE_CS,@MICROWIRE_PORT NOP ; 80ns MOV.W #100B,E0 ; EWEN,EWDS 100 MOV.B #3,R0L BSR BIT_SEND:8 MOV.W E1,E0 ; Address An-A0 MOV.B @ADDR_BITS,R0L BSR BIT_SEND_MSB:8 ; CS Low BCLR.B #MICROWIRE_CS,@MICROWIRE_PORT BSR WAIT500ns:8 ; 500ns Wait RTS ;****************************************************************************** ; n Bit 送信 ; ; BIT_SEND、BIT_SEND_MSB ; 2004/12/17 : 初期バージョン完成 ; ; [IN] E0 = 送信データ ; R0L = Bit 数 ; ; [OUT] なし ; ; [DED] R0 ;****************************************************************************** BIT_SEND: MOV.B #16,R0H ; 最上位 Bit の頭だし SUB.B R0L,R0H BIT_SHIFT_MSB: ROTL.W E0 DEC.B R0H BNE BIT_SHIFT_MSB:8 BIT_SEND_MSB: ROTL.W E0 ; 1 Bit 送信 BST.B #MICROWIRE_DO,@MICROWIRE_PORT BSR MAKE_CLOCK:8 ; クロックの作成 DEC.B R0L BNE BIT_SEND_MSB:8 RTS ;****************************************************************************** ; n Byte 受信 ; ; BYTE_RECV ; 2004/12/17 : 初期バージョン完成 ; ; [IN] なし ; ; [OUT] R0 = 受信データ(1 Byte 受信なら R0L) ; ; [DED] E0 ;****************************************************************************** BYTE_RECV: MOV.B @DATA_BITS,R0L ; 8 or 16 BYTE_RECV_LOOP: BSR MAKE_CLOCK:8 ; クロックの作成 BLD #MICROWIRE_DI,@MICROWIRE_PORT ROTXL.W E0 DEC.B R0L BNE BYTE_RECV_LOOP:8 MOV.W E0,R0 RTS ;****************************************************************************** ; クロックの作成 ; ; MAKE_CLOCK ; 2004/12/20 : 初期バージョン完成 ; ; [IN] なし ; ; [OUT] なし ; ; [DED] なし ;****************************************************************************** ; SK High MAKE_CLOCK: BSET.B #MICROWIRE_SK,@MICROWIRE_PORT BSR WAIT500ns:8 ; 500ns Wait ; SK Low BCLR.B #MICROWIRE_SK,@MICROWIRE_PORT BSR WAIT500ns:8 ; 500ns Wait RTS ;****************************************************************************** ; 500ns Wait(どのモードでも 14 * 40 = 560ns 以上になる) ; ; WAIT500ns ; 2004/12/17 : 初期バージョン完成 ; ; [IN] なし ; ; [OUT] なし ; ; [DED] なし ;****************************************************************************** ; 6 BSR WAIT500ns: RTS ; 8 ;****************************************************************************** ; RAM 上のデータ(初期化なし) ;****************************************************************************** SEGMENT BSS ADDR_BITS: DS.B 1 DATA_BITS: DS.B 1 END