Hallo liebe Controllerfreunde,
ich sizte gerade vo dem Problem, dass die Kommunikation über das
USI-Interface einfach nicht klappen will. Alle denkbaren
Konfigurationsmethoden aus dem Datenblatt hab ich schon durch. Vielleich
kann mir von euch aber einer weiter helfen.
Das Ergebnis meines Werkes ist an Hand des Bildes im Anhang am besten zu
sehen. (v.o.n.u. SCK, SDI, SDO, CS)
Ich habe alle nötigen Ausgänge konfiguriert:
1 | DDRB |= (1<<CS)|(1<<SCK)|(0<<SDI); // Ausgang
|
2 | DDRB &= ~(1<<SDO); // Eingang
|
3 | PORTB |= (1<<SDO); // Pull-up
|
Ich habe den Timer0 im CTC-Mode initialisiert um den Takt für das
USI-Interface zu generieren:
1 | TCCR0A = 0b00000001; // CTC-Mode
|
2 | TCCR0B = (0<<CS01)|(1<<CS00); // Vorteriler 0
|
3 | OCR0A = 100; // rund XXX kHz
|
4 | TIMSK = 0;
|
5 |
|
6 | ...
|
7 | TIMSK |= (1<<OCIE0A); // Timer0 AN
|
8 |
|
9 | ...
|
10 | ISR (TIMER0_COMPA_vect)
|
11 | {
|
12 | USICR |= (1<<USITC); // Takt-Pin toggeln
|
13 | }
|
Und ich nutze die folgende Senderoutine:
1 | while(1)
|
2 | {
|
3 | PORTB &= ~(1<<CS); // CS
|
4 |
|
5 | (void)SPITransfer(0x80 | 0x55);
|
6 | output = SPITransfer(0);
|
7 |
|
8 | PORTB |= (1<<CS); // Chipselect zurücksetzen
|
9 | _delay_ms(25);
|
10 | }
|
11 |
|
12 | static uint8_t SPITransfer(uint8_t d)
|
13 | {
|
14 | USIDR = d;
|
15 | USISR = (1<<USIOIF);
|
16 | do {
|
17 | USICR = (1<<USIWM0)|(0<<USICS1)|(1<<USICS0)|(0<<USICLK);
|
18 | } while ((USISR & (1<<USIOIF)) == 0);
|
19 | return USIDR;
|
20 | }
|
Danke schon mal für eure Hilfe!