[ mbm @ 22.09.2015. 11:54 ] @
Ako je nekom poznat problem sa MCP3422 mikrocipovim AD konvertorom na I2C basu voleo bih da sa mnom podeli svoje iskustvo.

MCP3422 prozivam na I2C basu onako kako je napisano u data sheet-u. bar ja smatram da je tako. Bit banging i2c sam napisao dosta davno i normalno radi
sa: Cypress FRAM FM24V02 memorijom (trenutno vezano fizicki na isti i2c sa problematicnim MCP3422) i RTC cipom PCF8583, EEPROM 24C04.
Ploca na kojoj je FRAM i MCP3422 je sa ATMEL AT89LP828 na kome radi program a ploca se napaja sa 3,3V.

Da odmah pokažem šta je problem:

i2cstart
i2cbajtupis (adresa) 0xD0 adresiran upis
slaveacknolidge - provereno, stiže potvrda sa mcp3422
i2cbajtupis (configuration) - konfiguracioni bajt
slaveacknolidge - stiže potvrda sa mcp3422
pauza 1 sekund
i2cstart - restart
i2cbajtupis (adresa) 0xD1 adresirano citanje
slaveacknolidge - stiže potvrda sa mcp3422

x1=i2ccitanje
masteracknolidge
x2=i2ccitanje
masteracknolidge
x3=i2ccitanje
masterNOTacknolidge - za prekid citanja sledecih bajtova
i2cstop


Pokušao sam i da ne radim restart i2c za ocitavanje kao gore vec da iza slaveacknolidge posle konfiguracionog bajta dam stop ali nije vredelo isto se dešava.


Kako god citao, pa i sa 4 bajta ako pošaljem prethodno konfiguraciju da je konverzija 18 bita. uvek ali apsolutno uvek dobijam

x1 koji je promenljiv ako menjam ulazni napon na odabranom ulazu (mcp3422 ima 2)
x2 0xFF
x3 0xFF
pa i x4 ako je citano uvek je 0xFF.

Problem je što x3 ili ako je 18 bita izabrano onda x4 bi morao da sadrži ranije poslati konfiguracioni bajt ali se to nikad ne dogada. Naravno sasvim je ocigledno i da se ne pojavljuje podatak iz AD konverzije u x2 ili i u x3 bez obzira što sam prošetao ulaz od pocetka do kraja, reaguje samo x1.
Pokušao sam da za probu šaljem POR (power on reset) ili start konverzije kao GENERALL CALL na i2c i rezultati su isti.

Nekako mi deluje da Microchip ne može da se meri sa drugim proizvodacima osim što ih sve prevazilazi u zaradivanju para.

Molim vas moje drage kolege i koleginice da date svoje mišljenje o ovom problemu.
Svakako je moguce da vi vidite nešto što sam ja prevideo.

Još nešto, U datasheet-u piše da MCP3422 slave postavlja svoj SDA (0 ili 1 šta vec treba) na SILAZNU CLK ivicu ali to nije baš tako u I2C standardu vec se dešava 5 mikrosekundi kasnije (ili možda grešim?).


Nestrpljivo ocekujem vaša mišljenja i sugestije...
[ bogdan.kecman @ 22.09.2015. 12:19 ] @
ja sam koristio MCP3422 (tj 3424 ali isti klinac) vise puta i bilo je
toliko uneventful da sam morao sad da odem na net da vidim datasheet dal
je to taj ad ... to je meni prosto radilo ..
elem, ja za i2c uvek imam isti put za debag
1. uklonis sve ostalo sa i2c bus-a da bi bio siguran
2. okacis vece ili manje otpornike za pull-up
3. sklonis bitbanging iz price i koristis hw i2c (na primer buspirate
ako nemas neki svoj)
4. kad to sve tako radi onda u svoj kod na svoju plocicu vratis sve to i
zabodes skope i gledas sta se desava

za pocetak, posalji snimak (sa scopa) tog jednog ciklusa citanja koji ti
ne radi

a sto se mcp-a tice, uvek kad mi nesto sa mcp-om nije radilo ispostavilo
se da je greska do mene a ne do njih (za razliku od atmela i ti-a gde
sam naletao na njihove bagove)
[ goran_68 @ 22.09.2015. 12:31 ] @
Možda da proveriš ovaj tvoj masteracknolidge. Da ga slučajno on ne vidi kao NAK. Ne pada mi ništa drugo ovako na pamet. Koji ti je konfiguracioni bajt?
[ bogdan.kecman @ 22.09.2015. 12:36 ] @

Code:

