Hallo Community,
seit Gestern beschäftige ich mich zum ersten mal einen SPI-Slave über USI zu programmieren/ konfigurieren. Leider ohne Erfolg, dabei ist der Programmcode beinahe komplett aus Beispiele herausgenommen worden (avrhelp.mcselec.com).
verwendete Hardware:
- ATmega1284p (Master)
- ATtiny85 (Slave)
welche wie im Anhang "SPI_blockschaltbild" angeschlossen ist.
belegte Pins:
ATmega1284p (Master) ATtiny85 (Slave)
PB5 MOSI --> PB0 MOSI
PB6 MISO --> PB1 MISO
PB7 SCK --> PB2 SCK
Da der ATtiny85 der einzige Busteilnehmer ist, wurde auf den Slave-Select verzichtet. Dieser muss bei USI sowieso über Software programmiert werden.
Programmcode Master:
...
Programmcode Slave: (org. Beispielcode im Anhang "usi_beispielcode")
Alles anzeigen
seit Gestern beschäftige ich mich zum ersten mal einen SPI-Slave über USI zu programmieren/ konfigurieren. Leider ohne Erfolg, dabei ist der Programmcode beinahe komplett aus Beispiele herausgenommen worden (avrhelp.mcselec.com).
verwendete Hardware:
- ATmega1284p (Master)
- ATtiny85 (Slave)
welche wie im Anhang "SPI_blockschaltbild" angeschlossen ist.
belegte Pins:
ATmega1284p (Master) ATtiny85 (Slave)
PB5 MOSI --> PB0 MOSI
PB6 MISO --> PB1 MISO
PB7 SCK --> PB2 SCK
Da der ATtiny85 der einzige Busteilnehmer ist, wurde auf den Slave-Select verzichtet. Dieser muss bei USI sowieso über Software programmiert werden.
Programmcode Master:
...
Programmcode Slave: (org. Beispielcode im Anhang "usi_beispielcode")
BASCOM-Quellcode
- $regfile = "ATtiny85.DAT"
- $crystal = 8000000
- $hwstack = 32
- $swstack = 10
- $framesize = 30
- Dim B As Byte
- Dim Usi_data_ready As Bit
- Config Portb.1 = Output 'DO ---> MISO of ATXMEGA (PD6)
- Config Portb.2 = Output 'USCK ---> SCK of ATXMEGA (PD7)
- Set Portb.2 'enable Pullup
- Config Portb.0 = Input 'DI ---> MOSI of ATXMEGA (PD5)
- Set Portb.0 'enable Pullup
- 'Init USI as SPI Slave in USICR = USI Control Register
- Set Usicr.usiwm0 'Three-wire mode. Uses DO, DI, and USCK pins.
- Set Usicr.usics1 'Clock Source: External, positive edge ; External, both edges
- Set Usicr.usioie 'USI Counter Overflow Interrupt Enable
- On Usi_ovf Usi_overflow_int
- Enable Usi_ovf
- Enable Interrupts
- Do
- If Usi_data_ready = 1 Then
- Reset Usi_data_ready
- Usidr = &B00000000
- End If
- Loop
- End
- ' After eight clock pulses (i.e., 16 clock edges) the 4-Bit USI counter will generate an overflow interrupt
- ' A USI Overflow Int can also wakeup the Attiny from Idle mode if needed
- Usi_overflow_int:
- Set Usi_data_ready
- B = Usidr
- Usisr = &B01_000000 'Reset Overflow Flag and reset 4-Bit USI counter
- Return