Hi,
ich habe einen ATMega16 als SPI Master und einen ADC als Slave. Ich
möchte den Slave jetzt über SPI auslesen. Hab ich das richtig
verstanden, dass ich dazu etwas ins SPI Datenregister schreiben muss und
so tue als würde ich das senden? Und dass beim Senden dann mein
Datenregister gleichzeitig die Daten vom ADC am MISO Pin empfängt und
einliest?
Ich hab folgenden Code im Datenblatt des ATMega gefunden und für meine
Zwecke erweitert:
1 | #define DD_MOSI PINB5
|
2 | #define DD_MISO PINB6
|
3 | #define DD_SCK PINB7
|
4 | #define DD_SS PINB4
|
5 | #define DDR_SPI DDRB
|
6 | #define PORT_SPI PORTB
|
7 |
|
8 | /* ADC initialisieren */
|
9 | void ADC_Init(void)
|
10 | {
|
11 | //SPI initialisieren
|
12 | /* Set MOSI, SCK and SS output, all others input */
|
13 | DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
|
14 | /* Enable SPI, Master, set clock rate fck/16 */
|
15 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
|
16 |
|
17 | //ADC deaktivieren
|
18 | PORT_SPI |= (1<<DD_SS);
|
19 | }
|
20 |
|
21 | /* ADC Einzelmessung */
|
22 | uint8_t ADC_Read(void)
|
23 | {
|
24 | //ADC aktivieren
|
25 | PORT_SPI &= ~(1<<DD_SS);
|
26 |
|
27 | /* Start transmission */
|
28 | SPDR = 1;
|
29 | /* Wait for transmission complete */
|
30 | while(!(SPSR & (1<<SPIF)))
|
31 | ;
|
32 | //ADC deaktivieren
|
33 | PORT_SPI |= (1<<DD_SS);
|
34 | /* Return data register */
|
35 | return SPDR;
|
36 | }
|
Leider kommt vom ADC jetzt immer der Wert 15, egal was ich an seinem
Eingang anlege. Wie lese ich einen SPI Slave aus?