//init
    I2CbeginTrans( ADDR );
    I2Cwrite( 0b10110110 ); //ch1, 16bit
    I2CendTrans();

//read
    I2Creq( ADDR, 3);
    i1 = I2Cread();
    i2 = I2Cread();
    i3 = I2Cread(); //ne koristi se za 16bita
    long result = i1 << 8 | i2;
    if (result > 32768) result = 65535L - result;


evo ti c/p nekog mog koda koji radi
[ bogdan.kecman @ 22.09.2015. 12:49 ] @
Citat:
mbm:
x1 koji je promenljiv ako menjam ulazni napon na odabranom ulazu (mcp3422 ima 2)
x2 0xFF
x3 0xFF
pa i x4 ako je citano uvek je 0xFF.


ovo znaci da si posle citanja X1 poslao "problem", tj nisi radio klasican repeatable read i sve do kraja sto citas ti je FF posto te deviceovi na busu ignorisu

Citat:
mbm:
Još nešto, U datasheet-u piše da MCP3422 slave postavlja svoj SDA (0 ili 1 šta vec treba) na SILAZNU CLK ivicu ali to nije baš tako u I2C standardu vec se dešava 5 mikrosekundi kasnije (ili možda grešim?).


gde u datasheet-u? ovo sto si napisao nema bas nekog smisla, nigde u standardu niko ne spominje tih 5us koliko se ja secam... a citao sam ga mnogo puta..

e sad u dataseet-u FIGURE 5-3 - master->slave, koliko ja vidim on cita na uzlaznoj ivici a ne na silaznoj ivici SCL-a mada validan i2c ima i na silaznoj i na ulaznoj ivici validan podatak, tranzicija se desava samo dok je SCL dole a tebe realno ne zanima dal ga on cita na uzlaznoj ili silaznoj ivici

FIGURE 5-4 koji tebi pravi problem ne spominje takodje ni silaznu ivicu ni 5us

ti posle svakog primljenog bajta mora posaljes ACK i na kraju NACK, ako si poslao NACK 342x se ugasio i zato dobijas 0xFF

zakaci scope, ja sumnjam da je problem u tvojoj bitbang funkciji
[ bogdan.kecman @ 22.09.2015. 12:59 ] @
takodje pogledaj FIGURE 5-8
i videces kako izgleda tajming ...
tranzicija SDA je dok je SCL dole, tranzicija pocinje posle Thd:dat i zavrsava se do Taa posle silazne ivice SCL
Taa (output valid from clock) je 150ns za 3.4mhz, 310ns za 1.7mhz, 1200ns za 400khz, 3750ns za 100khz

da li si zabo scope na i2c bus? da li su ti pullup-ovi odgovarajuci? kakve su tranzicije na bus-u? koja ti je brzina bus-a?
[ mbm @ 22.09.2015. 13:08 ] @
Izvanredno, odlične informacije,
mislim da će problem ubrzo biti rešen.

Ja sam svestan da sam mu sa ACK posle prvog bajta poslao problem ali je stvarno začuđujuće da drugi čipovi rade kako treba i da ne prepoznajem problem u tajmingu.
Ubrzo ću se javiti sa detaljima...
[ bogdan.kecman @ 22.09.2015. 13:16 ] @
mnogo cipova ignorise brdo i2c standarda i gledaju na njih kao na
"guidelines" a ne kao na standard, takodje brdo proizvodjaca ima svoje
ime za i2c bus i "sitne" promene ... ja sam imao problem sa nekim TI i2c
uredjajima koji ignorisu NACK, znaci ti mu posaljes nack on ignorise (tj
bole ga uvo za repeatable read dal ti saljes ack ili nack), isto tako sa
nekoliko PCF sprava, ignorisu ga skroz .. tako da zavisi gde si i na
cemu testirao taj tvoj bitbanging lib, moguce takodje da ne odradis
dovoljno brzo tranziciju iz output u input i obrnuto za pin pa te tu
nesto zezne .. ja sam pisao pre dosta godina softwersku verziju i2c
slave-a pa sam se isprakso :D .. obrati paznju da slave moze da radi
clock stretching tako da ako taj AD nije spreman da ti isporuci datu
mozda koristi stretching (po standardu bi trebao, ne secam se da li ili
ne pogledaj datasheet), ako tvoj bitbanging ne podrzava i2c clock
stretching mozes i tu da imas problem..

sto se tice tajminga, posle silazne ivice "neki" ocekuju/daju validan
SDA neko vreme (Taa vreme) i ono se razlikuje, ali ti ne treba na
to da racunas, citaj vrednosti izmedju ulazne i silazne ivice