Sari la conținut
ELFORUM - Forumul electronistilor

Esec comanda PCM1795 de catre Arduino Nano


merck

Postări Recomandate

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:

Screenshot-2022-02-15-at-20-33-25.png

Eu din ce vad, am conditia de start (tranzitie din 1 in 0 pe data cat timp clock-ul este in 1 logic)

 

Screenshot-2022-02-15-at-20-35-46.png

 

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 :57.

 

 

Link spre comentariu
  • Răspunsuri 79
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • merck

    30

  • informer

    28

  • sesebe

    4

  • nico_2010

    2

Top autori în acest subiect

Imagini postate

Pai da, si eu sunt asa, imi place sa fie totu` clar... :rade:
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 de informer
Link spre comentariu

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
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:

note.thumb.png.211820fea6752a0b030d6488e85d5cf4.png

 

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 de informer
Link spre comentariu
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:

Screenshot-2022-02-16-at-13-58-40.png

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):

Screenshot-2022-02-16-at-13-57-15.png

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):

Screenshot-2022-02-16-at-14-20-50.png

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

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

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 de Vizitator
Link spre comentariu

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
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 de informer
Link spre comentariu
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 :)

Screenshot-2022-02-16-at-17-58-58.png

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări