htt
p
://codientu.or
g
Tác giả: Nguyễn Chí Linh
Tómtắt:
GiớithiệuchungvềI2C
‐ ĐặcđiểmchungvềI2C:giaothức,địachỉ
‐ Ccchếđộhoạtđộng:master‐slave,multi‐master
ModuleI2CtrongViđiềukhiểnPIC
‐ Cấutrcphầncứng
‐ Chếđộhoạtđộng:Master,Slave,Multi‐master
1. GiớithiệuchungvềI2C
Ngàynaytrongcáchệthốngđiệntửhiệnđại,rấtnhiềuICshaythiếtbịngoạivicần
phảigiaotiếpvớicácICshaythiếtbịkhác–giaotiếpvớithếgiớibênngoài.Vóimụctiêu
đạtđượchiệu quảchophầncứngtốtnhấtvớimạchđiệnđơngiản,Phillipsđãpháttriển
mộtchuẩngiaotiếpnốitiếp2dâyđượcgọilàI2C.I2ClàtênviếttắtcủacụmtừInter‐
IntergratedCircuit–BusgiaotiếpgiữacácICvớinhau.
LịchsửI2C–Thêmvàođây…(Phầnnàysẽthêmsau…)
I2CmặcdùđượcpháttriểnbớiPhilips,nhưngnóđãđượcrấtnhiềunhàsảnxuấtIC
trênthếgiớisửdụng.I2Ctrởthànhm ộtchuẩncôngnghiệpchocácgiaotiếpđiềukhiển,có
thểkểrađâymộtvàitêntuổingoàiPhilipsnhư:TexasIntrument(TI),Maxim‐Dallas,
analogDevice,NationalSemiconductor…BusI2Cđượcsửdụnglàmbusgiaotiếpngoại
vichorấtnhiềuloạiICkhácnhaunhưcácloạiViđiềukhiển8051, PIC,AVR,ARM,chíp
nhớnhưRAMtĩnh(StaticRam),EEPROM,bộchuyểnđổitươngtựsố(ADC),sốtươngtụ
(DAC),ICđiểukhiểnLCD,LED…
Hình1.1.BUSI2Cvàcácthiếtbịngoạivi
htt
p
://codientu.or
g
Tác giả: Nguyễn Chí Linh
1.1.ĐặcđiểmgiaotiếpI2C
MộtgiaotiếpI2Cgồmcó2dây:SerialData(SDA)vàSerialClock(SCL).SDAlàđường
truyềndữliệu2hướng,cònSCLlàđườngtruyềnxungđồnghồvàchỉtheomộthướng.
Nhưhìnhvẽtrên,khimộtthiếtb ịngoạivikếtnốivàođườngI2CthìchânSDAcủanósẽ
nốivớidâySDAcủabus,chânSCLsẽnốivớidâySCL.
Hình1.2.KếtnốithiếtbịvàobusI2Cởchếđộchuẩn(Standardmode)
vàchếđộnhanh(Fastmode)
MỗidâySDAhaySCLđềuđượcnốivớiđiệnápdươngcủanguồncấpthôngquamột
điệntrởkéolên(pull‐upresistor).Sựcầnthiếtcủacácđiệntrởkéonàylàvìchângiaotiếp
I2Ccủacácthiếtbịngoạivithườnglàdạngcựcmánghở(open‐drainoropen‐collector).
Giátrịcủacácđiệntrởnàykhácnhautùyvàotừngthiếtbịvàchuẩngiaotiếp,thườngdao
độngtrongkhoảng1KΩđến4.7KΩ.
Trởlạivớihình1.1,tathấycórấtnhiềuthiếtbị(ICs) cùngđượckếtnốivàom ộtbus
I2C,tuynhiênsẽkhôngxảyrachuyệnnhầmlẫngiữacácthiếtbị,bởimỗithiếtbịsẽđược
nhậnrabởimộtđịachỉduynhấtvớimộtquanhệchủ/tớtồntạitrongsuốtthờigiankết
nối.Mỗithiếtbịcóthểhoạ
tđôngnhưlàthiếtbịnhậndữliệuhaycóthểvừatruyềnvừa
nhận.Hoạtđộngtruyềnhaynhậncòntùythuộcvàoviệcthiếtbịđólàchủ(master)haytớ
(slave).
MộtthiếtbịhaymộtICkhikếtnốivớibusI2C,ngoàimộtđịachỉ(duynhất)đểphân
biệt,nócònđượccấuhìnhlàthiếtbịchủ(master)haytớ(slave).Tạisaolạicósựphânbiệt
này?ĐólàvìtrênmộtbusI2Cthìquyềnđiềukhiểnthuộcvềthiếtbịchủ(master).Thiếtbị
chủnắmvaitròtạoxungđồnghồchotoànhệthống,khigiữahaithiếtbịchủ/tớgiaotiếp
thìthiếtbịchủcónhiệmvụtạoxungđồnghồvàquảnlýđịachỉcủathiếtbịtớtrongsuốt
quátrìnhgiaotiếp.Thiếtbịchủgiữvaitròchủđộng,
cònthiếtbịtớgiữvaitròbịđộng
trongviêcgiaotiếp.
htt
p
://codientu.or
g
Tác giả: Nguyễn Chí Linh
Hình1.3.Truyềnnhậndữliệugiữachủ/tớ
Nhìnhìnhtrêntathấyxungđồnghồchỉcómộthướngtừchủđếntớ,cònluồngdữliệu
cóthểđitheohaihướng,từchủđếntớhayngượclạitớđếnchủ.
VềdữliệutruyềntrênbusI2C,mộtbusI2Cchuẩntruyền8‐bitdữliệucóhướngtrên
đườngtruyềnvớitốcđộlà100Kbits/s–Chếđộchuẩn(Standardmode).Tốcđộtruyềncó
thểlêntới
400Kbits/s–Chếđộnhanh(Fastmode)vàcaonhấtlà3,4Mbits/s–Chếđộcao
tốc(High‐speedmode).
MộtbusI2Ccóthểhoạtđộngởnhiềuchếđộkhácnhau:
- Mộtchủmộttớ(onemaster–oneslave)
- Mộtchủnhiềutớ(onemaster–multislave)
- Nhiềuchủnhiềutớ(Multimaster–multislave)
Dùởchếđộnào,mộtgiaotiếpI2Cđềudựavàoquanhệchủ/tớ.GiảthiếtmộtthiếtbịA
muốngửidữliệuđếnthiếtbịB,quátrìnhđượcthựchiệnnhưsau:
‐ ThiếtbịA(Chủ)xácđịnhđúngđịachỉcủathiếtbịB(tớ),cừngvớiviệcxácđịnh
địachỉ,thiếtbịAsẽquyếtđịnhviệcđọchayghivàothiếtbịtớ
‐ ThiếtbịAgửidữliệutớithiếtbịB
‐ ThiếtbịAkếtthúcquátrìnhtruyềndữliệu
KhiAmuốnnhậndữliệutừB,quátrìnhdiễnranhưtrên,chỉkháclàAsẽnhậndữliệu
từB.Tronggiaotiếpnày,AlàchủcònBvẫnlàtớ.Chitiếtviệcthi
ếtlậpmộtgiaotiếp giữa
haithiếtbịsẽđược môtảchitiếttrongcácmụcdướiđây.
1.2. STARTandSTOPconditions
STARTvàSTOPlànhữngđiềukiệnbắtbuộcphảicókhimộtthiếtbịchủmuốnthiết
lậpgiaotiếpvớimộtthiếtbịnàođótrongmạngI2C.STARTlàđiềuki
ệnkhởiđầu,báo
hiệubắtđầucủagiaotiếp,cònSTOPbáohiệukếtthúcmộtgiaotiếp.Hìnhdướiđâymôtả
điềukiệnSTARTvàSTOP.
Banđầukhichưathựchiệnquátrìnhgiaotiếp,cảhaiđườngSDAvàSCLđềuởmức
cao(SDA=SCL=HIGH).LúcnàybusI2Cđượccoilàdỗi(“busfree”),sẵnsàngchomột
giaotiếp.HaiđiềukiệnSTARTvàSTOPlàkhôngthểthiếutrongviệcgiaotiếpgiữacác
thiếtbịI2Cvớinhau
htt
p
://codientu.or
g
Tác giả: Nguyễn Chí Linh
Hình1.4.ĐiềukiệnSTARTvàSTOPcủabusI2C
ĐiềukiệnSTART:mộtsựchuyểnđổitrạngtháitừcaoxuốngthấptrênđườngSDA
trongkhiđườngSCLđangởmứccao(cao=1;thấp=0)báohiệumộtđiềukiệnSTART
ĐiềukiệnSTOP:MộtsựchuyểnđổitrạngtháitừmứcthấplêncaotrênđườngSDA
trongkhiđườngSCLđangởmứccao.
CảhaiđiềukiệnSTARTvàSTOPđềuđượctạorabởithiếtbịchủ.SautínhiệuSTART,
busI2Ccoinhưđangtrongtrangtháilàmviệc(busy).BusI2Csẽrỗi,sẵnsàngchomột
giaotiếpmớisautínhiệuSTOPtừphíathiếtbịchủ.
SaukhicómộtđiềukiệnSTART,trongquatrìnhgiaotiếp,khicóm ộttínhiệuSTART
đượclặplạithayvìmộttínhiệuSTOPthìbusI2Cvẫntiếptụctrongtrạngtháibận.Tín
hiệuSTARTvàlặplạiSTARTđềucóchứcnănggiốngnhaulàkhởitạomộtgiaotiếp.
1.3.Địnhdạngdữliệutruyền
DữliệuđượctruyềntrênbusI2Ctheotừngbit,bitdữliệuđượctruyềnđitạimỗisườn
dươngcủaxungđồnghồtrêndâySCL,quátrìnhthayđổibitdữliệuxảyrakhiSCLđang
ởmứcthấp.
Hình1.5.Quátrìnhtruyền1bitdữliệu
Mỗibytedữliệuđượctruyềncóđộdàilà8bits.Sốlượngbytecóthểtruyềntrongmột
lầnlàkhônghạnchế.MỗibyteđượctruyềnđitheosaulàmộtbitACKđểbáohiệuđã
nhậndữliệu.Bitcótrọngsốcaonhất(MSB)sẽđượctruyềnđiđầutiên,cácbítsẽđược
truyềnđilầnlượt.Sau8xungclocktrêndâySCL,8bitdữliệuđãđượctruyềnđi.Lúcnày
thiếtbịnhận,saukhiđãnhậnđủ8bítdữliệusẽkéoSDAxuốngmứcthấptạomộtxung
ACKứngvớixungclockthứ9trêndâySDAđểbáohiệuđãnhậnđủ8bit.Thiết
bịtruyền
khinhậnđượcbitACKsẽtiếptụcthựchiệnquátrìnhtruyềnhoặckếtthúc.
Tác giả: Nguyễn Chí Linh
Hình1.6.DữliệutruyềntrênbusI2C
Hình1.7.BitACKtrênbusI2C
Truyền Nhận
SDA=data_bit
Buffer=databit
Kiểmtraxem
đãtruyềnđủ
8bitchưa
Clock=8?
NO
YES
ACK?
NO
BufferFull?
NO
YES
SendACK
YES
Next_byte
orSTOP
STOP
ReadBuffer
Hình1.8.Lưuđồthuậttoánquátrìnhtruyêngnhậndữliệu
h
Tác giả: Nguyễn Chí Linh
MộtbytetruyềnđicókèmtheobitACKlàđiềukiênbắtbuộc,nhằmđảmbảochoquá
trìnhtruyềnnhậnđượcdiễnrachínhxác.Khikhôngnhậnđượcđúngđịachỉhaykhi
muốnkếtthúcquátrìnhgiaotiếp,thiếtbịnhậnsẽgửimộtxungNot‐ACK(SDAởm ức
cao)đểbáochothiếtbịchủbiết,thiếtbịchủsẽtạoxungSTOPđểkếtthúchaylặplạimột
xungSTARTđểbắtđầuquátrìnhmới.
1.4.Địnhdạngđịachỉthiếtbị
Mỗithiếtbịngoạivithamgiavàobusi2cđềucómộtđịachỉduynhất,nhằmphânbiệt
giữacácthiếtbịvớinhau.Độdàiđịachỉlà7–bit,điềuđócónghĩalàtrênmộtbusI2Cta
cóthểphânbiệttốiđa128thiếtbị.Khithiếtbịchủmuốngiaotiếpvớingoạivinàotrênbus
I2C,nósẽgửi7bitđịachỉcủathiếtbịđ
órabusngaysauxungSTART.Byteđầutiênđược
gửisẽbaogồm7bitđịachỉvàmộtbítthứ8điềukhiểnhướngtruyền.
Hình1.8.Cấutrúcbytedữliệuđầutiên
Mỗimộtthiếtbịngoạivisẽcómộtđịachỉriêngdonhàsảnxuấtranóquyđịnh.Địachỉ
đócóthểlàcốđịnhhaythayđổi.Riêngbitđiềukhiểnh ướngsẽquyđịnhchiềutruyềndữ
liệu.Nếubitnàybằng“0”cónghĩalàbytedữliệutiếptheosausẽđượctruyềntừchủđến
tớ,cònngượclạinếubằng“1”thìcácbytetheosaubyteđầutiênsẽlàdữliệutừcontớgửi
đếnconchủ.Việcthiếtlậpgiátrịchobitnàydoconchủthihành,contớsẽtùytheogiátrị
đómàcósựphảnhồitươngứngđếnconchủ.
1.5. TruyềndữliệutrênbusI2C,chếđộMaster‐Slave
Việctruyềndữliệudiễnragiữaconchủvàcontớ.Dữliệutruyềncóthểtheo2hướng,
từchủđếntớhayngượclại.Hướngtruyềnđượcquyđịnhbởibitthứ8 trongbyteđầu
tiênđượctruyềnđi.
Hình1.9.Quátrìnhtruyềndữliệu
h
Tác giả: Nguyễn Chí Linh
•
Truyềndữliệutừchủđếntớ(ghidữliệu):Thiếtbịchủkhimuốnghidữliệuđến
contớ,quátrìnhthựchiệnlà:
‐ ThiếtbịchủtạoxungSTART
‐ Thiếtbịchủgửiđịachỉcủathiếtbịtớmànócầngiaotiếpcùngvớibit
=0rabusvàđợixungACKphảnhồitừcontớ
‐ KhinhậnđượcxungACKbáođãnhậndiệnđúngthiếtbịtớ,conchủbắt
đầugửidữliệuđếncontớtheotừngbytemột.Theosaumỗibytenàyđều
làmộtxungACK.Sốlượngbytetruyềnlàkhônghạnchế.
‐ Kếtthúcquátrìnhtruyền,conchủsaukhitruyềnbytecuốisẽtạoxung
STOPbáohiệukếtthúc.
Hình1.10.Ghidữliệutừchủđếntớ
•
Truyềndữliệutừtớđếnchủ(đọcdữliệu):Thiếtbịchủmuốnđọcdữliệutừthiếtbị
tớ,quátrìnhthựchiệnnhưsau:
‐ Khibusrỗi,thiếtbịchủtạoxungSTART,báohiệubắtđầugiaotiếp
‐ Thiếtbịchủgửiđịachỉcủathiếtbịtớcầngiaotiếpcùngvớibit =1và
đợixungACKtừphíathiếtbịtớ
‐ SauxungACKdầutiên,thiếtbịtớsẽgửitừngbyterabus,thiếtbịchủsẽ
nhậndữliệuvàtrảvềxungACK.Sốlượngbytekhônghạnchế
‐ Khimuốnkếtthúcquátrìnhgiaotiếp,thiếtbịchủgửixungNot‐ACKvà
tạoxungSTOPđểkếtthúc.
Hình1.11.Đọcdữliệutừthiếtbịtớ
•
Quátrìnhkếthợpghivàđọcdữliệu:giữahaixungSTARTvàSTOP,thiếtbịchủcó
thểthựchiệnviệcđọchayghinhiềulần,vớimộthaynhiềuthiếtbị.Đểthự
chiện
việcđó,saumộtquátrìnhghihayđọc,thiếtbịchủlặplạimộtxungSTARTvàlại
gửilạiđịachỉcủathiếtbịtớvàbắtđầumộtquátrìnhmới.
h
Tác giả: Nguyễn Chí Linh
Hình1.12.Quátrìnhphốihợpđọc/ghidữliệu
ChếđộgiaotiếpMaster‐SlavelàchếđộcơbảntrongmộtbusI2C,toànbộbusđược
quảnlýbởimộtmasterduynhất.Trongchếđộnàysẽkhôngxảyratìnhtrạngxungđột
bushaymấtđồngbộxungclockvìchỉcómộtmasterduynhấtcóthểtạoxungclock.
1.6. ChếđộMulti‐Master
TrênbusI2Ccóthểcónhiềuhơnmộtmasterđiềukhiểnbus.KhiđóbusI2Csẽhoạt
độngởchếđộMulti‐Master.
Vấnđềnàysẽđượcbànthảosau.
2. ModuleI2CtrongViđiềukhiển
PIC
Vớinhữngtiệníchđemlại,khốigiaotiếpI2Cđãđượctíchhợpcứngtrongkhánhiều
loạiViđiềukhiểnkhácnhau.TrongcácloạiViđiềukhiểnPICdòngMid‐rangephổbiến
tạiViệtNam,chỉtừ16F88mớicóhỗtrợphầncứngI2C,còncácloại16F84,16F628thì
khôngcó.VớinhữngloạiViđiềukhiểnkhôngcóhỗtrợphầncứnggiaotiếpI2C,đểsử
dụngtacóthểdùngphầnmềmlậptrình,khiđótasẽviếtmộtchươngtrinhdiềukhiển2
chânbấtkỳcủaViđiềukhiểnđểnóthựchiệngiaotiếpI2C
(cáchàmSTART,STOP,
WRITE,READ).TrongbàiviếtnàytađềcậpđếnviệcsửdụnggiaotiếpI2Ccủacácloại
PICcótíchhợpkhốiI2Csẵntrongnó,màcụthểlàViđiềukhiển
PIC16F877A.
2.1.Đặcđiểmphầncứng
HìnhdướiđâychỉracấutrúcphầncứngcủakhốiđiềukhiểnGiaotiếpnốitiếpđồngbộ
(MSSP)hoạtđộngởchếđộI2C.KhốiI2Ccódầyđủchứcnăng,hoạtđộngởcả2chếđộlà
MASTER(chủ)vàSLAVE(tớ),cóngắtxảyrakhicóđiềukiệnSTARThaySTOPxảyra,
nhằmđịnhrõđườngI2Ccódỗihaykhônơng(chứcnăngMulti‐master).Chếđộđịachỉ
có
thểlà7‐bithay10‐bit.
KhốiI2Ccó6thanhghiđiềukhiểnhoạtđộng,đólà:
‐ SSPCON:Thanhghiđiềukhiển
‐ SSPCON2:Thanhghiđiềukhiểnthứ2
‐ SSPSTAT:Thanhghitrạngthái
h
Tác giả: Nguyễn Chí Linh
‐ SSPBUF:Thanhghibộđệmtruyềnnhận
‐ SSPSR:Thanhghidịch
‐ SSPADD:Thanhghiđịachỉ
CácthanhghiSSPCON,SSPBUF,SSPADDvàSSPSON2cóthểtruycậpđọc/ghiđược.
ThanhghiSSPSRkhôngthểtruycậptrựctiếp,làthanhghidichdữliệurahayvào.Các
thanhghiSSPCON,SSPCON2vàSSPSTATđượcđịnhđịachỉbit,mỗibitcóchứcnăng
riêng.Ýnghĩacủatừngthanhghivàcủam ỗibittrongtừngthanhghiđãđượcđềcậpkỹ
trongtàiliệuDatasheetcủaPICvàtrongtàiliệuTUT04.02.PVN.MAFDcủabạnMạnh,tôi
khôngđềcậpthêmởđây.Trongtàiliệunaygtôisẽtậptrungvàoviệc s ửdụngkhốiI2C
củaPICởcácchếđộMastervàSlavetrongphầnmềmbiêndịchCchoPIClàCCS
Hình2.1.CấutrúckhốiI2CtrongPIC
2.2. CáchthứcsửdụngModuleI2CtrongCCS
TrongviệclậptrìnhchoPICsửdụnggiaotiếpI2Ccủanótrongcácứngdụng,người
lậptrìnhcóthểthựchiệnmộtcáchdễdàngvớitrìnhdịchCCS.Nóidễdàngởđâylàch
ỉvề
mặtcúpháplệnh,takhôngcầnsửdụngnhiềucâulệnhkhónhớnhưtronglậptrìnhASM.
h
Tác giả: Nguyễn Chí Linh
Việckhởitạo,chọnchếđộhoạtđộngvàthực hiệngiaotiếpcủaI2Cđãcócáchàmdựng
sẵncủaCCSthựchiện.CáchàmliệtkêdướiđâylàcủaphiênbảnCCS3.242,đólà:
‐ i2c_isr_state():ThôngbáotrạngtháigiaotiếpI2C
‐ i2c_start():TạođiềukiệnSTART
‐ i2c_stop():TạođiềukiệnSTOP
‐ i2c_read():ĐọcgiátrịtừthiếtbịI2C,trảvềgiátrị8bit
‐ i2c_write():Ghigiátrị8bitđếnthiếtbịI2C
ĐểsửdụngkhốiI2Ctas ửdụngkhaibáosau:
#use
i2c(chế_độ,
tốcđộ,sda=PIN_C4,scl=PIN_C3)
‐ Chếđộ:MasterhaySlave
‐ Tốcđộ:Slow(100KHz)hayFast(400KHz)
‐ SDAvàSCLlàcácchâni2ctươngứngcủaPIC
Saukhaibáotrên,tacóthểsửdụngcáchàmnêutrênđểthựchiện,xửlýcácgiaotiếp
i2cvớicácthiếtbịngoạivikhác.
Còntiếpnữa…
3. Kếtluận