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