spi.c


1
Verdrahtung:
2
++++++++++++
3
4
Master          Sklave
5
++++++++        ++++++++
6
+      + PB0      PB4 +       +
7
+ /SS  +------------->+ /SS  +
8
+      + PB1    PB7 +      +
9
+ SCK  +------------->+ SCK  +
10
+      + PB2      PB5 +      +
11
+ MOSI +------------->+ MOSI +
12
+      + PB3      PB6 +      +
13
+ MISO +<-------------+ MISO +
14
+      +        +      +
15
++++++++              ++++++++
16
    
17
18
//===========================================================================
19
// ATT-Testbench - SPI-Sklave : ATMEGA 32
20
// (c) Thomas Mueller
21
// File:  main.c  
22
//===========================================================================
23
24
//standard header files
25
#include <avr/io.h>
26
#include <stdint.h>
27
#include <avr/interrupt.h>
28
29
30
//Init SPI as Sklave
31
void spi_sklave_init(void)
32
{ 
33
  //datasheet atmega32 at page 133
34
  //portdirection
35
  DDRB |= 0x40;    //MISO -> output
36
  SPCR = 0xC0;    //SPI enable
37
}
38
39
40
//SPI transfer complete
41
ISR(SPI_STC_vect)
42
{  
43
  SPDR = 0x04;  //return 0x04 to master
44
  PORTC = SPDR;  //reading SPI-data  
45
}
46
47
48
//main
49
int main(void)
50
{    
51
  spi_sklave_init();
52
  DDRC = 0xFF;  //8Bit SPI-Dataframe from master on Port C   
53
  sei();    //enable global interrupt
54
  
55
  while(1);
56
  
57
  return(0);
58
}
59
60
//===========================================================================
61
// End of SourceCode.
62
//===========================================================================
63
64
65
66
//===========================================================================
67
// ATT-Testbench - SPI-Master : ATMEGA 128
68
// (c) Thomas Mueller
69
// File:  main.c  
70
//===========================================================================
71
72
//standard header files
73
#include <avr/io.h>
74
#include <stdint.h>
75
#include <avr/interrupt.h>
76
77
78
void spi_master_init(void)
79
{ 
80
  //datasheet atmega128 on page 164  
81
  //portdirection
82
  DDRB |= 0x07;    // /SS,SCK and MOSI output
83
  PORTB |= 0x01;  // /SS=1
84
  SPCR = 0xD1;    // init SPI with SPI-ISR 
85
}
86
87
ISR(TIMER1_OVF_vect)  //f ca. 1Hz
88
{
89
  //TIMER1 has overflowed
90
  TCNT1H = 0xF8; //reload counter high value
91
  TCNT1L = 0x30; //reload counter low value
92
  
93
  PORTB &= 0xFE;// /SS=0
94
  SPDR = 0xAA;  // starting transmission
95
}
96
97
98
//SPI transfer complete
99
ISR(SPI_STC_vect)
100
{
101
  PORTD = SPDR;  //data from sklave at PORTC
102
  PORTB |= 0x01;// /SS=1
103
}
104
105
106
107
int main(void)
108
{    
109
  DDRD = 0xFF;  //Portdirection  
110
  spi_master_init();
111
  timer1_init();
112
  TIMSK = 0x04;   //timer interrupt sources
113
  sei();
114
  
115
  while(1);
116
  
117
  return(0);
118
}
119
120
//===========================================================================
121
// End of SourceCode.
122
//===========================================================================