merck Postat Februarie 15, 2022 Autor Partajează Postat Februarie 15, 2022 Da, pinii sunt legati la masa (sunati cu aparatul de masura). Nu ma grabesc. Da, este si un exemplu cu available ( Wire.available() ) dar nu l-am folosit pentru ca doar am vrut sa vad daca adresa de 7 biti se completeaza cu 1 la coada cand doresc sa fac o citire. E clar ca la mine e o problema hardware cu PCM1795 de primesc NACK. mai iau maine la sunat montajul. Nu prea inteleg eu ce este cu mesajul asta de eroare in analizor: Eu din ce vad, am conditia de start (tranzitie din 1 in 0 pe data cat timp clock-ul este in 1 logic) Am gasit o placa facuta cu multi ani in urma cu un DIR9001 + PCM179x si ar trebui sa pun PCM1975 pe ea (ca totate PCM197x sunt indentice la pini) ca sa am toate semnalele si sa ma conectez doar la pinii de comanda. Ieri fara ajutorul tau asta as fi facut insa muream prost si nu stiam de ce mergea. Una este sa vii din aproape in aproape si sa descoperi care-i buba si alta este sa functioneze un montaj per ansamblu dar sa nu-l stapanesti in detaliu. De aia am si zis sa fac si I2C pe PCM1975 ca sa stiu ca bifez totul. Pot bine merci sa las balta I2C-ul dar ma roade . Link spre comentariu
informer Postat Februarie 15, 2022 Partajează Postat Februarie 15, 2022 (editat) Pai da, si eu sunt asa, imi place sa fie totu` clar... Nu stiu daca aia-i problema (cu available()), pe mine ma enerveaza libraria asta I2C de la Arduino. In mod normal, ca sa citesti trimiti start - adresa device scriere - adresa registru - restart - adresa device citire - citesti-stop. Era mai complicat dar era conform protocolului... ei au bagat "request tralala" care io habar n-am exact ce face sau ce tre` sa faci inainte ori dupa... banuiesc ca scrie pe undeva... :). L.E. Mai ar fi ceva... tu faci o scriere acolo si dupa imediat o citire... nu-s sigur ca merge asa... ia incearca urmatoru` cod: Wire.beginTransmission(0b01001100); // adresa PCM1795 pe 7 biti este 1001100 - am pus cei doi pini la masa Wire.write(byte(0x12)); //adresa registrului 18 Wire.write(byte(0x50)); //o valoare oarecare care vreau sa o inscriu Wire.endTransmission(); // stop transmitting Wire.beginTransmission(0b01001100); // adresa PCM1795 pe 7 biti este 1001100 - am pus cei doi pini la masa Wire.write(byte(0x12)); //adresa registrului 18 Wire.endTransmission(); // stop transmitting Wire.requestFrom(0b01001100, 1); //vreau sa testez citirea Wire.endTransmission(); Editat Februarie 15, 2022 de informer Link spre comentariu
Elison Postat Februarie 15, 2022 Partajează Postat Februarie 15, 2022 Wire, foloseste adresarea pe 7 biti(bitii superiori ai unei adrese de 8 biti), deci adresa corecta cu cei doi pini pusi la masa este 1001100.De bitul zero(R/W) se ocupa compliatorul in functie de ce se face in cod, scriere sau citire. Link spre comentariu
informer Postat Februarie 15, 2022 Partajează Postat Februarie 15, 2022 (editat) Acum 14 minute, Elison a spus: Wire, foloseste adresarea pe 7 biti(bitii superiori ai unei adrese de 8 biti), deci adresa corecta cu cei doi pini pusi la masa este 1001100.De bitul zero(R/W) se ocupa compliatorul in functie de ce se face in cod, scriere sau citire. Nu stiu daca e asa... uite ce scrie la descrierea librariei Wire: Eu inteleg de aici ca ceea ce dai tu functiei ca parametru este o adresa de la 8 la 127... sau nu-i asa? Editat Februarie 15, 2022 de informer Link spre comentariu
merck Postat Februarie 16, 2022 Autor Partajează Postat Februarie 16, 2022 16 hours ago, Elison said: Wire, foloseste adresarea pe 7 biti(bitii superiori ai unei adrese de 8 biti), deci adresa corecta cu cei doi pini pusi la masa este 1001100.De bitul zero(R/W) se ocupa compliatorul in functie de ce se face in cod, scriere sau citire. Daca agaugi un 0 la coada si trimiti 10011000 uite ce se trimite: deci iti ia doar ultimii 7 biti (0011000) primul bit fiind "aruncat la gunoi". Se vede ca si la citire si la scriere am 0x18(001100) + 0 in coada la scriere sau +1in coada la citire. Deci se preiau doar ultimii 7 biti din octetul trimis ca adresa. cand 01001100 este corect (ajunge 10011000): mai sus am lucrat doar pe doua secvente de scriere, dar mai jos este screire + citire sa se vada ca apare si 1 in coada (10011001): n-am mai pictat pe ea 0 si 1. Am verificat pull-up-ul legand la masa si ambele linii de clock si de date ramana in LOW (deci rezistorii de 1,2Kohmi sunt ok). Am pus inapoi firele pentru configuratia SPI si merge PCM1975, deci e o buba si nu o vad. Link spre comentariu
informer Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 Ai incercat codul pe care ti l-am pus mai sus? Link spre comentariu
nico_2010 Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 Incearca asa: (PCM1975address << 1) // se poate ca bitul R/W sa fie adaugat in librarie si trebuie sa i se faca loc cumva si vezi cum apare pe analizor. Mi s-a intamplat ceva similar cand incercam sa comand BME280 pe I2C si nu intelegeam ce are. Dpa ce am folosit solutia de mai sus a mers. Link spre comentariu
Vizitator Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 (editat) Asa cum zice @nico_2010, nu trebuie sa adaugi tu bitul R/W. Transmisia efectiva incepe cand apelezi Wire.endTransmission() care pune bitul 0 pe valoarea 0 (write) . Si atentie, face si shiftarea adresei trimise cu beginTransmission(). Adica: // build sla+w, slave device address + w bit twi_slarw = TW_WRITE; twi_slarw |= address << 1; Deci trebuie sa mearga cu codul postat mai sus de @informer Editat Februarie 16, 2022 de Vizitator Link spre comentariu
informer Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 Domnilor, daca va uitati pe diagrama de la analizor de pe pagina anterioara, adresa I2C este corecta, functia la care i se da adresa pe 7biti stie s-o shift-uiasca o pozitie la stanga si sa adauge bitul conform operatiei, NU este nevoie s-o faci "de mana". @merckincearca te rog codul pe care l-am pus, cu operatia de scriere separata de operatia de citire, sunt curios. Link spre comentariu
merck Postat Februarie 16, 2022 Autor Partajează Postat Februarie 16, 2022 1 hour ago, informer said: Ai incercat codul pe care ti l-am pus mai sus? Da, nu merge. Link spre comentariu
informer Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 (editat) Acum 11 minute, merck a spus: Da, nu merge. Damn.... Poti sa pui te rog diagramele, daca se poate si pt. operatia de scriere si pt. cea de citire care urmeaza? Varianta cu available(), ca sa fim ortodocsi Wire.beginTransmission(0b01001100); // adresa PCM1795 pe 7 biti este 1001100 - am pus cei doi pini la masa Wire.write(byte(0x12)); //adresa registrului 18 Wire.write(byte(0x50)); //o valoare oarecare care vreau sa o inscriu Wire.endTransmission(); // stop transmitting Wire.beginTransmission(0b01001100); // adresa PCM1795 pe 7 biti este 1001100 - am pus cei doi pini la masa Wire.write(byte(0x12)); //adresa registrului 18 Wire.endTransmission(); // stop transmitting Wire.requestFrom(0b01001100, 1); //vreau sa testez citirea if(Wire.available()){ int x = Wire.read(); } Editat Februarie 16, 2022 de informer Link spre comentariu
merck Postat Februarie 16, 2022 Autor Partajează Postat Februarie 16, 2022 1 hour ago, informer said: Damn.... Poti sa pui te rog diagramele, daca se poate si pt. operatia de scriere si pt. cea de citire care urmeaza? Varianta cu available(), ca sa fim ortodocsi Eu cred ca este tot ceva hardware. Am pus pull-up la 3,3V la 5V, am pus aia doi pini de adresa la GND la 3,3V la 5V nimic. Link spre comentariu
informer Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 Hmmm... deci n-ai ACK nici pe scriere nici pe citire... cre` ca iar tre` citit datasheet-u` Link spre comentariu
merck Postat Februarie 16, 2022 Autor Partajează Postat Februarie 16, 2022 Da n-am ACK. Ma bag la citit pdf-ul. Link spre comentariu
informer Postat Februarie 16, 2022 Partajează Postat Februarie 16, 2022 Acum 5 minute, merck a spus: Da n-am ACK. Ma bag la citit pdf-ul. Ce frecventa SCK folosesti? Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum