1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | //#define SPI_CLK 12500 // spi clock
|
5 |
|
6 | #define CS_PIN PB4 // chip select pin
|
7 | #define CS_REG PORTB // chip select register
|
8 | #define SPI_DEVICE_T_DELAY 1
|
9 |
|
10 | // SPI port and pin definitions.
|
11 |
|
12 | #define SPI_PORT PORTB //!< SPI port output register.
|
13 | #define SPI_PIN_REG PINB //!< SPI port input register.
|
14 | #define SPI_DIR_REG DDRB //!< SPI port direction register.
|
15 | #define SPI_CLOCK_PIN PB7 //!< SPI clock I/O pin.
|
16 | #define SPI_DATAIN_PIN PB5 //!< SPI data input pin.
|
17 | #define SPI_DATAOUT_PIN PB6 //!< SPI data output pin.
|
18 | #define SPI_CS_PIN PB4 //!< SPI Cock Select pin.
|
19 |
|
20 |
|
21 | void spi_init(){
|
22 | // outputs
|
23 | SPI_DIR_REG |= ( 1<< SPI_CLOCK_PIN | 1<< SPI_CS_PIN );
|
24 | // inputs
|
25 | // when 4 wire mode is choosen, define DI- and DO- pin mode here
|
26 | }
|
27 |
|
28 |
|
29 | void spi_chip_enable()
|
30 | {
|
31 | CS_REG &= ~(1<<CS_PIN); // ~CS = 0 -> enable slave device;
|
32 | _delay_us(10); //später durch _delay_cycles ersetzen
|
33 | }
|
34 |
|
35 | void spi_chip_disable()
|
36 | {
|
37 | // _delay_us(SPI_DEVICE_T_DELAY); // see ADXL345 Data Sheet Figure 37 to 39
|
38 | _delay_us(10); //später durch _delay_cycles ersetzen!
|
39 | CS_REG |= (1<<CS_PIN); // ~CS = 1 -> disable slave device;
|
40 | }
|
41 |
|
42 |
|
43 | //**************************************************************
|
44 | //***********[ READ BYTE FROM SPI without USI ]*****************
|
45 | //**************************************************************
|
46 |
|
47 | unsigned char spi_read_byte( unsigned char address ){
|
48 |
|
49 | unsigned char cnt, data;
|
50 |
|
51 | //******************** transmitt byte *********************************
|
52 |
|
53 | // configure IO pin functions (not nessesary for 4-wire spi but for 3 wire mode)
|
54 | SPI_DIR_REG |= ( 1<< SPI_DATAOUT_PIN); //!< USI port direction register
|
55 |
|
56 | // 0x80: read(single byte) mode
|
57 | data = ( 0x80 | (address & 0x3F) );
|
58 | cnt = 0;
|
59 |
|
60 | spi_chip_enable();
|
61 |
|
62 | if( ( (data << cnt) & 0x80 ) )
|
63 | SPI_PORT |= (1<< SPI_DATAOUT_PIN); //
|
64 | else
|
65 | SPI_PORT &= ~(1<< SPI_DATAOUT_PIN); //
|
66 |
|
67 | _delay_ms(1); // t_delay (ADXL345)
|
68 |
|
69 | // generate SLK
|
70 | SPI_PORT &= ~(1<< SPI_CLOCK_PIN); //
|
71 | _delay_ms(20); // _delay_us(1000000/(2*SPI_CLK));
|
72 | SPI_PORT |= (1<< SPI_CLOCK_PIN); //
|
73 | _delay_ms(20); // _delay_us(1000000/(2*SPI_CLK));
|
74 | cnt++;
|
75 |
|
76 | do{
|
77 | // transmitt data
|
78 | if( ( (data << cnt) & 0x80 ) )
|
79 | SPI_PORT |= (1<< SPI_DATAOUT_PIN); //
|
80 | else
|
81 | SPI_PORT &= ~(1<< SPI_DATAOUT_PIN); //
|
82 |
|
83 | // generate SLK
|
84 | SPI_PORT &= ~(1<< SPI_CLOCK_PIN); //
|
85 | _delay_ms(20); // _delay_us(1000000/(2*SPI_CLK));
|
86 | SPI_PORT |= (1<< SPI_CLOCK_PIN); //
|
87 | _delay_ms(20); // _delay_us(1000000/(2*SPI_CLK));
|
88 |
|
89 | cnt++;
|
90 |
|
91 | }while ( cnt < 8 ); // stop when 8bits are transmitted
|
92 |
|
93 | //******************** receive byte *******************************
|
94 |
|
95 | // configure IO pin functions (not nessesary for 4-wire spi but for 3 wire mode)
|
96 | SPI_DIR_REG &= ~( 1<< SPI_DATAIN_PIN); //
|
97 | SPI_PORT |= ( 1<< SPI_DATAIN_PIN);
|
98 | cnt = 0;
|
99 | data = 0;
|
100 |
|
101 | do{
|
102 | // generate SLK
|
103 | SPI_PORT &= ~(1<< SPI_CLOCK_PIN);
|
104 | _delay_ms(20); // _delay_us(1000000/(2*SPI_CLK));
|
105 | SPI_PORT |= (1<< SPI_CLOCK_PIN); //
|
106 |
|
107 | // read data from pin DI (sample on rising edge)
|
108 | if( SPI_PIN_REG & ( 1<< SPI_DATAIN_PIN) )
|
109 | data |= ( 1 << cnt );
|
110 |
|
111 | _delay_ms(20); // _delay_us(1000000/(2*SPI_CLK));
|
112 |
|
113 | cnt++;
|
114 | }while ( cnt < 8 ); // stop when 8 bits are transmitted
|
115 |
|
116 |
|
117 | spi_chip_disable();
|
118 |
|
119 | return data;
|
120 | }
|