You are on page 1of 13

Giao tip I2C

Gii thiu I2C: I2C l mt loi bus giao tip ngoi vi c pht trin bi hng Philips, thng c s dng iu khin nhiu thit b iu khin khc c b tr trong cc khi mch tng i xa nhau (<1.5m ). I2C l giao tip ni tip thc hin trn hai ng dy : Clock (SCL) v Data (SDA).

S Giao tip I2C:

CHI

TIT I2C. tip. xut. xut. Slave. Slave. Slave Slave. xut.

Master : Gi vai tr iu khin Bus To xung Clock ( SCL) trong sut qu trnh giao To cc tn hiu Start bt u qu trnh truy Pht a ch ca thit b Slave cn truy Gi tn hiu R/W ti Truyn d liu ti thit b Nhn d liu t To tn hiu Not-ACK khi kt thc nhn t To tn hiu Stop kt thc qu trnh truy

Slave : Nhn a ch v bit R/W t Master (Ch Response khi ng a ch ca Slave) . Nhn d liu t Master gi bit ACK sau mi 8 Clock. Truyn d liu ti Master, ch ACK t Master tip tc gi. Thc hin chc nng chuyn dng ca khi thit b ngoi vi ( RAM, EEPROM, ADC,DAC ngoi).

Cc tn hiu Start v Stop : SDA=SCL=HIGH: Bus I2C trng thi Free sn sng cho mt giao tip. iu kin START: SDA v SCL =HIGH. iu kin STOP: SDA v SCL =HIGH. C hai iu kin START v STOP u c to ra bi Master. Sau tn hiu START, bus I2C trng thi busy thc hin tc v truy xut ni tip. Sau STOP bus I2C trng thi free cho ln k tip.

nh dng d liu truyn : - D liu c truyn trn bus I2C theo tng bit ti mi cnh ln ca xung Clock ( SCL), s thay i bit d liu trn SDA xy ra khi SCL ang mc thp. S lng byte c th truyn trong mt ln ty , ti a l 128 bytes. - Bit MSB s c truyn trc. Sau 8 xung clock 8 bit d liu c truyn i, thit b nhn s ko SDA xung mc thp tng ng mt bit ACK ti xung clock th 9 trn bo hiu nhn 8 bit. Thit b truyn khi nhn c bit ACK s tip tc thc hin qu trnh truyn hoc kt thc.

nh dng a ch thit b: Mi thit b ngoi vi tham gia vo bus i2c u c mt a ch duy nht, c di l 7 bit nh vy trn mt bus I2C ta c th phn bit ti a 128 thit b. Byte u tin c gi t Master s bao gm 7 bit a ch v bit th 8 gi l bit R/W. Bit R/W = 0 : Ghi d liu t Master vo Slave. Bit R/W = 1 : c d liu t Slave .

Phng thc truyn d liu ti Slave: Master to xung START Master gi 7 bit a ch ca Slave + bit R/W= 0 (8 clock) Ti thi im clock th 9, Master c xung ACK t Slave. ACK = 0 khi Slave c a ch tng ng nhn dng, Master bt u gi d liu n Slave theo tng byte mt mt 9 clock do theo sau mi byte (8 clock) c gi t Master, Slave phi xc nhn bng mt xung ACK=0. Kt thc qu trnh truyn, Master sau khi truyn byte cui s to xung STOP bo hiu kt thc.

Ch c d liu t Slave: Master to xung START Master gi 7 bit a ch ca Slave + bit R/W = 1 Sau khi Slave xc nhn a ch v tr v bit ACK=0, Slave s gi tng byte ra SDA; Master s nhn d liu v cng tr v bit ACK =0 sau mi byte. kt thc qu trnh nhn d liu, Master gi xung NotACK qua c php i2c_read(1,0) v to xung STOP.

Thc thi trn vi iu khin PIC 16F876A Khi I2C c 6 thanh ghi iu khin hot ng, l:

- SSPCON: Thanh ghi iu khin - SSPCON2: Thanh ghi iu khin th 2 - SSPSTAT: Thanh ghi trng thi SSPBUF: Thanh ghi b m truyn nhn SSPSR: Thanh ghi dch SSPADD: Thanh ghi a ch

