ATxmega256A3BU SPI Problem

Gast #4881309
Lesenswert?
• ▲
▼
Hallo!

Ich verwende den Code des SPI-Beispiels AVR 1309 (Interrupt-Version) und 
es funktioniert so weit, aber mein SPI-Slave-IC benötigt, dass man nach 
jedem 5 gesendeten Byte CS auf high setzt sonst funktioniert es nicht.

Wie folgt: CS -----_________________--___________--___________----usw..

              CLK ----- _-_-_-_-_-_____-_-_-_-_-_____-_-_-_-_-____usw..

              BYTE           5            10             15       usw ..

Ich modifizierte die Funktion SPI_MasterInterruptHandler in spi_driver.c 
(siehe Kommentar Modified start / end).

Es funktioniert, aber es ist hässlich, wie kann ich es ohne delay in 
einer eleganter Weise schreiben?

Hat einer eine Idee?

1
void SPI_MasterInterruptHandler(SPI_Master_t *spi)
2
{
3
    uint8_t data;
4
    uint8_t bytesTransceived = spi->dataPacket->bytesTransceived;
5

6
    /* If SS pin interrupt (SS used and pulled low).
7
    *  No data received at this point. */
8
    if ( !(spi->module->CTRL & SPI_MASTER_bm) ) {
9
        spi->interrupted = true;
10
    }
11

12
    else {  /* Data interrupt. */
13

14
        /* Store received data. */
15
        data = spi->module->DATA;
16
        spi->dataPacket->receiveData[bytesTransceived] = data;
17

18
        /* Next byte. */
19
        bytesTransceived++;
20
        
21
        
22
        
23

24
        /* If more data. */
25
        if (bytesTransceived < spi->dataPacket->bytesToTransceive) {
26
            /* Put data byte in transmit data register. */
27
            data = spi->dataPacket->transmitData[bytesTransceived];
28
            spi->module->DATA = data;
29
            
30

31
            //MODIFIED START
32
            if ( bytesTransceived == 4 || bytesTransceived == 9 || bytesTransceived == 14 || bytesTransceived == 19 || bytesTransceived == 24 || bytesTransceived == 39 || bytesTransceived == 34 || bytesTransceived == 39
33
                 || bytesTransceived == 34 || bytesTransceived == 39 || bytesTransceived == 44 || bytesTransceived == 49 || bytesTransceived == 54 )
34
            {
35
                delay_us(50);
36
                uint8_t ssPinMask = spi->dataPacket->ssPinMask;
37
                SPI_MasterSSHigh(spi->dataPacket->ssPort, ssPinMask);
38
            }
39
                delay_us(50);
40
                uint8_t ssPinMask = spi->dataPacket->ssPinMask;
41
                SPI_MasterSSLow(spi->dataPacket->ssPort, ssPinMask);
42

43
           //MODIFIED ENDE
44
            
45
        }
46

47
        /* Transmission complete. */
48
        else {
49

50
            /* Release SS to slave(s). */
51
            uint8_t ssPinMask = spi->dataPacket->ssPinMask;
52
            SPI_MasterSSHigh(spi->dataPacket->ssPort, ssPinMask);
53

54
            spi->dataPacket->complete = true;
55
        }        
56
    }
57
    /* Write back bytesTransceived to data packet. */
58
    spi->dataPacket->bytesTransceived = bytesTransceived;
59
}
Gast #4881371
Lesenswert?
• ▲
▼
Jim M. schrieb:
> Das mit der Modulo Arithmetik üben wir aber noch mal, ja? Hint: Damit
> ist das if(bytesTransceived ==...) eine Formel.

Danke! an den Modulo operator hab ich jetzt gar nicht gedacht

wäre dann wohl so denke ich
1
if (bytesTransceived % 5 == 0)
2
{
3
....
4
}

> Man könnte im SPI Interrupt einen Timer starten, der die 50µs wartet und
> dann die entsprechende Aktion auslöst.

Wie genau meinst du das mit dem Timer genau?
Im Interrupt vom SPI eine Variable hochzählen bis man die 50µs erreicht 
hat?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.