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 ...
vielen DANK im VorrausCode: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; }
der braini :O)







Zitieren

Lesezeichen