Firmware s dng CCS - Cu hnh firmware: - Khai bo chip: chn file <tenchip.h> c trong th vin CCS, VD : #include <16F876A.h> - Khai bo cu hnh phn cng: s dng t kha #fuse bao gm cc tnh nng : . LP, XT, HS, RC : Chn kiu dao ng . WDT, NOWDT : Kim sot Watch Dog Timer. . PROTECT, NOPROTECT : Kim sot sao chp firmware .LVP,NOLVP: Kim sot lp trnh ngun thp. - Khai bo cu hnh chc nng s dng t kha #use bao gm cc tnh nng: . delay(clock=24000000) : Khai bo tc thch anh . i2c(master, sda=PIN_C4, scl=PIN_C3, FAST) : Khai bo cu hnh I2C . rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7): Khai bo cu hnh cng COM Khai bo dch v ngt, s dng t kha: INT_SSP : Ngt ni tip khi thanh ghi dch va thc hin xong 8 bits. INT_EXT : Ngt ngoi INT_TIMER1: Ngt Timer INT_EEPROM: Ngt khi c s kin truy xut EEPROM. Chng trnh chnh main() Master: - Chng trnh chnh sng trong vng lp While while (TRUE) { Ni dung chng trnh } Ghi d liu ti Slave : i2c_start(); // Master to tn hiu Start i2c_write(0xa0); // Gi a ch v bt hng R/W = 0 (Mode write) n Slave i2c_write(data); // Gi d liu byte th nht i2c_write(data1); // Gi d liu byte th hai .

i2c_write(datan); // Gi d liu byte th n (n<=128) i2c_stop(); // Master to tn hiu Stop c d liu t Slave: i2c_start(); // Master to tn hiu Start i2c_write(0xa1); // Gi a ch v bt hng R/W = 1 (Mode read) n Slave buf = i2c_read(); // c d liu byte th nht buf2= i2c_read(); // c d liu byte th hai buf1 = i2c_read(1,0); // c d liu byte th n (n<=128) ng thi gi Not-ACK i2c_stop(); // Master to tn hiu Stop

Scope: Master pht a ch "0xa0" v 2 byte c ni dung "1234"

firmware cho Slave Khai bo cu hnh cho Slave:

i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0) INT_SSP Cu hnh ngt ni tip : enable_interrupts(GLOBAL); enable_interrupts(INT_SSP); Vic c, ghi d liu ca thit b Slave c thc thi trong ngt ty thuc vo trng thi ca ng truyn I2C. state = i2c_isr_state(); // c trng thi ca I2C Slave sau s kin ngt ni tip . State = 0 : c a ch v bit R/W . State = 1-0x7F: c d liu t Master bng lnh i2c_read() . State = 0x80: c a ch v bit R/W=1, gi d liu ti Master bng lnh i2c_write(); . State =0x81-0xFF : Nhn c ACK t Master , Gi d liu ti Master. c d liu t Master: if(state < 0x80) { incoming = i2c_read(); if(state == 1) data = incoming; if(state == 2) data1 = incoming; if(state == n) datan = incoming; } Ghi d liu ti Master: if(state == 0x80) i2c_write(data); if(state == 0x81) i2c_write(data1); if(state == 0x8n) i2c_write(datan);

Scope: Master pht a ch "0xa1" v c 3 byte t Slave

NXQ-VAD-LMC ------------------------------

cch nh a ch nh 24C04 vi I2C ?


Tnh hnh l mnh ang nghin cu giao tip I2C ca con EEPOM 24C04 vi 89C51, cc ti liu v l thuyt cng nh code mu mnh c qua, tuy nhin vn cha thy c ti liu no i su chi tit m a phn l code protocol I2C chung chung ... Trong qu trnh lm, mnh c thc mc nh sau: Khi gi t con master (89) sang slave (24) cn c: + tn hiu Start

+ a ch vt l con t (c th 10100000), i ACK + d liu cn ghi vo (tun t tng byte) + tn hiu stop ... Mnh thc mc ch, nu lm nh vy th tn hiu s ghi vo nh no, chc l theo tun t t 00H n xxH ... ca 24C04, tuy nhin c nhng nhu cu ring, v d mnh mun ghi t th 10H ... vy th phi lm sao ? C vic khi c li na, nu ch c nhu cu c 1 vi nh no trong 24C04 th phi lm sao ? Mnh xem trn ging xung th n sau mn "th tc cho hi" c gi data ri ch ACK ri data .... cho n khi mun dng th gi Stop. Nh vy lm sao ch ng vn c/ghi d liu theo a ch nh m mnh mun Nu bn mun ghi vo 24 t nh th 10H th bn lm nh sau: + tn hiu Start + a ch vt l con t (c th 10100000), i ACK + d liu cn ghi vo l 10H, c th s 10H ny s c nghi vo thanh ghi "con tr", i ACK + d liu cn ghi (tng byte, sau mi byte i ACK...), byte u tin s c ghi vo nh c a ch cha trong thanh ghi con tr (10H) sau mi byte thanh ghi con tr s t ng tng 1 n v, nh vy byte th hai s c ghi vo a ch 11H... + tn hiu stop Tng t cho vic c bn nh. Chc bn thnh cng. hi mnh lm c, ri, thanks bn, ghi/c a ch bt k rt tt, ch c ci mnh ko hiu, l thuyt v mt s code mu th c th tc i phn hi ACK t con salve, nhng khi run th ko c, mnh mov i SDA vo c C v dng vng lp i c C bng 0 th thot ra, xem nh c phn hi ACK, tuy nhin khi code chy th n tt lun v ko c ACK tr v, nhng khi mnh lm liu b lun ko thm i ACK na, c gi v nhn, delay mt xu xem nh c ACK th ghi nhn tt. Mc d mnh lm hot ng tt nhng ko ng l thuyt I2C nn rt kh chu trng hp ny cha nh ko bit c ai b

