AT90CAN128 ->SPI -> DA-Wandler MAX5105
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:
Code:
#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?