PIC->DAC eller: Lång färd mot mål....

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

PIC->DAC eller: Lång färd mot mål....

Inlägg av JimmyAndersson »

Upptäckte att jag beställt fel DAC'ar. De jag fick (TDA1543) är 16bitars DAC'ar på max 9.2MHz och har en seriell ingång som går att köra med SPI. Min PIC18LF2320 stödjer SPI så det var bara att studera databladet och börja. Men, tyvärr har jag inte fått det att fungera. Utgången på DAC'en ger bara ca 1v ut oavsett vad jag skickar in.
Något är tokigt med andra ord. DAC'en blir dessutom aningen varm, även om jag inte kopplar något på utgången... Har testat med en likadan DAC, men det är samma sak där.

Så här har jag kopplat:
(PIC --> DAC)
SCK (Serial clock) --> BCK (Bit Clock Input)
SDO (Data ut) --> DATA (Data input)

DAC'en har två "kanaler". Om WS-pinnen är låg så används "Left-kanalen", är WS hög så används "Right-kanalen". Så den har jag satt låg och kopplat Left-utgången till en OP-förstärkare. (Har även testat med mätinstrumentet direkt på DAC'ens Left-utgång, det var då jag fick 1v oavsett vad som skickades in från PIC-kretsen. Har även testat Right-kanalen, med samma resultat.)

Lite kod kanske? :) (MikroBasic som vanligt....)

Kod: Markera allt

program DACtest

'En liten test som skickar ut $00 och $FF till TDA1543 (DAC)
'Använder MSSP (SPI)


TRISC.3=0 ' Utgång på SCK -Serial Clock-
TRISC.4=1 ' Ingång på SDI -Data IN-  Används inte i detta test...
TRISC.5=0 ' Utgång på SDO -Data UT-

SSPSTAT.7=0 ' Input data sampled at the middle of data output time. Men jag skickar bara ut data i detta test, så den behövs inte egentligen.
SSPSTAT.6=1 ' Data tas emot on rising edge of SCK. Den här behövs egentligen inte heller när jag bara skickar ut data.

SSPCON1.7=0 ' Ingen WriteCollisionDetect
SSPCON1.6=0 ' Ingen ReceiveOverflowIndicator
SSPCON1.5=1 ' Enable serieport och SCK, SDo, SDI och SS
SSPCON1.4=0 ' Idle state för clock är Låg
SSPCON1.3=0 ' Master mode, clock = Fosc/4 ' Har testat olika "Fosc" utan skillnad.
SSPCON1.2=0 ' Master mode, clock = Fosc/4
SSPCON1.1=0 ' Master mode, clock = Fosc/4
SSPCON1.0=0 ' Master mode, clock = Fosc/4

'MSSP består av ett transmitt/receive shiftregister (SSPSR) och ett Buffer register (SSPBUF).
'SSPSP kan inte nås, däremot SSPBUF.
'SSPSTAT kan däremot läsas av för att se "vad som händer".

main:
do
    SSPBUF = $0000  ' Skicka ut nada/zip/zero/inget...
    delay_ms(500)
    SSPBUF = $FFFF  ' Skicka ut alla 16bitar. Har även testat med 8bitar.
    delay_ms(500)
loop until 0 = 1

end.
I debuggern ser allt ok ut.
Har jag förstått fel, eller borde det fungera?


edit: Ändrat rubriken lite.. :)
Senast redigerad av JimmyAndersson 24 oktober 2005, 23:11:03, redigerad totalt 2 gånger.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

TDA1543 är väl en audio-DAC, och formatet den använder är I2S inte SPI.

WS-ingången växlar mellan kanalerna, men jag är ganska säker på att den *måste* växla hela tiden och man måste skicka data till båda kanalerna hela tiden i en viss takt.

Jag kan ha fel, om du läst nånstans att den ska funka så som du beskriver så kanske det stämmer.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> har en seriell ingång som går att köra med SPI...

Hur vet du det ? Var står det ?

> så det var bara att studera databladet och börja.

Det står inget om SPI där. Däremot verkar ju dataformatet i sig ganska enkelt, så det går nog bra att "bit-banga" ut det till DAC'en. Dock knappast från Basic, det lär vara svårt att få tillräcklig hastighet.

> DAC'en blir dessutom aningen varm,

Den drar ju 50-60 mA, så lite värme bör det nog bli.

> I debuggern ser allt ok ut.

Vadå "ok" ? Ok för DAC'en ?

> Utgången på DAC'en ger bara ca 1v...

Du *har* läst databladet, eller hur ? Utgångarna är strömgeneratorer...

Slutligen, allt skulle antagligen vara mycket lättare att förstå om du kan beskriva vad det är du vill uppnå med det hela. Varför just denna DAC ?
Användarvisningsbild
Cenorpa
Inlägg: 737
Blev medlem: 11 juli 2005, 20:58:03
Ort: Stockholm | Borlänge
Kontakt:

Inlägg av Cenorpa »

Styra galvon tror jag iallafall.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Inlägg av Greve Hamilton »

Det finns ju ett SPI-bibliotek i mikrobasic, testa det.

Notera dock:
"Note: This library supports module on PORTB or PORTC, and will not work with modules on other ports."
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Tittade lite snabbt på databladet till TDA:n och nog verkar det som att I2S-bussen skulle kunna köras med SPI + en portbit för WS-signalen. Men det står inte uttryckligen att det går, nej. En snabb googling gav till handen att I2S-buss verkar ha körts från SPI i andra sammanhang, så det är nog riktigt.

Kollat det med utgången som sodjan sa ?
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Cyr: Jo TDA5143 brukar användas i audiosammanhang, men det är ju inget hinder för att den ska fungera. Snarare innebär det att den har bra signal/brusförhållande och är av bra kvalitét.



I databladet för DAC'en står det I2S-buss, men precis som Vfr skriver så ska man kunna köra den med SPI + WS-signalen.



Greve Hamilton: Jepp, jag har provat SPI-biblioteket i MikroBasic (det stämmer med min PIC-krets)




sodjan:
>> har en seriell ingång som går att köra med SPI...
>Hur vet du det ? Var står det ?

Att ingången är seriell är inte så svårt att räkna ut: Den har EN pinne för DataInput...
Sedan att den går att köra med SPI vet jag för att jag sett flera exempel där man har kopplat en mikroprocessor till en I2S-krets. Dessutom såg jag att det bode fungera när jag jämfört I2S med SPI.

>> så det var bara att studera databladet och börja.
>Det står inget om SPI där.

Nä, men om citerat hela meningen så hade det klarnat:
"Min PIC18LF2320 stödjer SPI så det var bara att studera databladet och börja." :)


>> I debuggern ser allt ok ut.
>Vadå "ok" ? Ok för DAC'en ?

Jag visste inte att DAC'en hade en debugger... Jag menade debuggern i MikroBasic eftersom det är det jag programmerat i. Men det vore smidigt om DAC'en hade en debugger.


>> Utgången på DAC'en ger bara ca 1v...
>Du *har* läst databladet, eller hur ? Utgångarna är strömgeneratorer...

Har du *läst* hela mitt inlägg? :)
"(Har även testat med mätinstrumentet direkt på DAC'ens Left-utgång, det var då jag fick 1v oavsett vad som skickades in från PIC-kretsen. Har även testat Right-kanalen, med samma resultat.)"

Utsignalen ska variera beroende på vad man skickar in. Både spänningen och strömmen är samma oavsett vad jag skickar in på DataIN. Eftersom jag testat med mätinstrumentet så har jag inte begränsat mig till att bara mäta spänningen. Jag vill ju hitta en lösning och har förstås gjort mitt bästa i jakt på ett resultat. Så jag har naturligtvis mätt strömmen också. Vad tror ni om mig? :)



>Slutligen, allt skulle antagligen vara mycket lättare att förstå om du kan
>beskriva vad det är du vill uppnå med det hela. Varför just denna DAC ?

Det var den första meningen jag skrev i tråden: "Upptäckte att jag beställt fel DAC'ar." Så istället för att bara låta dem ligga så tänkte jag helt enkelt försöka lära mig. Jag brukar annars använda DAC'ar med åtta ingångar eftersom det är lättare, men eftersom jag ändå hade dessa (TDA1543) så var det ett bra tillfälle att lära mig.


Tyvärr känner jag mig inte ett dugg klokare. Man blir oftast inte det av att svara på felciteringar. :roll:

-Jag behöver kort sagt fler tips. Eller ska jag köpa nya DAC'ar? De är inte billiga.... Frågade efter tips på DAC'ar i en annan tråd, men fick tyvärr inte så många svar. Mest frågor liknande varför jag behövde en DAC som var snabbare än 9.2MHz....
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

JimmyAndersson skrev:"(Har även testat med mätinstrumentet direkt på DAC'ens Left-utgång, det var då jag fick 1v oavsett vad som skickades in från PIC-kretsen. Har även testat Right-kanalen, med samma resultat.)"
Eftersom du inte skrev någonting om att du gjort just strömmätning, utan bara presenterade spänningsvärden, så är det faktiskt inte helt lätt att vara säker på att du har gjort det. Och vi vet inte lika bra som du själv vad du har för kunskaper och erfarenheter av detta. Det är inte alla som är vana vid strömgenererande DAC:s och det misstaget är det många som har gjort. Det var ett förslag på möjligt fel.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, vi tittar igen... :-)

Som jag förstår det så använder DAC'en växlingen mellan left/right (WS) för att synka starten av en nytt 16-bitars värde. D.v.s att det sannolikt inte går att lägga WS fast hög eller låg, utan måste växla hela tiden. Annars vet inte DAC'en vad som är vad.

Enligt databladet ser det även ut som om dataströmmen är förskjuten en bit jämfört med WS. D.v.s att LSB för föregående kanal kommer direkt *efter* att WS har bytt "kanal", och sedan kommer MSB för den nya kanalen, o.s.v. Se fig 5 och 6. Stämmer även överens med detta dokument : http://www.semiconductors.philips.com/a ... I2SBUS.pdf .

Hur ska du synka switchningen av WS signalen till just före sista biten i andra byten ?

Din tolkning av "SSPSTAT.6" stämmer inte med mitt datablad (även om din inställning verkar OK, det är kommenteren i koden som inte verkar stämma).

> SSPBUF = $FFFF

SSPBUF är 8 bitar...

Ett problem kan vara att få en "jämn" 16-bitars dataström, du måste kolla att de första 8 bitarna är sända innan SPFBUF "laddas om" med nästa 8 bitar.

Jag har även googlat runt och försökt hitta någon beskrivning där man "kör" I2s från SPI, men inte lyckats. Det vore intressant med en länk till någon av de källor som nämns i tidigare inlägg. Jag är nyfiken på hur man löser kopplingen melan de två byte'en, och hur man synkar WS till datasignalen.

EDIT : Personligen tycker jag fortfarande att I2S protokollet ser så pass enkelt ut att man lika gärna kan köra det direkt från koden (bit-bang).

EDIT2: Vilken datahastighet är det som du vill köra ? Vad är det för data som PIC'en skall mata ut ? Audio ? Jag är inte säker på att denna DAC är lämplig (eller fungerar alls) för att generera "statiska" analoga värden. Den verkar bygga på att man har en kontinuerlig ström av data och en WS signal som switchar mellan kanalerna hela tiden för att synka det hela.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

sodjan skrev:Det vore intressant med en länk till någon av de källor som nämns i tidigare inlägg.
Ett exempel var det här: http://opennetcf.org/Forums/topic.asp?TOPIC_ID=1401

Visserligen finns där inte något exempel med, men man hänvisar till en driver där det körs I2S via SPI (om inte jag fattat det helt fel).

Samtidigt så låter det ju som att det kan bli problem med WS om den inte skall komma i synk med byteshiften. Jag satte mig ärligt talat inte in i det så långt att jag kollade synken gentemot WS.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Ett exempel var det här: http://opennetcf.org/Forums/topic.asp?TOPIC_ID=1401

Där nämns en I2S codec som *kontrolleras* via SPI, d.v.s att (så som jag förstår det, har inte plockat ner databladet till kretsen i fråga), att "ljudet" kommer via en I2S kanal, men kretsen styrs via ett separat SPI interface. Ganska rimligt...

Så det är (i så fall) *inte* fråga om att köra I2S trafik direkt från ett SPI interface.

Flera länkar ?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Skiljer dom på kontroll och data så verkar det ju rinligt som du säger, att det är I2S för ljudet och SPI för styrkommandon.

Tyvärr var detta den enda länken jag kunde hitta tillbaka till just nu... Nu vet jag ju inte om dom andra två länkarna jag hittade var mer värda än den här. Det var ju synd. Kunde man lösa det med SPI så hade det ju varit smidigt, även om det naturligtvis funkar med bitbang också. Beror ju på vad det är för hastighet på det som skall ut och vad det finns för mojligheter att mata egen hastighet på den där.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Japp. Det lät ju även som om Jimmy hade sett något om SPI, vi får se om han kan ge någon länk/ref.

Personligen skulle jag titta på en lite mer generell DAC, inte en audio variant.
Men å andra sidan, så vet vi (eller i alla fall inte jag) vad den skall användas till... :-)
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag får opponera mig över utsagon att signalet var mätt med mätinstrument och fortfarande visade 1 volt fastän utgången är strömtyp.

Den mätning är alltså värdelös!

Ström mäts i A, spänning mäts i V. Alltså kan systemet fungera OK men felet är hur signalen i slutändan behandlas.

Å andra sidan verkar det mycket konstigt att köra SPI på en I²C bus, är det en renodlat I²C-bus kommer det inte att fungera alls men den kan ju vara "dual-mode".
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

I2C är det inte, utan I2S.

Och I2S *är* hyffsat likt SPI, så det är väl inte omöjligt att det kan fungera.

Jag skulle satsa på en riktig SPI-DAC dock, det finns en drös man kan sampla från Maxim t.ex.

Vilka krav finns på samplingshastighet, upplösning, linjäritet osv? Vilken drivspänning? Vilken utsignal? Hur många kanaler?

Säg vad du behöver så kan jag hjälpa till att hitta en lämplig.
Skriv svar