I2C slave na '51
Wek
wek
Středa Březen 17 12:02:39 CET 2004
Zdravim vsetkych.
Diskusia na temu SW I2C slave v '51 ma vybudila k intelektuanemu cviceniu na tuto temu.
Stiahol som si specifikaciu a zbastlil doleuvedeny kod.
Podla mojho nazoru by to malo na 100kHz s natahovanim clocku pred a po ACK vcelku fungovat na 24MHz 1x '51.
A kedze master je povacsinou tiez softverovy, mohol by byt troska tolerantnejsi a tie medzery pred a po ACK robit sam - potom netreb
natahovat clock, cim sa zjednodusi SW mastra.
To, ze sa vyuziva 100% strojoveho casu nevidim ako nevyhodu pre tuto aplikaciu (prevodnik zbernic), ved co ineho uz by to malo robit
?
Samozrejme, HW podpora je pre tento pripad uplne idealna...ale obcas pridraha.
Podotykam, ze ide o nevyskusany kod.
Prosim o komentar od tych, co maju s I2C realne skusenosti.
Jano Waclawek
SCLpin Bit P3.2 ;I2C serial clock line
SDApin Bit P3.3 ;I2C serial data line
Buffer EQU 31h
BufferEnd EQU 35h
MyAddress EQU 30h
;na zaciatok inicializacie atd.
;co sa tyka tohoto kodu, treba naloadovat MyAddress (ak to nie je konstanta)
;musia byt zakazane vsetky prerusenia
RxX1: mov r0,#Buffer-1 ;nastavenie pointra na pociatocnu hodnotu
; setb SCLpin
RxX2: jnb SCLpin,RxX2 ;cakanie na START
jnb SDApin,RxX2
RxX3: jnb SCLpin,RxX2 ;tu je SCL aj SDA high, ak SCL prejde do LOW, ide sa spat do povodnej slucky
jb SDApin,RxX3 ;a v tejto sucke sa trci, kym nenastane prechod SDA do LOW
jnb SCLpin,RxX2 ;falosny poplach - SCL preslo do LOW akurat, ked sme vzorkovali SDA - takze spat na cakanie
;pri skutocnom START je toto mozne, vdaka presahu SCL o tHD;STA=4us
RxX3a: ;tu uz urcite START nastal
clr a ;nastavenie markera pre ukoncenie prijmu byte
setb c
RxX4: rlc a ;vetva pre SDA=0 (alebo START)
RxX4a: jnb SCLpin,RxX5 ;cakanie na dobeznu hranu SCL
jnb SDApin,RxX4a
jb SCLpin,RxX1 ;falosneho poplach vyluceny - nastalo STOP
RxX5: jc RxX10 ;toto bol posledny bit, t.j. vysunul sa marker
RxX6: jnb SCLpin,RxX6 ;SCL je LOW, cakanie na prechod do HIGH
mov c,SDApin ;vzorkovanie SDA
jnc RxX4
rlc a ;vetva pre SDA=1
RxX7: jnb SCLpin,RxX8 ;cakanie na koniec SCL
jb SDApin,RxX7
jnb SCLpin,RxX8 ;falosny poplach
mov r0,#Buffer-1 ;skutocne nastal START
sjmp RxX3a
RxX8: jnc RxX6
RxX10: ; clr SCLpin ;natahovanie clocku - ak treba
cjne r0,#Buffer-1,RxX10a
cjne a,MyAddress,RxX1 ;moja adresa? (moze byt aj konstanta...)
RxX10a: clr SDApin ;ACK
; setb SCLpin
RxX11: jnb SCLpin,RxX11 ;cakanie na SCL pulz od mastra
RxX12: jb SCLpin,RxX12
; clr SCLpin ;natahovanie clocku - ak treba
setb SDApin ;aby sme nezabudli pustit SDA
cjne r0,#Buffer-1,RxX13
inc r0
sjmp RxX14
RxX13: mov @r0,a
inc r0
cjne r0,#BufferEnd+1,RxX20
RxX14: mov a,#1 ;znovunastavenie markera pre pocitanie bitov
clr c
; setb SCLpin
sjmp RxX6
RxX20:
;tu pride retransmisia buffra na druhy typ zbernice
;ak je to potrebne, drzi sa SCL LOW cely cas retransmisie
;ak nie, pusti sa hned, ale master musi zabezpecit nevyslanie
; novych dat po celu dobu retransmisie
jmp RxX1
end
Další informace o konferenci Hw-list