Forum: Mikrocontroller und Digitale Elektronik ATMEGA -> DAC SPI Problem


von Ro B. (ro_b)


Angehängte Dateien:

Lesenswert?

Seid gegrüßt,

im Rahmen eines Projektes beschäftige ich mich derzeit mit der 
Ansteuerung eines AD5624R mit Hilfe eines ATmega168 über die SPI 
Schnittstelle.

An sich soll das Ganze ja sehr einfach gehen mit SPI, jedoch beiße ich 
mir derzeit einwenig die Zähne daran aus.

Die Signale auf den SPI bekomme ich schon (mittels Oszi überprüft), aber 
eine Reaktion seitens des DAC bleibt leider aus.

Die beiden Bilder zeigen das Oszibild für eine SPI Übertragung. Einmal 
CLK+Data und einmal SS+Data.

Hier nun vllt die Codeschnipsel, die jeden interessieren sollten:
1
void PORTS_init() {
2
  DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5);      // LED , SPI::MOSI/CLK
3
  DDRC |= (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4);  // SPI::SS1...4 outputs
4
  PORTC |= (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4);  // all high
5
}
1
void SPI_MasterInit(void) {
2
  SPCR |= (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0) | (0<<CPOL) | (0<<DORD) | (1<<CPHA);
3
}
1
void SPI_Master_to_DAC_send(uint8_t mode, uint8_t dac, uint16_t wert) {
2
  
3
  uint8_t byte0 = 0x0;
4
  uint8_t byte1 = 0x0;
5
  uint8_t byte2 = 0x0;
6
  char dac_buf[128];
7
8
  switch( mode ) 
9
  {               
10
    case 0: byte0 |= 0x0; break;  // write to input register n
11
    case 1: byte0 |= 0x8; break;  // update dac register n  
12
    case 2: byte0 |= 0x10; break;  // write to input register n, update all
13
    case 3: byte0 |= 0x18; break;  // write to and update dac channel n
14
  }
15
  switch( dac ) 
16
  {                 
17
    case 0: byte0 |= 0x0; break;  // DAC A
18
    case 1: byte0 |= 0x1; break;  // DAC B
19
    case 2: byte0 |= 0x2; break;  // DAC C
20
    case 3: byte0 |= 0x3; break;  // DAC D
21
    case 4: byte0 |= 0x7; break;  // ALL DAC    
22
  }
23
24
  byte1 = (wert>>4);
25
  byte2 = (wert<<4);
26
27
  PORTC &= ~(1<<PC4);
28
  SPI_MasterSend( byte0, byte1, byte2 );
29
  _delay_us(5);
30
  PORTC |= (1<<PC4);
31
  sprintf( dac_buf, "## SYSTEM ## DAC Data send (%d)(%d[%d][%d])\n\r", byte0,wert,byte1,byte2);
32
  UART_puts(dac_buf);
33
}
1
void SPI_MasterSend(char cData0, char cData1, char cData2) {
2
  
3
  cli();
4
  SPDR = (uint8_t)cData0; 
5
  while(!(SPSR & (1<<SPIF)));
6
  SPDR = (uint8_t)cData1; 
7
  while(!(SPSR & (1<<SPIF)));
8
  SPDR = (uint8_t)cData2; 
9
  while(!(SPSR & (1<<SPIF)));
10
  sei();
11
}

Initialisieren tu ich den DAC mit einem kompletten Reset, einschalten 
der internen Referenz sowie setzen des LDAC für alle Outputs auf 1.

Sende ich nun ein SPI_Master_to_DAC_send() mit einem Wert, so passiert 
nichts. Habe nun schon alle Modi durchprobiert.

Kann mir jemanden eine Hilfestellung liefern?

Beste Grüße,
Robert

von Manfred S. (mandinice)


Lesenswert?

Hallöchen

Stimmen die Einstellung für die Auswertung der Datenbit bei steigender 
oder fallender Flanke von CLK ?

hmg
Mandi

von Ro B. (ro_b)


Lesenswert?

Ich habe alle möglichen SPI Modi ausprobiert. Standard für den DAC 
sollte Mode 1 sein, oder? Da der DAC ja seine Register updated, wenn die 
24 Flanke fällt. So zumindest habe ich es aus den Datenblättern 
herausgelesen.

Mode 1 sollte Shift-edge rising und Capture-edge falling sein. Inwiefern 
nun CPHA Auswirkungen hat, weiß ich leider nicht. =(

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.