[elektro] PIC I2C lib
Moczik Gabor
pm_levlista at progzmaster.hu
Thu Oct 21 00:23:27 CEST 2010
Andras Huszti wrote:
> Jogos. En sem ismerek minden iic eszkozt, de volt olyan ahol read utan a
> write mar kulon frameben ment. Raadasul stop nelkul, siman startal
> kellet kezdeni. Igy nem kellet talalgatni, hogy lesz-e olvasas vagy sem.
> En a kovetkezo konstelaciokat tudom elkepzelni:
> - csak iras
> - csak olvasas
> - irast koveto olvasas
> - irast koveto olvasas start kondicioval
STOP nélküli START, az a terminológia szerint is érvényes, ez a RESTART
feltétel.
írást követő olvasás _csak_ restart-tal lehetséges, mert át kell vinni
egy új címet (főképp a benne lévő R/W bitet). Elvileg lehet hogy a
masterben be lehet állítani az RCEN bitet R/W=0 esetén is, de a slave
tuti nem fog küldeni semmit, mert adatot vár. Mindketten beolvassák majd
az 1-eseket az SDA-ról.
> Az iras es olvasas vegyesen nem tunik nagyon ertelmesnek, lehetne, de
> eleg kacifantos lenne szerintem.
Nem annyira. Ha minden műveletnél meg lehet adni, hogy mi lesz a
következő, akkor elég logikusan tud kinézni. Nem akarom most itt ezer
szóval leírni, még nincs 100%-ban átgondolva, de ha kész van, felrakom
aztán lehet zsűrizni. :-)
>> A slave NAK válasza végzetes hiba? (mármint nem a címre)
>> El tudok képzelni olyan eszközt, ami elfogad további adatot függetlenül
>> attól hogy az előző adatot nem fogadta el.
>
> Nem is tudom. Masik leveledbol nekem is felremlet valami az ACK/NACK ra.
> Elso NACK utan en a tobbi adatra is NACK-ot varnek olvasaskor master
Most így elolvasva az I2C dokumentációt, egyértelművé vált:
Az adat fogadója nyugtáz. NAK=transzfer vége.
A master ezután STOP-ot küld.
Master-transmitter esetén ha a Slave NAK-et válaszol, akkor nem tud több
adatot fogadni, a master köteles befejezni az átvitelt.
Befejezhető előbb is egy STOP-pal.
Master-receiver esetén ha nem akarunk a Slave-től tovább olvasni, akkor
NAK-et kell válaszolni neki.
Ha akarunk, a slave itt úgy érzem bajban lehet, ha neki nincs mit
küldeni. Nincs módja közölni, vagy megszakítani az átvitelt.
Erre fel kell készíteni az alkalmazást. Valamit muszáj küldeni.
> Gondolom a tobbi master a buszon(ha lenne) akkor varna egy stop eventre,
> hogy tudja, hogy szabad-e a busz. Vegulis jo strategia lehetne, hogy
> stop ot kuldeni hiba utan mindenkeppen.
Igazság szeint az atvitelt azzal kötelező zarni, végülis a NAK válasz az
nem hiba, a kommunikáció része. :-)
Hogy mi legyen akkor, ha elkeveredik a rendszer, és egy timeout-nak kell
kihoznia, az jó kérdés. Én ezesetben kikapcsolnám az SSP modult, majd
vissza és újra felkonfigurálnám.
Azt át kéne gondolni, hogy kerülhet-e a busz ettől zárolt állapotba.
Elvileg nem:
- Master timeout-ol, elengedi a buszt. A slave-nek soha nincs oka fogni
a buszt a masterre várva, legfeljebb belül vár az SCL-re. Remélhetőleg
egy START majd kihozza onnan.
- Slave timeout-ol, elengedi a buszt. A master végigjátssza az átvitelt,
a byte végén kap egy NAK-et mert az SDA magas.
> Szerintem nem. Tul sok logika kerul az ISR-be. Erdemes azt karcsun
> tartani. Adatot minel elobb normal kontextusba kellene atvinni es ott
> feldolgozni.
Ennyi logika már igazán nem oszt-nem szoroz. :-)
Elég hosszú ám az ISR már most!
(igaz hogy a fele komment, hogy később is értsem)
Mindenesetre nem USB ez, lassú pár byte-os transzferek vannak, ez a
legritkább esetben időkritikus. Alkalmazásfüggő, de az adatfeldolgozást
el lehet intézni az ISR-ben is (mármint nem a driverében, hanem az
alkalmazáséban)
if (SSPIF) {
i2c_isr(); // driver hívás
... // adatfeldolgozás
i2c_write...
}
> Es szerintem aplikacio fuggo. Az IIC driver tamogathat ilyet de nem
> feltetlenul kell. Pl IIC_write fugveny parametere lehet a resend. De en
> nem tennem. Tul bonyolult lenne a driver. Masreszrol a foprogram is
Az a baj, hogy univerzálisan biztosan nem lehet megoldani.
Az I2C driver csak a buszt ismerheti, az eszközt amivel kommunikász, azt
nem. Ha ütközés van, a START-tól újra kell kezdeni, de mivel mint fent
már vitattuk, függhet az adatoktól hogy mi a következő lépés. Ezt a
driverben nem tudhatjuk.
A címet újra tudhatná küldeni, esetleg ha a cím után csak írás van, azt
is, de ennyiért meg felesleges görcsölni.
>> Most azt tettem, hogy ha netan nincs adat, akkor addig letiltja a
>> megszakitast. Lesz timeout is...
> Nehez dolog ha ISR-bol nem tudod ujratolteni a buffert mert akkor
> jelezni kell a foprogramnak, hogy majd gondoskodjon efelol.
Nem akkora kunszt, I2C_MASTER_TX_WAIT státusz. :-)
De a főprogramban nem kell vizsgálni, egy elkövetkező i2c_write()
elintézi hogy átkerüljön küldési státuszba és engedélyezi a megszakíást is.
Ha nincs i2c_write, az valóban tervezési hiba, de jobb ha a driver nem
akad ki mindjárt, majd a timeout elintézi, de legalább lehet debugolni.
> Miert is fordulhat elo, hogy nincs kuldendo adat(lehet irtad de
> kiesett)? Ha belegondolok, akkor ez inkabb tervezesi hiba.
Mivel 1 bytenyi write buffer van, a főprogramban egymás után vannak az
i2c_write függvényhívások.
Ha mondjuk nem while(..); ciklusban várod hogy végre elmenjen az adat,
hanem teszel mást, esetleg beüt egy-két másik ISR is, elképzelhető hogy
nem áll rendelkezésre időben az adat.
> adat. Ha kuldes kozben kifogy es ezt tamogatni kell programbol akkor
> marha bonyolult lesz.
Ugyan...
Át kell lépni egy WAIT státuszba és tartani kell a buszt.
--
((( Móczik Gábor )))--((( e|mail: pm-01 |@| progzmaster |.| hu )))
((( S.k.y.p.e.: moczik )))
More information about the Elektro
mailing list