Okay. Das habe ich nun versucht.
Mein SPI schaut wie folgt aus:
Code:
void SPI_MasterInit(void) {
// Set /SS, MOSI and SCK output, all others input
DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5); // SS, MOSI, CLK are Outputs
//PORTB &= ~(1<<PB2); // LED on (PB2 low)
DDRC = (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4); // SPI::SS1...4 outputs
PORTC = (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4); // all high
// Enable SPI, Master, MSB first, SPI Mode 1, set clock rate fck/128
SPCR |= (1<<SPE) | SPI_MSB_1 | (1<<MSTR) | SPI_MODE_0 | SPI_SPEED_128;
}
Code:
void SPI_MasterSend(char high, char mid, char low) {
PORTB |= (1<<PB2); // SS is set high, effects that LED is off
cli();
_delay_us(5);
SPDR = high;
while(!(SPSR & (1<<SPIF)));
SPDR = mid;
while(!(SPSR & (1<<SPIF)));
SPDR = low;
while(!(SPSR & (1<<SPIF)));
_delay_us(5);
sei();
PORTB &= ~(1<<PB2); // SS is set low, effects that LED is on
}
Code:
void SPI_Master_to_DAC_send(uint8_t mode, uint8_t dac, uint16_t wert) {
uint8_t byte_high = 0x0;
uint8_t byte_mid = 0x0;
uint8_t byte_low = 0x0;
char dac_buf[128]; // Buffer für Konsolenausgabe-String
switch( mode )
{
case 0: byte_high |= 0x0; break; // write to input register n
case 1: byte_high |= 0x8; break; // update dac register n
case 2: byte_high |= 0x10; break; // write to input register n, update all
case 3: byte_high |= 0x18; break; // write to and update dac channel n
}
switch( dac )
{
case 0: byte_high |= DAC_A; break;
case 1: byte_high |= DAC_B; break;
case 2: byte_high |= DAC_C; break;
case 3: byte_high |= DAC_D; break;
case 4: byte_high |= DAC_ALL; break;
}
byte_mid = (wert>>4);
byte_low = (wert<<4);
PORTC &= ~(1<<PC1);
SPI_MasterSend( byte_high, byte_mid, byte_low );
PORTC |= (1<<PC1);
sprintf( dac_buf, "## SYSTEM ## DAC Data send (%d)(%d[%d][%d])\n\r", byte_high,wert,byte_mid,byte_low);
UART_puts(dac_buf);
}
Code:
#define SPI_MODE_0 ( (0<<CPOL) | (0<<CPHA) )
#define SPI_MODE_1 ( (0<<CPOL) | (1<<CPHA) )
#define SPI_MODE_2 ( (1<<CPOL) | (0<<CPHA) )
#define SPI_MODE_3 ( (1<<CPOL) | (1<<CPHA) )
#define SPI_MSB_1 ( (0<<DORD) )
#define SPI_LSB_1 ( (1<<DORD) )
#define SPI_SPEED_64 ( (1<<SPR1) | (0<<SPR0) )
#define SPI_SPEED_128 ( (1<<SPR1) | (1<<SPR0) )
Lesezeichen