Hallo zusammen
Ich benutze folgenden Code für meine SPI Routinen:
1 | void write_spi (unsigned char data_out)
|
2 | { //msb first
|
3 |
|
4 | SPI_I2S_SendData(SPI2,data_out);
|
5 | while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
|
6 | while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
|
7 | SPI_I2S_ReceiveData(SPI2);
|
8 | }
|
9 |
|
10 | unsigned char read_spi (void)
|
11 | {
|
12 |
|
13 | SPI_I2S_SendData(SPI2,0x00);
|
14 | while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
|
15 | while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
|
16 | return SPI_I2S_ReceiveData(SPI2);
|
17 |
|
18 | }
|
NSS ist als Soft konfiguriert.
meine Zugriff sieht etwa wie folgt aus:
1 | cs_0;
|
2 | read_spi;
|
3 | cs_1;
|
Nun ist es leider so, dass CS bereits auf 1 geht, während dem am SPI
noch die letzte CLK Flanke kommt.
Ja noch schlimmer, CS kann sogar wieder auf low gehen, während dem die
letzte CLK Flanke der vorherigen Übertragung noch am Pin anliegt.
Siehe dazu die Bilder im Anhang.
Wenn ich vor das CS1 ein Delay einfüge, funktionierts.
Aber weshalb funktioniert der obige SPI code nicht?
Danke