Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
1/10
Tutorialn
o
02.01
Gửiđến:
www.picvietnam.com
Nộidung:
ChuẩngiaotiếpI2C–I2CtrongPIC
MICROSOFTWORD
Tómtắt:
GiớithiệuchungvềI2C
‐ ĐặcđiểmchungvềI2C:giaothức,địachỉ
‐ Cácchếđộhoạtđộng:master‐slave,multi‐master
ModuleI2CtrongViđiềukhiểnPIC
‐ Cấutrúcphầ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ệuquả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ài
tê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ển
8051,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
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
2/10
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.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
3/10
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ới400Kbits/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đều dự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ếpgiữa
haithiếtbịsẽđượcmô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ện
quá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àSTOP
làkhôngthểthiếutrongviệcgiaotiếpgiữacác
thiếtbịI2Cvớinhau
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
4/10
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ệnSTART
và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ên
dâySDAđểbáohiệuđãnhậnđủ8bit.Thiếtbịtruyền
khinhậnđượcbitACKsẽtiếptụcthựchiệnquátrìnhtruyềnhoặckếtthúc.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
5/10
Hình1.6.DữliệutruyềntrênbusI2C
Hình1.7.BitACKtrênbusI2C
TruyềnNhận
Hình1.8.Lưuđồthuậttoánquátrìnhtruyêngnhậndữliệu
Buffer=databit
BufferFull?
ReadBuffer
SendACK
NO
YES
SDA=data_bit
Clock=8?
ACK?
Next_byte
or STOP
STOP
NO
NO
YES
YES
Kiểmtraxem
đãtruyềnđủ
8
b
i
tch
ưa
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
6/10
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
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
7/10
• 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ượngbyte
khô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ết
bịtớvàbắtđầumộtquátrìnhmới.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
8/10
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ảyra
tì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ểnPIC
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
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
9/10
‐ 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ệcsử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.
Ngườibáocáo:
NguyễnChíLinh
Tàiliệu:
TUT02.01
Ngày:
9/8/2006
Trang:
10/10
Việckhởitạo,chọnchếđộhoạtđộngvàthựchiệ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:
#usei2c(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