Hallo zusammen
Ich habe das Problem das bei meinem ATmega16 keine Daten am MOSI Pin
(SPI) rauskommen. DAs Clocksignal und das Chipselect hingegen werden
sauber geschaltet.
Ich programmiere über einen ISP programmer welcher während dem Betrieb
angeschlossen bleibt. Könnte das ein Problem darstellen? Ich habe auch
schon den Pin abgetrennt, aber keine Verbesserung erfahren.
Meine Initialisierung sieht wie folgt aus:
1 | void gvSPIConfig(void){
|
2 | //Configure IO Pins
|
3 | DDRB |= (1<<PB4) | (1<PB5) | (1<<PB7); //Set MOSI, SCK and SS to Output
|
4 | DDRB &= ~(1<<PB6); //Set MISO to Input
|
5 | PORTB |= (1<<PB6); //Enable Pull-up on MISO
|
6 | PORTB |= (1<<PB4); //Set SS High
|
7 |
|
8 | //Configure Data Order
|
9 | SPCR |= 0x00;
|
10 |
|
11 | //Configure Master or Slave
|
12 | SPCR |= 0x10;
|
13 |
|
14 | //Configure Transfer Mode
|
15 | SPCR |= 0x00;
|
16 |
|
17 | //Configure Clock Rate
|
18 | SPCR |= 0x02;
|
19 | }
|
Das versenden läuft wie folgt ab
1 | void gvSPIWrite(uint8_t u8Data){
|
2 | PORTB &= ~(1<<PB4); //Set SS low
|
3 | SPDR = u8Data;
|
4 | while(!(SPSR & (1<<SPIF))); //wait till transmission complete
|
5 | PORTB |= (1<<PB4); //Set SS High
|
6 | }
|
Aber am MISO Pin kommen keine Daten raus. Er scheint sie aber
herauszushiften. Zumindest kann er die gvSPIWrite Funktion erfolgreich
beenden und die weiteren Aufgaben im Code werden auch ohne weiteres
abgearbeitet. Auch am Oszi sehe ich immer wieder den wechselnden SS
Pegel und das Clock Signal.