Sari la conținut
ELFORUM - Forumul electronistilor

Esec comanda PCM1795 de catre Arduino Nano


merck

Postări Recomandate

Folosesc un Arduino Nano pentru a comanda prin SPI un DAC PCM1795. 

Liniile de cod sunt simple:

const int slaveSelectPin = 10;



void setup() {

pinMode(slaveSelectPin, OUTPUT);
SPI.begin();

SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE2)); //sau SPI_MODE0

}



void loop() {
    readRegister(18|0x80,0);

}



void readRegister(byte thisRegister, byte bytesToRead) {

digitalWrite(slaveSelectPin, LOW);

delayMicroseconds(1);

SPI.transfer(thisRegister);

SPI.transfer(bytesToRead);

digitalWrite(slaveSelectPin, HIGH);
delayMicroseconds(1);

}

 

Problema este ca nu reusesc sa citesc.

 

Forma de unda a clock-ului mi se pare bizara (nu inteleg de ce timp 625ns clock-ul ramane in High, dupa ce s-a trimis primul octet):

error.png

Si pe date am acel nivel de 1 logic intre cei doi octeti (trasa rosie). 

Daca scad frecventa pana acele 625ns devin nesemnificative, tot nu reusesc sa citesc.

 

00.png

Dupa cum se observa, acel nivel de 1 logic foarte ingust apare (trasa rosie) si daca am micsorat frecventa la 125kHz.

 

Am incercat toate cele 4 moduri de clock:

10.png

 

in cele de mai jos nu mai apare acel nivel 1 logic foarte ingust 

01.png

 

11.png

 

In documentatia lui PCM 1975 doar atat arata la formele de unda:

SPI.png

 

https://www.ti.com/lit/ds/sles248a/sles248a.pdf?ts=1643545241911&ref_url=https%3A%2F%2Fwww.google.com%2F

 

Ce gresesc?

Editat de merck
Link spre comentariu
  • Răspunsuri 79
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

15 minutes ago, merck said:
readRegister(18|0x80,0);

Trebuia sa ai 0x98 pe oscilograma. Tu ai 0x92. De ce ?

LE: Scuze, acum a vazut. 18 este in decimal. Este ok. 0x92

 

Editat de Vizitator
Link spre comentariu

Din grafic pare ca acea microsecunda intarziere dintre slavepin=LOW si inceput transfer pare foarte asemanatoare cu durata de 625ns dintre octeti.
Nu cumva este ceva gresit la clock/delay ?


 

Link spre comentariu

Da, doresc sa citesc registrul 18.

 

P.S. DAC-ul audio PCM1795 merge pe 24 de biti by default si vreau sa il setez pe 32 de biti. Si daca modific (rescriu) valoarea registrului 18 trebuie sa il citesc sa ma conving ca am reusit sa il setez pe 32 de biti. 

Editat de merck
Link spre comentariu

SPI trimite 8 biti ( 1 byte) si tu ai apelat de 2 ori  "SPI.transfer" consecutiv, in spate acele functii incarca niste registrii in modulul SPI care necesita timp,  de acolo si acel delay de 625ns. Se apeleaza primul SPI.transfer si se trimite primul octet iar dupa ai acel delay de 625ns care nu este altceva decat timpii necesari apelarii urmatorului SPI.transfer.

Pe tine treaba asta nu te intereseaza, datele se trimit si se citesc file pe "falling edge" fie pe "rising edge" adica in momentul in care se face tranzitia HIGH-LOW sau LOW-HIGH, cat timp ramane clock-ul LOW sau HIGH nu are nici o importanta.

 

Nu cunosc acel DAC insa cu siguranta lipseste ceva, probabil trebuie trimis inca ceva sau in alta forma ca sa intre in modul de citire, nu ai gasit vro librarie gata facuta pentru DAC-ul asta sa nu iti mai bati capu ?

 

 

Editat de Bandi Szasz
Link spre comentariu

Atunci scrie ceva de genul:

result = SPI.transfer(bytesToRead);

Si pune analizorul pe MISO daca vrei sa vezi rezultatu` sau tipareste variabila result.
Validarea valorii se face pr fronturile determinate de MODEx.

 

Al doilea transfer genereaza cela 8 clock-uri pt. citirea rezultatului....

Editat de informer
Link spre comentariu

Da, SPI trimite un octet si DAC-ul cere 2 octeti pentru o comanda de scriere/citire. Delay-ul de 625ns dintre doua apelari ale functiei SPI.transer banuiesc ca este asa cum zici tu necesar incarcarii registrilor dar de ce imi modifica si iesirea in 1 logic? Nu-mi dau seama daca nu cumva DAC-ul este deranjat de acel 1 logic parazit. 

 

 

6 minutes ago, informer said:

Atunci scrie ceva de genul:

result = SPI.transfer(bytesToRead);

Am incercat asa la inceput si rezultatul afisat a fost 0 sau 255 (am pus afisare in binar si era 11111111) dupa cum ii tuna lui.Deci aveam carnati de 0 pe coloana, apoi 14-19 valori de 11111111 si tot asa aleator. Asta ma determinat sa pun analizorul sa vad poate nu-s formele de unda corecte. 

6 minutes ago, informer said:

Si pune analizorul pe MISO daca vrei sa vezi rezultatu

Este pus si este 0xFF 0xFF (este trasa galbena)

Editat de merck
Link spre comentariu
13 minutes ago, Bandi Szasz said:

"SPI.transfer" consecutiv

Pare ok conform pdf.
Primul octet este adresa care trebuie citita, iar urmatorul byte este 0x00 pentru a genera clock-ul pentru citire valoare de la slave.
 

Link spre comentariu

Ciudat este ca din oscilogramele lui @merck pare ca slave trimite date pe perioada (primul octet) cand trebuia sa astepte sa primeasca adresa.
Trebua ca abia apoi , pe timpul cand master trimite clock prin octetul 0x00, sa trimita si slave data.

 


 

Editat de Vizitator
Link spre comentariu
Acum 12 minute, Liviu.Mihaiu a spus:

Ciudat este ca din oscilogramele lui @merck pare ca slave trimite date pe perioada (primul octet) cand trebuia sa astepte sa primeasca adresa.

Eu nu vad sa trimita date... daca ultima tresa este legata la MISO vad ca pastreaza acelasi nivel.

 

Pe de alta parte comportamentul este ca si cand cei 8 biti trimisi cand se transfera 0x00 ar fi pe 1.
Eu as incerca sa scriu intai ceva, sa fiu sigur ca am ceva diferit de 0xFF si dupa sa incerc sa citesc....

 

L.E. M-am uitat si eu in datasheet... dupa mine valoarea returnata de a doua apelare a lui transfer() ar trebui sa fie continutul registrului... si ala, cel putin default n-ar trebui sa fie pe 0xFF. Slave-ul asta SPI ii ca si cand n-ar fi acolo... :)
 

Editat de informer
Link spre comentariu
7 minutes ago, informer said:

Eu as incerca sa scriu intai ceva, sa fiu sigur ca am ceva diferit de 0xFF si dupa sa incerc sa citesc....

Incerc acum, insa ori pun din doua capturi ori una mai inghesuita ca sa incapa si scrierea si citirea.

Hm, am cuplat analizorul si nu mai citeste 0 ci 0xFF:

 

 

Screenshot-2022-02-13-at-20-32-45.png

scot analizorul si iar tipareste 0.

Revin imediat cu scrierea si citirea consecutiva.

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