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 | }
|