Man war das peinlich von mir, erst denken dann schreiben.
Habe umgedacht weil es mit dem Timing nicht gepasst. es kommt zwar etwas
an aber nicht das was ich verschicke.
Vom Slave kommt ein Dummy wert (0xaaaa) beim Master kommt immer
unterschiedliche werte an, deshalb habe ich ein paar warte schleifen im
master eingesetzt um das Timing zu verbessern.
Deshalb gibt der Slave den takt vor.
als Master mega8:
Sende Vorgang starten mit PB0
Wert lesen am PINB1
1 | case USB_Trans:
|
2 | DDRB |= (1<<PB0);//Ausgang für CS
|
3 | PORTB |= (1<<PB0);//High
|
4 | DDRB &= ~(1<<PB2)|(1<<PB1);//eingang
|
5 | PORTB |= (1<<PB2)|(1<<PB1);//Pull-up
|
6 |
|
7 | uint16_t Datain = 0;
|
8 | for(uint16_t a = 0; a<16 ; a++)
|
9 | {
|
10 |
|
11 | do{}
|
12 | while((PINB &(1<<PINB2)));
|
13 |
|
14 | if(PINB &(1<<PINB1))
|
15 | {
|
16 | Datain |= 1 ;
|
17 | }
|
18 | else
|
19 | {
|
20 | Datain &= ~1 ;
|
21 |
|
22 | }
|
23 | Datain <<=1;
|
24 | do{}
|
25 | while(!(PINB &(1<<PINB2)));
|
26 | }
|
27 | PORTB &= ~(1<<PB0);
|
28 | itoa(Datain, Dataout, 10);
|
29 |
|
30 | usbMsgPtr = Dataout;
|
31 | return sizeof(Dataout);
|
als Slave habe den tiny13
Takt Vorgabe
und wert raus shiften
1 | uint16_t wechsel = 0xAAAA;
|
2 |
|
3 | if((PINB & (1<<PINB0))) //Wenn CS High geht
|
4 | {
|
5 |
|
6 | MSB = 0x8000;
|
7 | for(int8_t a = 16 ; a>=0 ;a--)
|
8 | {
|
9 |
|
10 | PORTB |=(1<<PB2);
|
11 |
|
12 |
|
13 | if(MSB & wechsel)
|
14 | {
|
15 | PORTB |= (1<<PB1);
|
16 | }
|
17 | else
|
18 | {
|
19 | PORTB &= ~(1<<PB1);
|
20 | }
|
21 |
|
22 | MSB >>= 1; //schiebt nach rechts
|
23 | PORTB &=~(1<<PB2);
|
24 | }
|
25 |
|
26 | do{}
|
27 | while(!(SPI_Init_PIN & (1<<SS_PIN0)));//warte bis CS wieder low ist
|
28 | }
|
29 | }
|
>Ob das 'sizeof(Dataout)' stimmt, ist auch fraglich...
Es funktioniert habe es noch in anderen Cases.
danke für die tipps