1 | //######### Master ############################################################
|
2 | int main(void){
|
3 |
|
4 | unsigned char i,dummy,data,k=0;
|
5 | unsigned char rxdata[5]= {};
|
6 | unsigned char txdata[5]= {9,1,2,9};
|
7 | char buffer [10]= {0};
|
8 |
|
9 | glcd_print(0,0,"write...");
|
10 |
|
11 | PORTB &= ~(1<<PB0); // /SS Pin am Slave auf low
|
12 | dummy= spi_transceive(0x12); // Commandobyte (RWBit(7)=0,lesen + Befehl 0x12)
|
13 | PORTB |= (1<<PB0); // /SS Pin am Slave auf high
|
14 | _delay_us(5);
|
15 | /*
|
16 | while(!(PINE & (1<<PE7))); // Warte bis Slave bereit(solange PE7=0)
|
17 | PORTB &= ~(1<<PB0); // /SS Pin am Slave auf low
|
18 | for(i=0;i<4;i++){ // sende daten
|
19 | data= txdata[i];
|
20 | dummy= spi_transceive(data);
|
21 | _delay_us(5);
|
22 | }*/
|
23 |
|
24 | delay_nms(2000);
|
25 | glcd_print(0,0,"read...");
|
26 |
|
27 | PORTB &= ~(1<<PB0); // /SS Pin am Slave auf low
|
28 | dummy=spi_transceive(129); // Commandobyte (RWBit(7)=1,lesen + Befehl 0x01)
|
29 | PORTB |= (1<<PB0); // /SS Pin am Slave auf high
|
30 | _delay_us(5); // !muss noch evtl. noch verringert werden
|
31 |
|
32 | while(!(PINE & (1<<PE7))); // Warte bis Slave bereit(solange PE7=0)
|
33 | PORTB &= ~(1<<PB0); // /SS Pin am Slave auf low
|
34 | for(i=0;i<4;i++){ // Hole die Daten
|
35 | rxdata[i]= spi_transceive(0x00);
|
36 | _delay_us(5);
|
37 | }
|
38 | PORTB |= (1<<PB0); // /SS Pin am Slave auf high
|
39 |
|
40 | //Daten ausgeben
|
41 | for(i=0;i<4;i++){
|
42 | data= rxdata[i];
|
43 | sprintf(buffer,"%1d",data);
|
44 | glcd_print(k,1,buffer);
|
45 | k+=2;
|
46 | }
|
47 |
|
48 | return(0);
|
49 | }
|
50 |
|
51 |
|
52 | //######### Slave ############################################################
|
53 |
|
54 | //************************************************************************
|
55 | // GLOBAL VARIABLES
|
56 | //************************************************************************
|
57 | volatile unsigned char rx_buf[12]= {0x00}; //Schreibpufer
|
58 | volatile unsigned char tx_buf[12]= {0x00}; //Lesepufer
|
59 | volatile unsigned char rx_cnt= 0; //RX Zähler
|
60 | volatile unsigned char tx_cnt= 0; //TX Zähler
|
61 | volatile unsigned char CFREG= 0x00; //ControlFlagRegister
|
62 | static unsigned char cmd_byte= 0x00; //Commando byte
|
63 |
|
64 | enum{DB0= 0,DB1,DB2,DB3,DB4,DB5,DB6,DB7,DB8,DB9,DB10,DB11};
|
65 | volatile unsigned char buffer[10] = {9,1,1,1,5,6,7,8,9,0};
|
66 |
|
67 |
|
68 | //************************************************************************
|
69 | // I S R
|
70 | //************************************************************************
|
71 | ISR(SPI_STC_vect){
|
72 | rx_buf[rx_cnt++]= SPDR; //Daten Byteweise ins Puffer schreiben
|
73 | SPDR= tx_buf[++tx_cnt]; //Daten Byteweise aus dem Puffer lesen
|
74 | }
|
75 |
|
76 | //************************************************************************
|
77 | // MAINLOOP
|
78 | //************************************************************************
|
79 | int main(void){
|
80 | main_init();
|
81 |
|
82 | while(1){
|
83 | if(!(PINB & (1<<P_SS))){ //Übertragung beginnt
|
84 | while(!(PINB & (1<<P_SS))); //Warte bis CMDByte übertragen wurde
|
85 | P_BUSY_LOW(); //Master wartet
|
86 | cmd_byte= rx_buf[DB0]; //CMDByte abholen
|
87 |
|
88 | if(!(cmd_byte & (1<<RW))){ //R/W-Bit=0, Master schreibt
|
89 | rx_cnt= 0; //RX Zähler zurücksetzen
|
90 | P_BUSY_HIGH(); //Master kann die Daten übetragen
|
91 | while(!(PINB & (1<<P_SS))); //Warte bis Übertragung abgeschlossen
|
92 | cmd_byte= cmd_byte & CMDBITS;
|
93 | switch(cmd_byte){
|
94 | case 0x12:{
|
95 | buffer[1] = 33;
|
96 | //tx_buf[1] = 99;
|
97 | //unsigned char i;
|
98 | //for(i=0;i<2;i++){
|
99 | // buffer[i]= rx_buf[i];
|
100 | //}
|
101 | } break;
|
102 |
|
103 | }
|
104 | }
|
105 | if((cmd_byte & (1<<RW))){
|
106 | //else{
|
107 | cmd_byte= cmd_byte & CMDBITS;
|
108 | switch(cmd_byte){
|
109 | case 0x01:{
|
110 | unsigned char i;
|
111 | for(i=0;i<4;i++){
|
112 | tx_buf[i]= buffer[i];
|
113 | }
|
114 | } break;
|
115 | }
|
116 |
|
117 | tx_cnt= 0; //TX Zähler zurücksetzen
|
118 | SPDR= tx_buf[tx_cnt]; //Erstes Byte in SPDR laden
|
119 | P_BUSY_HIGH(); //Master kann die Daten abholen
|
120 | while(!(PINB & (1<<P_SS))); //Warte bis Übertragung abgeschlossen
|
121 | }
|
122 | }
|
123 |
|
124 |
|
125 |
|
126 | }
|
127 | return(0);
|
128 | }
|