From 1aa420c1ca3715dbd3e0c34c356890704d020ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B0=D0=B2=D0=B5=D0=BB=20=D0=92=D0=B5=D1=80=D1=88?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D0=BD?= Date: Sun, 16 Apr 2023 18:24:52 +0000 Subject: [PATCH] Slave --- SPI/slave.ino | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 SPI/slave.ino diff --git a/SPI/slave.ino b/SPI/slave.ino new file mode 100644 index 0000000..27ece8c --- /dev/null +++ b/SPI/slave.ino @@ -0,0 +1,100 @@ +#include +#include + +#define DDR_SPI DDRB +#define DD_MOSI PB3 +#define DD_MISO PB4 +#define DD_SCK PB5 +#define DD_SS PB2 + + +static int index = 0; +static byte data[255]; + + +void SPI_SlaveInit(void) +{ + DDR_SPI = (1 << DD_MISO); + + SPCR = (1 << SPE) | (1 << SPIE); +} + +ISR(SPI_STC_vect) +{ + char received = SPDR; + data[index] = received; + index++; +} + +void setup() +{ + Serial.begin(9600); + SPI_SlaveInit(); + Serial.println("Initialization "); +} + +void SetCommand(byte *data2){ + byte command = data2[0]; + // Отрезать 1 элемент от оставшихся + byte result[index]; + byte *ptr = &data2[1]; + strcpy(result, ptr); + Serial.print("\nReceived command: "); + Serial.println(command); + switch (command){ + + case 6: + AddSymbol(result); + break; + + } +} + + +void AddSymbol(byte *symbols){ + Serial.print("Received Add: "); + + for(int i = 0; i < index-1; i++) { + Serial.print(symbols[i]); + Serial.print(" "); + } +} + + +// Функция для вычисления контрольной суммы XOR +byte calculateXORChecksum(byte *data, int length) { + byte checksum = 0; + for (int i = 0; i < length - 1; i++) { + checksum ^= data[i]; + } + return checksum; +} + +void loop() { + if(PINB & (1 << 2)) + { + if(index > 0) + { + // byte calculatedChecksum = calculateXORChecksum(data, index); + // byte last = data[index - 1]; + // Serial.println(); + // Serial.println("--------------"); + // Serial.print("\n Last: "); + // Serial.print(last); + // Serial.print("\t Sum: "); + // Serial.println(calculatedChecksum); + + // // SPDR = calculatedChecksum; + // if (last != calculatedChecksum) + // { + // Serial.println("\n -----Invalid Checksum!---"); + + // index = 0; + // return; + // } + + SetCommand(data); + index=0; + } + } +}