-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprogramm_spi_2_slave.ino
122 lines (93 loc) · 4.06 KB
/
programm_spi_2_slave.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Chip type ATmega168 at 16 MHz
// Пример реализации протокола SPI slave
//модель MSBFIRST
//mode 0
//передача 8 бит
//если передача состоялась, то лампочка загорается
// датчик взаимодействует через шину SPI, поэтому подключаем библиотеку:
#include <SPI.h>
// пропишем пины
//slave
#define spi_cs 3 // это D6 ардуино считывание данных chipselect
#define spi_MOSI 7 // это D7 ардуино считывание данных MOSI
#define spi_MISO 8 // это D8 ардуино MISO управление состоянием порта
#define spi_clk 2 // D9 ардуино считывание данных
#define Interrupt_PIN_2 0 //PIN 2 это Clk slave устройства
#define Interrupt_PIN_3 1 //PIN 3 это CS slave устройства
#define TRANSM_BYTE_SLAVE 0xBD //байт, который мы передает слэйв
//master
#define TRANSM_BYTE_MASTER 0xA5//байт, который мы передает master
const int CS = 10;
const int LED_1_PIN = 19; // для тестовой лампочки
char transm_byte_slave = TRANSM_BYTE_SLAVE ; //байт, который мы передает слэйв и храниит, полученное значение
char transm_byte_master = TRANSM_BYTE_MASTER;
char result = 0;// результат для возврата master
int i=0;
void setup()
{
Serial.begin(9600);
initSpi_slave ();
// запустить библиотеку SPI:
SPI.beginTransaction(SPISettings(10000, MSBFIRST, SPI_MODE0));
SPI.begin();
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);
digitalWrite(LED_1_PIN, LOW); // лампочка не горит
}
void loop()
{
// установить на выводе выбора чипа лог. 0, чтобы выбрать датчик:
attachInterrupt(Interrupt_PIN_2, clk_on, CHANGE); // разрешаем прерывание
attachInterrupt(Interrupt_PIN_3, activ_spi_slave, FALLING); // разрешаем прерывание
delay(100);
digitalWrite(CS, LOW);
Serial.println("start");
result = SPI.transfer( transm_byte_master);
Serial.println("End");
digitalWrite(CS, HIGH);
SPI.end();
detachInterrupt(Interrupt_PIN_2);
detachInterrupt(Interrupt_PIN_3);
//сравнение полученных результатов с ожидаемыми
if ((result == TRANSM_BYTE_SLAVE )&&(transm_byte_slave == TRANSM_BYTE_MASTER ))
{
Serial.println("OK");
digitalWrite(LED_1_PIN, HIGH); // лампочка горит
}
}
void initSpi_slave ()
{
// инициализация линий.....
pinMode(LED_1_PIN, OUTPUT);
pinMode( spi_MOSI, INPUT);
pinMode(spi_MISO , OUTPUT);
delay(1); // ждем устаканивания питания
}
//иммитация работы slave устройства
//с помощью прерываний
//при выборе устройства
void activ_spi_slave()
{
if (transm_byte_slave & 0x80) digitalWrite(spi_MISO, HIGH); else digitalWrite(spi_MISO, LOW) ; // выставляем один бит
// 0b########
//& 0b10000000
// 0b#0000000 т.е. byte & 0x80 — оставляет старший разряд , условие не сработает, если страший разряд будет равен 0
transm_byte_slave<<=1;
Serial.print("отпраляем первый бит ");
}
//при зменение фронта clk
void clk_on()
{
if(digitalRead(spi_clk))
{
if (digitalRead(spi_MOSI)) transm_byte_slave++; // читаем бит и записываем его
Serial.print("Читаем бит "); Serial.println(i+1);
}
else
{
Serial.print("отпраляем бит "); Serial.println(i+1);
if (transm_byte_slave & 0x80) digitalWrite(spi_MISO, HIGH); else digitalWrite(spi_MISO, LOW); // выставляем один бит
if (i!=7) transm_byte_slave<<=1;
i++;
}
}