Hallo,
ich schlage mich schon den ganzen Tag mit meinem Xmega256A3 herum. Ich
möchte per USART im SPI Modus mit einem CAN Controller kommunizieren und
teste das ganze momentan in einem einfachen Loopback-aufbau, also
TX/MOSI und RX/MISO gebrückt um das gesendete Byte gleich wieder zu
empfangen. Der Rückgabewert der Funktion soll dem übergebenen Byte
entsprechen. Wenn das klappt, wird das ganze dann per Interrupt gelöst
aber zunächst möchte ich es mit der einfachen Pollingmethode versuchen.
Ich debugge mit AVR Studio 5.1 und dem AVR Dragon.
Konfiguriere ich den USART als asynchrone Schnittstelle, dann klappt es
einwandfrei. Aber sobald ich mit
1 | USARTD0.CTRLC=USART_CMODE_MSPI_gc[c] in den Master SPI Modus wechsle, empfange ich nichts mehr.
|
2 |
|
3 | [c]unsigned char usart_read_byte(unsigned char byte){
|
4 | if(!(USARTD0.STATUS & USART_DREIF_bm)){ //Falls Modul noch sendet,
|
5 | while(!(USARTD0.STATUS & USART_TXCIF_bm)); //warten, bis Daten verschickt sind
|
6 | USARTD0.STATUS=USART_TXCIF_bm; //Flag löschen
|
7 | }
|
8 | USARTD0.DATA=byte; //Daten in den Sendepuffer schreiben
|
9 | while(!(USARTD0.STATUS & USART_RXCIF_bm)); //Auf empfangene Daten warten
|
10 | return USARTD0.DATA;
|
11 | }
|
Per
1 | while(!(USARTD0.STATUS & USART_RXCIF_bm))
|
kann ich im async-modus auf das Eintreffen des Bytes im Eingangspuffer
warten, im MSPI Modus wartet er ewig weil das Flag nie gesetzt wird.
Stattdessen auf USART_TXCIF_bm zu warten, bringt auch nichts. Die Idee
kam mir, weil die zu empfangenen Bits ja gleichzeitig mit den gesendeten
Bits reingetaktet werden müssten. Zumindest war das "damals" beim alten
atmega so.
Leider habe ich momentan kein Oszilloskop zur Hand, kann aber mittels
LED sehen, dass Daten rausgehen. Wie gesagt, asynchron klappt, SPI
nicht. Es ist zum Haare raufen.
Habt ihr einen heißen Tipp für mich?
Grüße