From f40daf62d4273d50cd1bad071c94e4ab1b2092c7 Mon Sep 17 00:00:00 2001 From: Soundflog Date: Tue, 25 Apr 2023 10:12:54 +0300 Subject: [PATCH] master with CRC8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit доработать --- SPI/master/master.ino | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/SPI/master/master.ino b/SPI/master/master.ino index 008dfab..0819cda 100644 --- a/SPI/master/master.ino +++ b/SPI/master/master.ino @@ -17,6 +17,7 @@ void SPI_MasterInit(void) } void Print(byte *data2, int lenght){ + Serial.println("----"); for(int i = 0; i < lenght; i++) { Serial.print(data2[i]); Serial.print(" "); @@ -73,16 +74,27 @@ void setup() // Функция для вычисления контрольной суммы XOR byte calculateXORChecksum(byte *data, int length) { - byte checksum = 0; - for (int i = 0; i < length -1; i++) { - checksum ^= data[i]; + byte crc = 0x00; + byte poly = 0x07; // полином для CRC8 + + for (int i = 0; i < length; 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 checksum; + + return crc; } void loop() { - char data[5] = {6, 1, 3, 8, 0}; + char data[8] = {6, 1, 3, 8, 8, 8, 8, 0}; int length = sizeof(data); @@ -91,27 +103,30 @@ void loop() byte checking = calculateXORChecksum(data, length); int size = sizeof(data) / sizeof(data[0]); data[size - 1] = checking; + Print(data, size); // Serial.println(last); SPI_MasterTransmit(data, length); _delay_ms(1000); - char data2[5] = {6, 9, 7, 10, 0}; + char data2[8] = {6, 9, 7, 10, 8, 8, 8, 0}; int length2 = sizeof(data2); const int last2 = data2 [ (sizeof(data2) / sizeof(data2[0]))-1]; byte checking2 = calculateXORChecksum(data2, length2); int size2 = sizeof(data2) / sizeof(data2[0]); data2[size2 - 1] = checking2; + Print(data2, size2); SPI_MasterTransmit(data2, length2); _delay_ms(1000); - char data3[5] = {6, 11, 12, 13, 0}; + char data3[8] = {6, 11, 12, 13, 8, 8, 8, 0}; int length3 = sizeof(data3); const int last3 = data3 [ (sizeof(data3) / sizeof(data3[0]))-1]; byte checking3 = calculateXORChecksum(data3, length3); int size3 = sizeof(data3) / sizeof(data3[0]); data3[size3 - 1] = checking3; + Print(data3, size3); SPI_MasterTransmit(data3, length3); _delay_ms(1000);