Habs gerade mal quick&dirty aufm Breadboard zusammengesteckt: Geht, wie
oben beschrieben. Ob der Clock-Idle-State high oder low ist legt man
fest indem man den Clock Pin vor Beginn des Datentransvers den Pin per
Hand auf High oder Low legt.
Clock-Idle-State = High
Sample fallig Edge
1 | void Init_SPI ( void )
|
2 | {
|
3 | // USI IOs
|
4 | DDRA |= (1<<PA5) | (1<<PA4) | (1<<PA6) | (1<<PA7);
|
5 | PORTA |= (1<<PA4); // Clock Idle = High
|
6 | }
|
7 |
|
8 | static void SPI_Transmit_Byte ( char Data )
|
9 | {
|
10 | USIDR = Data;
|
11 | USISR |= (1<<USIOIF);
|
12 | while(!(USISR & (1<<USIOIF))){ // Sample on fallig edge
|
13 | USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USICS0) | (1<<USITC);
|
14 | }
|
15 | }
|
Nicht wundern über die Funktionsbezeichnung, ich habe per #if eine
Routine für nen Tiny oder AVR