Forum: Compiler & IDEs DA-Wandler MAX5354 über SPI


von Stefan T. (stefan90)


Lesenswert?

Hallo zusammen,
ich bin gerade dabei mit einem Mega8 den MAX5354 (DA-Wandler) über SPI 
(habe noch keine Erfahrungen mit dem Bus) anzusteuern. Doch das 
funktioniert nicht so wie es sollte.

Hier erstmal der Code:
1
#include <stdlib.h>
2
#include <avr/io.h>
3
4
#define MOSI   PB3
5
#define SCK  PB5
6
#define MISO   PB4
7
#define SS  PB2
8
9
void SPI_Master_TransmitInit(void)
10
{
11
  /* Set MOSI, SS and SCK output, all others input */
12
  DDRB |= (1<<MOSI) | (1<<SCK) | (1<<SS);
13
  DDRB &= ~(1<<MISO);
14
  PORTB |= (1<<SS);
15
  /* Enable SPI, Master, f = FCPU/16 */
16
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
17
}
18
19
void SPI_MasterTransmit(unsigned long daten, unsigned long daten1)
20
{
21
  PORTB &= ~(1<<SS);
22
  SPDR = daten;
23
  while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
24
  SPDR = daten1;
25
  while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
26
  PORTB |=(1<<SS);
27
}
28
29
int main (void)
30
{  
31
  SPI_Master_TransmitInit();
32
  SPI_MasterTransmit(00010000, 00001000);
33
34
  return 0;
35
}

Der binär Code von SPI_Transmit sollte (wenn ich das laut Datenblatt 
richtig verstehe) heißen, dass am Ausgang 1/2*Vref anliegen sollten, bei 
5V wären das dann 2.5V. Doch es liegen immer (egal was für einen Wert 
ich da übergebe) ca. 1.0-1.2 V an.

Woran liegt das?
Hardwaremäßig sollte alles passen.

Ich wäre für Hilfen sehr dankbar.

Gruß Stefan

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>SPI_MasterTransmit(00010000, 00001000);

Ich bezweifle, dass der GCC (binäre) Zahlen in diesem Format unterstützt 
- vor allem ohne markierendes Präfix.
Du meinst damit vermutlich:
SPI_MasterTransmit(0x10, 0x08);


>void SPI_MasterTransmit(unsigned long daten, unsigned long daten1)

Die SPI-Daten können eh nur 8bit breit sein - unsigned char reicht 
völlig.

von Stefan T. (stefan90)


Lesenswert?

Danke für die Antwort!

Jetzt seh ich den dummen Fehler auch!

entweder schreib ich
SPI_MasterTransmit(0b00010000, 0b00001000);
oder eben
SPI_MasterTransmit(0x10, 0x08);

Jetzt funktionierts auch, jedoch hab ich immer nur 5V an OUT
und wenn ich 2 mal 0x00 sende, dann wieder die 1.2V

Das verstehe ich dabei nicht, auch wenn ich Vref ändere auf z.B 3.3V 
habe ich noch immer 5V

Wie ist das möglich? Ist da etwas an meiner Hardware falsch?
muss ich den AD-Wandler belasten, damit da die programmierte Spannung 
anliegt?

Gruß
Stefan

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.