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?
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?