-------------------------------V I2C ny lm vi PIC th rc rc nhng lm vi 89 th cng v m hi. Xin gi cc bc on code I2C v cch dng n. Code:
#include <reg2051.h> //#include <reg52.h> //#include <intrins.h> //#include "E:\KeilC_uVision4\common.h" sbit SCL = P3^0; sbit SDA = P3^1; //extern delay_nop(); void delay_nop() { _nop_(); _nop_();

_nop_(); _nop_(); } void i2c_start(void) { SDA = 1; delay_nop(); SCL = 1; delay_nop(); SDA = 0; delay_nop(); SCL = 0; } void i2c_stop(void) { SCL = 0; SDA = 0; delay_nop(); SCL = 1; delay_nop(); SDA = 1; } unsigned char i2c_read(bit ack) { unsigned char data i, result; result = 0; SDA = 1; //select input direction delay_nop(); SCL = 0; for(i = 0; i < 8; i++) { delay_nop(); SCL = 1; delay_nop(); result <<= 1; if(SDA == 1) result++; SCL = 0; } delay_nop(); SDA = (ack == 1)? 0:1; delay_nop(); SCL = 1; delay_nop(); SCL = 0; return result; } bit i2c_write(unsigned char value) { unsigned char data i, temp; bit bdata ack; temp = value; SCL = 0; SCL = 0; for(i = 0; i < 8; i++) { delay_nop(); SDA = (temp & 0x80)? 1:0; delay_nop(); SCL = 1; SCL = 1;

delay_nop(); SCL = 0; SCL = 0; temp <<= 1; } SDA = 1; delay_nop(); SCL = 1; SCL = 1; ack = SDA; delay_nop(); SCL = 0; SCL = 0; return ack; } // read ACK

Cch dng n vo DS1307, nu dng cho AT24xx th thay li ci khai bo a ch cho ng. Code:
#include <reg2051.h> //#include <reg52.h> #include <intrins.h> #include "E:\KeilC_uVision4\common.h" #define RTC_SLAVE_ADDRESS #define RTC_READ_COMMAND #define RTC_WRITE_COMMAND

0xD0 RTC_SLAVE_ADDRESS | 0x01 RTC_SLAVE_ADDRESS

/* struct Time { char second; char minute; char hour; //char day; //char date; //char month; //char year; }; */ extern i2c_start(); extern i2c_stop(); extern bit i2c_write(unsigned char value); extern unsigned char i2c_read(bit ack); extern delay_us(unsigned int us); /* void delay_us(unsigned int us) { while(us--); } */ extern delay_nop(); void DS1307_init() { unsigned char x; i2c_start(); i2c_write(RTC_WRITE_COMMAND); //Write slave address i2c_write(0x00); i2c_start();

i2c_write(RTC_READ_COMMAND); x = i2c_read(0); // Read second with NACK i2c_stop(); delay_us(10); i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(0x00); // Go to Second Reggister i2c_write(x & 0x7F); // start DS1307 i2c_stop(); i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(0x07); // Go to Control Reggister i2c_write(0x10); // configure RTC i2c_stop();

struct Time DS1307_get_time() { struct Time t; i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(0x00); // Go to top of memory i2c_start(); i2c_write(RTC_READ_COMMAND); t.second = i2c_read(1); // Read with ACK t.minute = i2c_read(1); t.hour = i2c_read(0); i2c_stop(); return t; } /* struct Time DS1307_get_date_time() { struct Time t; i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(0x00); // Go to top of memory i2c_start(); i2c_write(RTC_READ_COMMAND); t.second = i2c_read(1); // Read with ACK t.minute = i2c_read(1); t.hour = i2c_read(1); t.day = i2c_read(1); t.date = i2c_read(1); t.month = i2c_read(1); t.year = i2c_read(0); i2c_stop(); return t; } * void DS1307_set_time(struct Time t) { i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(0x00); i2c_write(t.second); i2c_write(t.minute); i2c_write(t.hour); i2c_stop(); }

/* void DS1307_set_date_time(struct Time t) { i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(0x00); i2c_write(t.second); i2c_write(t.minute); i2c_write(t.hour); i2c_write(t.day); i2c_write(t.date); i2c_write(t.month); i2c_write(t.year); i2c_stop(); } */ /* void DS1307_write(char addr, char value) { i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(addr); i2c_write(value); i2c_stop(); } unsigned char DS1307_read(char addr) { unsigned char value; i2c_start(); i2c_write(RTC_WRITE_COMMAND); i2c_write(addr); i2c_start(); i2c_write(RTC_READ_COMMAND); value = i2c_read(0); i2c_stop(); return value; } */

Chc cc bc thnh cng. Thn i. -----------------------

You might also like