; i2c.asm - Developed by Paolo Subiaco - ; Creative Solutions Engineering - http://www.creasol.it include HT46R23.INC SDA EQU pa.6 SCL EQU pa.7 SDAC EQU pac.6 SCLC EQU pac.7 extern _eepromAck:bit public _i2c_start public _i2c_stop public _i2c_write public _i2c_read public _i2c_data public i2c_write0 public i2c_read0 public _i2c_count data .section 'data' _i2c_count db ? _i2c_data db ? i2c_write0 db ? i2c_read0 db ? _i2c_code .section 'code' _i2c_hp_delay proc jmp i2c_hp_delay1 i2c_hp_delay1: jmp i2c_hp_delay2 i2c_hp_delay2: jmp i2c_hp_delay3 i2c_hp_delay3: jmp i2c_hp_delay4 i2c_hp_delay4: ret _i2c_hp_delay endp _i2c_qp_delay proc jmp i2c_qp_delay1 i2c_qp_delay1: jmp i2c_qp_delay2 i2c_qp_delay2: jmp i2c_qp_delay3 i2c_qp_delay3: ret _i2c_qp_delay endp _i2c_start proc ; start i2c-bus data transfer set _eepromAck set sda ; start condition set scl clr sdac clr sclc call _i2c_hp_delay clr sda call _i2c_qp_delay clr scl call _i2c_hp_delay ret _i2c_start endp _i2c_stop proc ; stop i2c-bus data transfer clr scl clr sda call _i2c_hp_delay set scl call _i2c_qp_delay set sda call _i2c_hp_delay ret _i2c_stop endp ; i2cwrite: riceve in A il byte da trasmettere. ; Return 1 in eepromAck if ACK, 0 if NACK received _i2c_write proc mov a,i2c_write0 ; function parameter mov _i2c_data,a mov a,8 mov _i2c_count,a i2cwrite1: rlc _i2c_data sz c jmp i2cwrite2 clr sda jmp i2cwrite3 i2cwrite2: set sda i2cwrite3: call _i2c_hp_delay set scl call _i2c_hp_delay clr scl sdz _i2c_count jmp i2cwrite1 set sdac ; Now get ack call _i2c_hp_delay sz sda clr _eepromAck set scl call _i2c_hp_delay clr scl clr sdac set sda call _i2c_qp_delay ret _i2c_write endp ;i2cread Legge un byte dal dispositivo e lo restituisce in A. ; Accetta come parametro R2: se R2==1 => non invia ACK, altrimenti si! ; R2 puo` quindi essere utilizzato come numero di byte da leggere: ; quando si sta leggendo l'ultimo byte, non viene inviato ACK => termine ; della lettura. N.B.: R2 viene gia` incrementato da i2cread! _i2c_read proc set sdac ; SDA used as input !! clr _i2c_data mov a,8 mov _i2c_count,a i2cread1: rl _i2c_data set scl ; force SCL high call _i2c_hp_delay call _i2c_hp_delay mov a,1 sz sda orm a,_i2c_data clr scl sdz _i2c_count jmp i2cread1 set sda ; devo inviare ACK ?? sz i2c_read0 clr sda ; send acknowledge clr sdac ; SDA as output! call _i2c_hp_delay i2cread3: set scl ; rilascia SCL: ora il device slave deve rilasciare SCL ! call _i2c_hp_delay clr scl mov a,_i2c_data ret _i2c_read endp