Hallo !
Ich habe grade eine Schaltung entworfen , mit der ich Spannungen mit dem 12 Bit AD Wandler AD7476 messen kann.
Dieser wird über die SPI Schnittstelle betrieben und besitzt lediglich die MISO Leitung , Mosi fehlt da der Wandler nur einen Kanal besitzt (und somit das CommandByte entfällt)
Sobald die Chip Select Leitung auf low gezogen wird ,soll der Wandler beginnen, mit der vorher am µC (Atmega16) eingestellten/erzeugten SCK Frequenz, Daten zu übertragen.
Leider funzt es aber nicht richtig , die MISO Leitung ist zwar 16 Takte lang auf Low gezogen bei der Übertragung , aber enthält keine Daten ( 16 Takte = 4 leere Bits + 12 AD Wandler Bits) .
Als Referenz Spannung habe ich im übrigen eine 4.096 Volt Quelle benutzt, da das lästiges Umrechnen erspart (4,096 V / 4096 Werte bei 12 Bit Auflösung).
Das Problem wird vermutlich der SPI Code sein , da ich auf dem GEbiet SPI Bus Neuling bin , bitte ich euch mal einen blick drauf zu werfen , ob der Code auch korrekt ist ...
Code:
uint16_t adwert;
// ----------
// Init
// ----------
void spi_init(void)
{
// Init wie in AppNote
SPCR &= ~(1 << SPE); // disable SPI
DDRB |= (1 << PB4); // SS output
PORTB |= (1 << PB4); // SS high
SPCR |= (1 << MSTR) | (1 << SPE) ; // master; enable SPI;
// datarate, mode3, MSB first, SCK auf FCPU /128
SPCR &= ~( (1 << DORD));
SPCR |= (1 << CPOL) |(1 << CPHA)| (1 << SPR1) | (1 << SPR0);
DDRB |= (1 << PB5) | (1 << PB7); // SCK & MOSI -> output
DDRB &= ~(1 << PB6); // MISO -> input
}
uint8_t spi_putc( uint8_t data )
{
// Sendet ein Byte
SPDR = data;
// Wartet bis Byte gesendet wurde
while( !( SPSR & (1<<SPIF) ) )
;
return SPDR;
}
uint16_t ADREAD(void)
{
adwert =0;
// /CS des AD7476 auf Low ziehen
PORTB &= ~(1<<PB4);
adwert |= (spi_putc(0xAA)<<8);
adwert |= spi_putc(0x00);
// /CS Leitung wieder freigeben
PORTB |= (1<<PB4);
return adwert;
}
vielen DANK im Vorraus
der braini :O)
Lesezeichen