Hey,
ich habe noch einen Playstation 2 Controller liegen und wollte den nun
für meine zukünftigen AVR-Projekte flott machen. Ich habe nun auch eine
Homepage mit der Ansteuerung gefunden...
http://store.curiousinventor.com/guides/PS2
Auf den Ansteuerungsbilder ist zu erkennen, das gleichzeitig gesendet
und empfangen wird (full-duplex).
Nun wollte ich dafür mein SPI-Interface als Full-Duplex verwenden und
konfigurieren. Dazu habe ich nun den Code aus dem Datenblatt
abgeändert...
1 | void SPI_MasterInit(void)
|
2 | {
|
3 | /* Set MOSI and SCK output, all others input */
|
4 | DDRB |= ((1<<PB5)|(1<<PB7));
|
5 | /* Enable SPI, Master, set clock rate fck/128 */
|
6 | SPCR0 = (1<<SPE0)|(1<<MSTR0)|(1<<SPR00)|(1<<SPR10)|(1<<DORD0)|(1<<CPOL0)|(1<<CPHA0);
|
7 | }
|
8 | void SPI_MasterTransmit(char cData)
|
9 | {
|
10 | /* Start transmission */
|
11 | SPDR0 = cData;
|
12 | /* Wait for transmission complete */
|
13 | while(!(SPSR0 & (1<<SPIF0)))
|
14 | ;
|
15 | }
|
16 |
|
17 | void SPI_SlaveInit(void)
|
18 | {
|
19 | /* Set MISO output, all others input */
|
20 | DDRB = (1<<PB6);
|
21 | /* Enable SPI */
|
22 | SPCR0 = (1<<SPE0)|(1<<SPR00)|(1<<SPR10)|(1<<DORD0)|(1<<CPOL0)|(1<<CPHA0);
|
23 | }
|
24 | char SPI_SlaveReceive(void)
|
25 | {
|
26 | /* Wait for reception complete */
|
27 | while(!(SPSR0 & (1<<SPIF0)))
|
28 | ;
|
29 | /* Return Data Register */
|
30 | return SPDR0;
|
31 | }
|
Aber man arbeitet beim Schreiben und Lesen mit dem selben Register
(SPDR0). Wie mach ich das nun gleichzeitig? Ausserdem müsste ich dann ja
permanent die Master und Slave Initialisierung tauschen?!
Irgendwas habe ich noch nicht ganz verstanden und bräuchte Hilfe
Vielen Dank