Seid gegrüßt,
im Rahmen eines Projektes beschäftige ich mich derzeit mit der
Ansteuerung eines AD5624R mit Hilfe eines ATmega168 über die SPI
Schnittstelle.
An sich soll das Ganze ja sehr einfach gehen mit SPI, jedoch beiße ich
mir derzeit einwenig die Zähne daran aus.
Die Signale auf den SPI bekomme ich schon (mittels Oszi überprüft), aber
eine Reaktion seitens des DAC bleibt leider aus.
Die beiden Bilder zeigen das Oszibild für eine SPI Übertragung. Einmal
CLK+Data und einmal SS+Data.
Hier nun vllt die Codeschnipsel, die jeden interessieren sollten:
Code:
void PORTS_init()
{
DDRB |= (1<<PB2)|(1<<PB3)|(1<<PB5); // LED , SPI::MOSI/CLK
DDRC |= (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4); // SPI::SS1...4 outputs
PORTC |= (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4); // all high
}
void SPI_MasterInit(void)
{
SPCR |= (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0) | (0<<CPOL) | (0<<DORD) | (1<<CPHA);
}
void SPI_Master_to_DAC_send(uint8_t mode, uint8_t dac, uint16_t wert)
{
uint8_t byte0 = 0x0;
uint8_t byte1 = 0x0;
uint8_t byte2 = 0x0;
switch( mode )
{
case 0: byte0 |= 0x0; break; // write to input register n
case 1: byte0 |= 0x8; break; // update dac register n
case 2: byte0 |= 0x10; break; // write to input register n, update all
case 3: byte0 |= 0x18; break; // write to and update dac channel n
}
switch( dac )
{
case 0: byte0 |= 0x0; break; // DAC A
case 1: byte0 |= 0x1; break; // DAC B
case 2: byte0 |= 0x2; break; // DAC C
case 3: byte0 |= 0x3; break; // DAC D
case 4: byte0 |= 0x7; break; // ALL DAC
}
byte1 = (wert>>4);
byte2 = (wert<<4);
PORTC &= ~(1<<PC4);
SPI_MasterSend( byte0, byte1, byte2 );
_delay_us(5);
PORTC |= (1<<PC4);
}
void SPI_MasterSend(char cData0, char cData1, char cData2)
{
cli();
SPDR = (uint8_t)cData0;
while(!(SPSR & (1<<SPIF)));
SPDR = (uint8_t)cData1;
while(!(SPSR & (1<<SPIF)));
SPDR = (uint8_t)cData2;
while(!(SPSR & (1<<SPIF)));
sei();
}
Initialisieren tu ich den DAC mit einem kompletten Reset, einschalten
der internen Referenz sowie setzen des LDAC für alle Outputs auf 1.
Sende ich nun ein SPI_Master_to_DAC_send() mit einem Wert, so passiert
nichts. Habe nun schon alle Modi durchprobiert.
Kann mir jemanden eine Hilfestellung liefern?
Beste Grüße,
Robert
Lesezeichen