Hallo zusammen, ich kämpfe ein wenig mit SPI. genauer gesagt
funktioniert es aber es macht nicht was es soll. Ich steuere einen
ST7735 an. Und das Problem ist, ich habe Datenverlust sofern ich nicht
nach jedem einzelnen Byte SPI deaktiviere und neu aktiviere...
Wenn ich SPI Open, Byte Exchange, SPI Close etc. anwende funktioniert
alles wunderbar. Wenn ich Open Byte Exchange, Byte Exchange anwende
kommt nur die hälfte an.
Ursprünglivh hatte ich vor den TX Intterupt flag zu nutzen dieser wird
low sobald kein Platz mehr im FIFO Sende puffer ist. aber es funktiert
nicht.
Auch wenn ich SPI enable früher setze funktioniert es nicht...
funktioniert es nicht.
Hat jemand eine Idee?
Hier meine Code Auszüge
1 | void SPI1_Initialize(void)
|
2 | {
|
3 | //EN disabled; LSBF MSb first; MST bus master; BMODE every byte;
|
4 | SPI1CON0 = 0x03;
|
5 | //SMP Middle; CKE Active to idle; CKP Idle:Low, Active:High; FST disabled; SSP active high; SDIP active high; SDOP active high;
|
6 | SPI1CON1 = 0x48;
|
7 | //SSET disabled; TXR required for a transfer; RXR data is not stored in the FIFO;
|
8 | SPI1CON2 = 0x03;
|
9 | //CLKSEL HFINTOSC;
|
10 | SPI1CLK = 0x01;
|
11 | //BAUD 15;
|
12 | SPI1BAUD = 0x3;
|
13 | TRISBbits.TRISB5 = 0;
|
14 | //SPI1_Open();
|
15 | }
|
16 |
|
17 | void SPI1_Open()
|
18 | {
|
19 | SPI1CON0bits.EN = 1;
|
20 | }
|
21 |
|
22 | void SPI1_Close(void)
|
23 | {
|
24 | SPI1CON0bits.EN = 0;
|
25 | }
|
26 |
|
27 | void SPI1_ExchangeByte(uint8_t data)
|
28 | {
|
29 | // while(!PIR2bits.SPI1TXIF){}; // dieser prüft ob platz im FIFO ist.
|
30 | SPI1TXB = data;
|
31 | while(!SPI1INTFbits.SRMTIF); //Warten bis leer gesendet wird oder
|
32 | warten auf den RX Interrupt beides geht.
|
33 | SPI1INTFbits.SRMTIF = 0;
|
34 | //while(!PIR2bits.SPI1RXIF);
|
35 | }
|