⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avrx_eeprom.s

📁 一个基于AVR 单片机的操作系统,有组于了解操作系统在单片机上运行的内幕.
💻 S
字号:
#include        "avrx.inc"
/*
        Copyright 1999-2002, Larry Barello
        larry@barello.net
2005-09-13 Changed EEARL+1 to EEARH as GCC changed again.
2002-09-07 Added _SFR_IO_ADDR() macros for all I/O access
2002-05-30 lb changed EEARH to EEARL+1 in one routine.

*/
        _MODULE(avrx_eeprom)

        _EXTERN(AvrXWaitSemaphore)
        _EXTERN(AvrXSetSemaphore)

        _DATASECTION

        _GLOBAL(EEPromMutex, MtxSz)

        _CODESECTION

/*+
; -----------------------------------------------
; uint8_t AvrXReadEEProm(uint16_t)
;
; Access to the EEPROM by interrupt routines is
; prohibited.
;
; PASSED:       R25:R24 = Address
; RETURNS:      R24 = data
; USES:         EEPromMutex
; NOTE:         Might block waiting for access to EEPROM
-*/
        _FUNCTION(AvrXReadEEProm)

AvrXReadEEProm:
        mov     p2l, p1l
        mov     p2h, p1h
        ldi     p1h, hi8(EEPromMutex)
        ldi     p1l, lo8(EEPromMutex)
        rcall   AvrXWaitSemaphore       ; craps on Z and tmp0, tmp1
are01:
        sbic    _SFR_IO_ADDR(EECR), EEWE      ; Make sure EEPROM is ready
        rjmp    are01

        out     _SFR_IO_ADDR(EEARL), p2l
        out     _SFR_IO_ADDR(EEARH), p2h    ; For the 8515
        sbi     _SFR_IO_ADDR(EECR), EERE      ; Flag a read operation
        in      R0, _SFR_IO_ADDR(EEDR)
        push    R0
        rcall   AvrXSetSemaphore
        pop     r1l
        ret
        _ENDFUNC

/*+
; -----------------------------------------------
; unsigned AvrXReadEEPromWord(void *)
;
; Access to the EEPROM by interrupt routines is
; prohibited.
;
; PASSED:       p1 = Address
; RETURNS:      r1 = data
; USES:         EEPromMutex
; NOTE:         Might block waiting for access to EEPROM
-*/
        _FUNCTION(AvrXReadEEPromWord)

AvrXReadEEPromWord:
        mov     p2l, p1l
        mov     p2h, p1h
        ldi     p1h, hi8(EEPromMutex)
        ldi     p1l, lo8(EEPromMutex)
        rcall   AvrXWaitSemaphore       ; craps on Z and tmp0, tmp1
arew01:
        sbic    _SFR_IO_ADDR(EECR), EEWE      ; Make sure EEPROM is ready
        rjmp    arew01

        out     _SFR_IO_ADDR(EEARL), p2l
        out     _SFR_IO_ADDR(EEARL+1), p2h    ; For the 8515
        sbi     _SFR_IO_ADDR(EECR), EERE      ; Flag a read operation
        in      R0, _SFR_IO_ADDR(EEDR)
        push    R0
        subi    p2l, lo8(-1)
        sbci    p2h, hi8(-1)
        out     _SFR_IO_ADDR(EEARL), p2l
        out     _SFR_IO_ADDR(EEARL+1), p2h
        sbi     _SFR_IO_ADDR(EECR), EERE
        in      R0, _SFR_IO_ADDR(EEDR)
        push    R0
        rcall   AvrXSetSemaphore
#if NextL == 1
        pop     r1l
        pop     r1h
#elif NextL == 0
	pop	r1h
	pop	r1l
#else
#error "Byte order not defined"
#endif
        ret
        _ENDFUNC

/*+
; -----------------------------------------------
; void AvrXWriteEEProm(uint16_t, uint8_t)
;
; PASSED:       R25:R24 = Address
;               R23 = data
; RETURNS:
; USES:         EEPromMutex
; NOTE:         Might block waiting for access to EEPROM
;
-*/
        _FUNCTION(AvrXWriteEEProm)

AvrXWriteEEProm:
        mov     tmp2, p2l         ; Temp save of data
        mov     p2l, p1l
        mov     p2h, p1h
        ldi     p1h, hi8(EEPromMutex)
        ldi     p1l, lo8(EEPromMutex)
        rcall   AvrXWaitSemaphore
awe00:
        sbic    _SFR_IO_ADDR(EECR), EEWE      ; Make sure EEPROM is ready
        rjmp    awe00
        out     _SFR_IO_ADDR(EEARL), p2l
        out     _SFR_IO_ADDR(EEARL+1), p2h    ; For the 8515
        out     _SFR_IO_ADDR(EEDR), tmp2
        sbi     _SFR_IO_ADDR(EECR), EEMWE
        sbi     _SFR_IO_ADDR(EECR), EEWE

        rjmp    AvrXSetSemaphore; R25:24 preserved in WaitSem
        _ENDFUNC
        _END


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -