DIGILIGHT
spi.c
1 #include <avr/io.h>
2 #include "spi.h"
3 //#include "../avr_helper.h"
4 //#include "../hardware.h"
5 
6 /*инициализация SPI*/
7 //void SPI_Init(void)
8 //{
9 // /*настройка портов ввода-вывода
10 // все выводы, кроме MISO выходы*/
11 // SPI_DDRX |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS);
12 // SPI_DDRX &= ~(1<<SPI_MISO);
13 //
14 // SPI_PORTX |= (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);
15 //
16 // /*разрешение spi,старший бит вперед,мастер, полярность синхронизации 0*/
17 // SPCR = (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0);
18 // SPSR = (1<<SPI2X);
19 // DDRB|= 1<<SPI_MOSI| // выход
20 // 0<<SPI_MISO| // ВХОД
21 // 1<<SPI_SCK | // выход
22 // 1<<SPI_SS; // вход
23 // DDRC|= 1<<SPI_SS; // вход
24 
25 // PORTB|= 1<<SPI_MOSI |
26 // 1<<SPI_MISO | // вкл. подтягивающий резистор
27 // 1<<SPI_SCK |
28 // 1<<SPI_SS;
29 // PORTC|= 1<<SPI_SS;
30 //--SPCR – SPI Control Register
31 // SPCR|=1<<SPE | // SPI Enable
32 // 0<<DORD| // Data Order (when the DORD bit is written to zero, the MSB of the data word is transmitted first)
33 // 1<<MSTR| // Master/Slave Select (1 for Master)
34 // 0<<CPOL| // Clock Polarity
35 // 0<<CPHA| // Clock Phase
36 // 1<<SPR1| // SPI Clock Rate (This bit control the SCK rate of the device configured as a Master.)
37 // 1<<SPR0; // SPI Clock Rate (This bit control the SCK rate of the device configured as a Master.)
38 //--SPSR – SPI Status Register
39 // SPSR|=0<<SPI2X; // Double SPI Speed Bit (стартуем на нормальной скорости)
40 //}
41 
42 /*отослать байт данных по SPI*/
43 void SPI_WriteByte(uint8_t data)
44 {
45  SPDR = data;
46  while(!(SPSR & (1<<SPIF)));
47 }
48 
49 /*получить байт данных по SPI*/
50 uint8_t SPI_ReadByte(void)
51 {
52  SPDR = 0xff;
53  while(!(SPSR & (1<<SPIF)));
54  return SPDR;
55 }
56 
57 /*отослать и получить байт данных по SPI*/
58 uint8_t SPI_WriteReadByte(uint8_t data)
59 {
60  SPDR = data;
61  while(!(SPSR & (1<<SPIF)));
62  return SPDR;
63 }
64 
65 /*отправить несколько байт данных по SPI*/
66 void SPI_WriteArray(uint8_t count, uint8_t *data)
67 {
68  while(count--){
69  SPDR = *data++;
70  while(!(SPSR & (1<<SPIF)));
71  }
72 }
73 
74 /*отправить и получить несколько байт данных по SPI*/
75 void SPI_WriteReadArray(uint8_t count, uint8_t *data)
76 {
77  while(count--){
78  SPDR = *data;
79  while(!(SPSR & (1<<SPIF)));
80  *data++ = SPDR;
81  }
82 }