Guten Abend zusammen,
ich habe eine SPI Kommunikation mit einem F2274 als Master aufgebaut. Es
werden lediglich CLK bzw. MOSI verwendet, CS wird separat geschaltet und
vom Slave wird nicht gelesen. Der inaktive clock Zustand ist low, die
Daten sollen vom Slave auf steigender Flanke übernommen werden (UCCKPH
gesetzt).
Das klappt alles auch soweit, lediglich das Warten auf das Ende der
Übertragung funktioniert nicht wie gewollt. Ohne die unten eingefügte
for()-Schleife dreht der Master dem Slave unmittelbar nach der letzten
(16.) steigenden Flanke den CS ab. Damit geht die Übertragung schief,
weil das Software-SPI im Slave zwar schnell ist, den Portzustand aber
auch nicht in der Zeit Null lesen kann.
So wie ich das BUSY-Flag interpretieren würde sollte es erst
zurückgesetzt werden, wenn die Übertragung beendet, sprich CLK wieder
low ist. Verstehe ich hier etwas falsch oder bräuchte TI einen weiteren
Eintrag im Errata-Sheet?
Beste Grüße,
odic
1 | // select slave
|
2 | d_SpiSlaveCS_1();
|
3 |
|
4 | // write command byte
|
5 | UCB0TXBUF = t_Data_UB;
|
6 |
|
7 | // wait till TX buffer is empty
|
8 | while(UCB0TXIFG != (IFG2 & UCB0TXIFG)){;}
|
9 |
|
10 | // write checksum
|
11 | UCB0TXBUF = (UBYTE)~t_Data_UB;
|
12 |
|
13 | // wait till TX buffer is empty
|
14 | while(UCB0TXIFG != (IFG2 & UCB0TXIFG)){;}
|
15 |
|
16 | // wait till transmission is completed
|
17 | while(UCBUSY == (UCB0STAT & UCBUSY)){;}
|
18 |
|
19 | // wait before disabling CS (waiting for BUSY flag doesn't have the effect as expected)
|
20 | for (i=0;i<600;i++){;}
|
21 |
|
22 | // deselect slave
|
23 | d_SpiSlaveCS_0();
|