📄 mcs51_list_10_7.asm
字号:
; ========================================================================
;
; Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
; Wydawnictwo BTC - http://www.btc.pl
;
; ========================================================================
; zestaw podstawowych procedur do programowj obslugi lacza I2C
; ========================================================================
EXTERN SDA, SCL ; linie portow pelniace funkcje szyny I2C
EXTERN I2C_fault, I2C_busy, I2C_no_ack, I2C_ostatni_bajt
; wskazniki stanu i bledow szyny
EXTERN licznik_bitow_I2C
PUBLIC zapis_bajtu_I2C, odczyt_bajtu_I2C, start_I2C, stop_I2C
ORG 1800H
;===========================================================
; procedura pomocnicza - generuje opoznienie ok. 5 us
;
; UWAGA! dopasowana do zegara 12 MHz, przy wiekszej lub
; wyraznie mniejszej fosc nalezy ja odpowiednio zmodyfikowac
;===========================================================
wait_5us:
NOP ; uwgledniajac, ze LCALL i RET trwaja w sumie 4 cykle
RET ; maszynowe wystarczy dolozyc pojedyncza instrukcje NOP
;===========================================================
; procedura pomocnicza - ustawia linie SCL w stan wysoki
; i czeka na zakonczenie ewentualnego przeciagania stanu
; niskiego przez urzadzenie podrzedne
;===========================================================
SCL_high:
SETB SCL ; probuje wymusic wysoki stan linii SCL
JNB SCL, $ ; i czeka na faktyczne przejscie SCL w stan wysoki
RET
;===========================================================
; procedura pomocnicza - wysyla sygnal STOP i zwalnia szyne
;===========================================================
stop_I2C:
CLR SDA ; wymusza stan niski na SDA
CALL SCL_high ; przygotowanie SCL (SCL w stan wysoki)
CALL wait_5us ; minimalne opoznienie
SETB SDA ; wlasciwe zbocze sygnalu STOP
CALL wait_5us
CLR I2C_busy ; wyzerowanie wskaznika zajetosci szyny
RET
;===========================================================
; procedura wysylania bajtu do urzadzen podrzednych
; bajt do wyslania w ACC
; niszczy CY
;===========================================================
zapis_bajtu_I2C:
MOV licznik_bitow_I2C, #8
wr_loop:
RLC A ; bit do wyslania do CY
MOV SDA, C ; i na linie SDA
CALL SCL_high ; zbocze narastajace SCL
CALL wait_5us ; odmierzenie minimalnego czasu wysokiego SCL
CLR SCL ; i zbocze opadajace SCL
CALL wait_5us ; zmow minimalny odstep czasowy
DJNZ licznik_bitow_I2C, wr_loop
; powtarza petle, az wysle wszystkie bity
SETB SDA ; przygotowanie do odbioru bitu potwierdzenia
CALL SCL_high ; poczatek impulsu zegarowego dla bitu potwierdzenia
CALL wait_5us
JNB SDA, no_wr_ACK ; sprawdzenie, czy jest potwierdzenie, jesli nie
SETB I2C_no_ack ; to ustawiany jest odpowiedni znacznik
no_wr_ACK:
CLR SCL ; koniec impulsu zegarowego dla bitu potwierdzenia
CALL wait_5us
RET
;===========================================================
; procedura wysylania sygnalu START szyny I2C
;===========================================================
start_I2C:
SETB I2C_busy ; ustawienie wskaznika aktywnej transmisji I2C
CLR I2C_no_ack ; zerowanie wskaznikow bledow: braku potwierdzenia
CLR I2C_fault ; oraz blednego stanu szyny
JNB SCL, fault ; sprawdza poprawnosc stanu szyny i sygnalizuje
JNB SDA, fault ; ewentualny blad
CLR SDA ; poczatek sygnalu START
CALL wait_5us
CLR SCL
CALL wait_5us ; koniec sygnalu START
RET
fault:
SETB I2C_fault ; ustawienie wskaznika bledu szyny
RET
;===========================================================
; procedura odbierania bajtu od urzadzenia podrzednego
;
; odebrany bajt zwracany jest w ACC
;
; UWAGA! wskaznik I2C_ostatni_bajt jest wykorzystywany do
; sygnalizacji konca odbioru danych brakiem potwierdzenia
; i musi zawierac "1", jesli odbierany bajt ma byc ostatnim
; odbieranym bajtem lub "0" w przeciwnym przypadku
;
; niszczy CY
;===========================================================
odczyt_bajtu_I2C:
MOV licznik_bitow_I2C, #8 ; trzeba odebrac 8 bitow
rd_loop:
CALL SCL_high ; zbocze zegara dla odbieranego bitu
CALL wait_5us
MOV C, SDA ; odbierany bit z linii SDA do CY
RLC A ; i jego wsuniecie do ACC
CLR SCL ; koncowe zbocze zegara odebranego bitu
CALL wait_5us ; minimalny odstep przed kolejnym bitem
DJNZ licznik_bitow_I2C, rd_loop
; jesli nie wszystkie bity, to skok
MOV C, I2C_ostatni_bajt
MOV SDA, C ; stan bitu potwierdzenia na linie SDA
CALL SCL_high ; poczatek bitu potwierdzenia
CALL wait_5us
CLR SCL
SETB SDA ; koniec bitu potwierdzenia
CALL wait_5us
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -