Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zum SPI-DAC / MCP 4812-E/P


von Hans-J. A. (modellbahner71)


Lesenswert?

Hallo miteinander,
ich hätte da mal eine Verständnisfrage zu einem SPI-DAC
vom Type "MCP 4812-E/P" im Datenblatt steht:
erst CS auf Low, dann erst das High-Byte und das Low-Byte senden,
CS wieder auf High, danach LDAC auf Low und wieder auf High.

Die Frage ist, gilt diese Abfolge für jeden Kanal einzeln,
oder darf man irgendwie erst beide Kanäle senden/bestücken
und dann erst mit LDAC übernehmen?

Nähere Infos währen hilfreich.

Besten Dank für die Hilfe
MFG
Modellbahner71

von Michael U. (amiga)


Lesenswert?

Hallo,

es gibt nur ein 16Bit Empfangsregister und Bit15 entscheidet, ob mit 
LDAC DACA oder DACB gesetzt wird. Wie willst Du da also beide Kanäle 
drin unterbringen? Im Empfangsregister stehen eben die zuletzt 
geschickten Daten drin, egal, wie oft Du da was reinschreibst.

Gruß aus Berlin
Michael

von Hans-J. A. (modellbahner71)


Lesenswert?

Ok Danke für die schnelle Antwort

von Maxim B. (max182)


Lesenswert?

Hans-J. A. schrieb:
> Die Frage ist, gilt diese Abfolge für jeden Kanal einzeln,
> oder darf man irgendwie erst beide Kanäle senden/bestücken
> und dann erst mit LDAC übernehmen?

Hallo,
LDAC ist gerade dafür gedacht, um die Werte von A und B gleichzeitig zu 
OUT gingen. Wird das nicht benötigt, kann LDAC auf Null bleiben. Dann 
wird neue Wert immer nach CS=1 erneuert.

Du kannst also Wert für A übertragen, dann Impuls auf LDAC geben, so 
wird A neu und B wiederholt alten Wert, d.h. ohne sich zu ändern. Du 
kannst ebenso nur B ändern...

Ich habe bischer LDAC ummer auf GND geschaltet, da ich A und B unahängig 
nutze.

Z.B.so:
1
#define MCP4921_KANA  0
2
#define MCP4921_KANB  0x8000
3
#define MCP4921_SHDN  0x1000
4
#define PORT_CS0  PORTC
5
#define CS0    PC0
6
7
static unsigned int form_puffer_a = MCP4811_KANA | MCP4811_SHDN | 0x0400;
8
static unsigned int form_puffer_b = MCP4811_KANB | MCP4811_SHDN | 0x0400;
9
10
/*** Kanal A ***/
11
// Wert für A berechnen und in form_puffer_a speichern
12
form_puffer_a = (unsigned int)(tonform[phase_index_a] + 2048) | MCP4811_KANA | MCP4811_SHDN;
13
14
15
PORT_CS0 &= ~(1<<CS0);
16
SPDR = (unsigned char)(form_puffer_a >> 8);
17
while(!(SPSR & (1<<SPIF)));
18
SPDR = (unsigned char)form_puffer_a;
19
while(!(SPSR & (1<<SPIF)));
20
PORT_CS0 |= (1<<CS0);
21
22
/*** Kanal B ***/
23
// Wert für B berechnen und in form_puffer_b speichern
24
form_puffer_b = (unsigned int)(tonform[phase_index_b] + 2048) | MCP4811_KANB | MCP4811_SHDN;
25
26
PORT_CS0 &= ~(1<<CS0);
27
SPDR = (unsigned char)(form_puffer_b >> 8);
28
while(!(SPSR & (1<<SPIF)));
29
SPDR = (unsigned char)form_puffer_b;
30
while(!(SPSR & (1<<SPIF)));
31
PORT_CS0 |= (1<<CS0);

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.