Hallo, ich habe ein Problem mit dem USI von dem Attiny85.
Der Attiny soll als SPI-Slave fungieren , aber leider empfängt er ab und
zu nicht das richtige...
Ein CortexM4 schickt alle 100ms via SPI 0x20 an den ATtiny mit einer
Frequenz von 166kHz. Der Attiny läuft mit 8Mhz.
Wenn das Zeichen 0x20 Empfangen wurde soll der Ausgang PB_4 High sein,
wenn nicht dann Low.
Leider geht der Ausgang ab und zu auf Low (LED geht aus).
Auch beim Data Output Pin (PB1) sieht man das das Signal kurz weg geht.
Das Senden vom dem CortexM4 ist stabil das habe ich mit einen Ozsi
überprüft....
Ich verstehe nicht warum das Signal "plötzlich" verschwindet..
Danke für eure Hilfe
Anbei mein Code
1 | /* lib. einbinden*/
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 | #include <avr/sleep.h>
|
6 |
|
7 | void ioinit(void){
|
8 | /*PORTB*/
|
9 | /************************************************************************/
|
10 | #define PB_0 PINB0 //
|
11 | #define PB_1 PINB1 //
|
12 | #define PB_2 PINB2 //
|
13 | #define PB_3 PINB3 //
|
14 | #define PB_4 PINB4 //
|
15 |
|
16 | DDRB = 0b00011010;
|
17 | PORTB= 0b00000101;
|
18 | }
|
19 |
|
20 |
|
21 | void usi_init(void){
|
22 | USICR |= ((0<<USISIE)|(1<<USIOIE)|(0<<USIWM1)|(1<<USIWM0)|(1<<USICS1)|(0<<USICS0)|(0<<USICLK)|(0<<USITC));
|
23 | }
|
24 |
|
25 | volatile char SPI_Data=0;
|
26 |
|
27 | /*Hauptprogrmm*/
|
28 | /************************************************************************/
|
29 | int main(void) {
|
30 |
|
31 | ioinit (); // IO Init
|
32 | usi_init(); // USI Init
|
33 | sei(); // Interrupt einschalten
|
34 |
|
35 | /************************************************************************/
|
36 | /*Hauptschleife*/
|
37 | /************************************************************************/
|
38 | for(;;){
|
39 |
|
40 |
|
41 | if (SPI_Data==0x20){
|
42 | PORTB |= (1 << PB_4);
|
43 | }
|
44 | else{
|
45 | PORTB &=~ (1 << PB_4);
|
46 | }
|
47 |
|
48 |
|
49 | }
|
50 | }
|
51 | ISR (USI_OVF_vect){
|
52 | USISR = (1<<USIOIF); //Clear OVF flag
|
53 | SPI_Data = USIDR;
|
54 | }
|
55 | //end
|