PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AT90CAN128 ->SPI -> DA-Wandler MAX5105



Burnhard
05.01.2007, 15:22
Moin!
Ich hoff das ist das richtige Unterforum, hab leider kein passenderes gefunden.

Ich versuche gerade einen DA-Wandler über SPI anzusprechen. Bis jetzt
leider ohne Erfol.

Der DA-Wandler erwartet ein 14-bit Wort nach dem Schema:

1 Startbit, 2 Controlbits, 3 Adressbits und 8-Datenbits.

folgendes möchte ich Übertragen:

1 0 1 0 0 0 1 1 , 1 1 1 1 1 1

Das wäre meine 14-bit Information, um das zweite Byte vollzubekommen
häng ich noch 2 0er an. Die letzten zwei Stellen sind ja eh don`t care
für den DA-Wandler(?).

Also übertrage ich 0xA3 und 0xFC mit folgendem Program:




#include <stdlib.h>
#include <avr/io.h>
#include <avr/signal.h>

#define SS PB0
#define MOSI PB2
#define SCK PB1
#define CS PE6

SIGNAL (SIG_SPI) {
return;
}

void SPI_Master_TransmitInit(void)
{
/* Set MOSI, SS und SCK als Ausgang */
DDRB |= (1<<MOSI) | (1<<SCK) | (1<<SS);
DDRE |= (1<<CS); //Chip select als Ausgang
PORTB |=(1<<SS); //Slave select High
PORTE |= (1<<CS); //Chip select High
/* Enable SPI Interrupt, Enable SPI, Master, f = FCPU/16 */
SPCR = (1<<SPIE) | (1<<SPE) | (1<<MSTR) | (1<<SPR0);
}

void SPI_MasterTransmit(void)
{
PORTE &= ~(1<<CS); //Chip select Low
PORTB &= ~(1<<SS); //Slave select Low
SPDR = 0xA3; //Erstes Byte senden
while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
SPDR = 0xFC; //Zweites Byte senden
while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
PORTE |=(1<<CS); //Chip select High
PORTB |=(1<<SS); //Slave select High
}

int main (void)
{
sei();
SPI_Master_TransmitInit();
SPI_MasterTransmit();

while(1)
return 0;
}


Nicht wundern wegen SS und CS, CS geht an den DA-Wandler, SS ist über
Widerstand auf Masse, ist Hardwaremäßig so vorgegeben.

Weiß vielleciht jemand einen Rat was faul sein könnte?

skillii
05.01.2007, 21:28
Wieso hast du den SPI Interrupt aktiviert?

Ich denke, dass hier das Problem liegt:


SPIF is cleared by hardware when executing the corresponding interrupt Handling Vector.


Dadurch bricht vermutlich folgende Schleife nie ab:


while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet

Burnhard
06.01.2007, 15:55
Also wenn ich das Program mit JTAG debugge wird das Program Zeile für Zeile durchgegangen, also die Schleife bricht ab.

Hab jetzt aber mal den Interrupt rausgenommen, geändert hat sich aber nichts. Ich kann aber auch nicht nachvollziehen ob die SPIF wirklich gelöscht wird, weil sie ja gesetzt wird sobald die Zeile SPDR = 0xFC; ausgeführt wird. Ich sehe quasi nur das sie immer gesetzt ist.

Oh man, ich verzweifel noch...

Burnhard
12.01.2007, 12:06
Hat sich erledigt!

Der DA Wandler war defekt.

Außerdem müssen an die 14 Bit Information zweimal die 0 vorne angefügt werden.

Die SPI hat funktioniert.