Hallo Community,
ich verzweifle gerade an einem Fehler eines Boards mit angeschlossenem
SRAM und LCD Modul auf einem USART Master SPI.
Schreiben der Daten ist Einwandfrei. (LCD Modul ist in Betrieb)
Beim Rücklesen der Daten habe ich aber einen "um eins daneben" Fehler.
Ein "0xFF" auf der MISO Leitung interpretiert der Xmega als "0x7F".
Ich Versuche, Wörter aus dem LCD RAM herauszulesen. Diese müssten
0xFF00, 0xFF00 ... heißen, der Controller liest aber 0x7F80, 0x7F80 ...
usw.
Die Bitreihenfolge ist um eins nach Rechts verschoben, obwohl die Daten
richtig im Bus anliegen. (Siehe Foto im Anhang)
Codeschnipsel zur Initialisierung:
1 | PORTC.PIN5CTRL = (PORT_INVEN_bm | PORT_OPC_PULLUP_gc);
|
2 | PORTC.OUTSET = (DISP_MOSI | DISP_CLK | LCD_CS);
|
3 | PORTE.OUTSET = LCD_CS;
|
4 |
|
5 | DISP_USART.BAUDCTRLA = 32;
|
6 | DISP_USART.BAUDCTRLB = 0;
|
7 |
|
8 | DISP_USART.CTRLC = (USART_CMODE_MSPI_gc);
|
9 | DISP_USART.CTRLC |= (USART_CHSIZE1_bm);
|
10 | DISP_USART.CTRLB = USART_TXEN_bm | USART_RXEN_bm;
|
PIN5 ist hier die CLK Leitung
Lese / Empfangsroutine:
1 | uint8_t LCD_TX_RX(uint8_t DataByte)
|
2 | {
|
3 | uint8_t temp;
|
4 |
|
5 | while (DISP_USART.STATUS & USART_RXCIF_bm)
|
6 | temp = DISP_USART.DATA;
|
7 |
|
8 | DISP_USART.DATA = DataByte;
|
9 | while (!(DISP_USART.STATUS & USART_RXCIF_bm)) {;}
|
10 | return DISP_USART.DATA;
|
11 | }
|
die while Schleife soll Müll aus dem Empfangsregister holen.
Danach Dummy Byte schreiben, das empfangene Zurückgeben. Mehr sitzt da
nicht zwischen.
Hat jemand eine Idee woher das kommen kann?
Danke