// #include // #include #include "SPISlave.h" #define DDR_SPI DDRB #define DD_MOSI PB3 #define DD_MISO PB4 #define DD_SCK PB5 #define DD_SS PB2 // GyverOLED oled; static int index = 0; static int arIndex = 0; static char data[64]; // 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(); Serial.println("Initialization "); } void SetCommand(char *data2, int length){ char command = data2[0]; // Отрезать 1 элемент от оставшихся Serial.print("\nReceived command: "); Serial.println(command, HEX); switch (command){ case 6: AddSymbol(&data2[1], length-1); break; } } void AddSymbol(uint8_t *symbols, int lenght){ Serial.print("Received Add: "); // oled.setScale(3); // масштаб текста (1..4) // oled.home(); // курсор в 0,0 // oled.print("Привет!"); for(int i = 0; i < lenght - 1; i++) { char str[3]; sprintf(str, "%01X", symbols[i]); Serial.print(str); Serial.print(" "); } } // Функция для вычисления контрольной суммы XOR // char CRC8(char *data, int length) { // char crc = 0x00; // char poly = 0x07; // полином для CRC8 // for (int i = 0; i < length-2; i++) { // crc ^= data[i]; // XOR текущего байта с crc // for (int j = 0; j < length; j++) { // if (crc & 0x80) { // если старший бит crc равен 1 // crc = (crc << 1) ^ poly; // сдвигаем crc на 1 бит влево и XOR с полиномом // } else { // crc <<= 1; // иначе просто сдвигаем на 1 бит влево // } // } // } // return crc; // } // Вывод массива void arrayOut(uint8_t *arr, int size){ Serial.print("Array: "); for(int i = 0; i < size;i++){ char str[3]; sprintf(str, "%02X", arr[i]); Serial.print(str); Serial.print(" "); } Serial.println("."); } // Проверка массива на ноль // char checkArray(char *arr, int size) { // for (int i = 0; i < size; i++) { // if (arr[i] != 0) { // return 1; // } // } // return 0; // } // TODO: где то длина массива неправильно летит void loop() { if(PINB & (1 << 2)){ if(index > 0){ arrayOut(data, index); char sum = 0; sum = crc8(data, index-1); char checkNull = 0; char last_1 = data[index - 1]; Serial.println(sum, HEX); if (last_1 == sum){ Serial.println(); Serial.println("Старт вывода массивов"); Serial.println(sum, HEX); // checkNull = checkArray(data, index); // if(checkNull == 1){ // } SetCommand(data, index); Serial.println("Стоп вывода массивов"); index = 0; return; }else{ Serial.println("Nothing ..."); index = 0; } } } }