master with CRC8

доработать
This commit is contained in:
Павел Вершинин 2023-04-25 10:12:54 +03:00
parent 6c18113b38
commit f40daf62d4

View File

@ -17,6 +17,7 @@ void SPI_MasterInit(void)
} }
void Print(byte *data2, int lenght){ void Print(byte *data2, int lenght){
Serial.println("----");
for(int i = 0; i < lenght; i++) { for(int i = 0; i < lenght; i++) {
Serial.print(data2[i]); Serial.print(data2[i]);
Serial.print(" "); Serial.print(" ");
@ -73,16 +74,27 @@ void setup()
// Функция для вычисления контрольной суммы XOR // Функция для вычисления контрольной суммы XOR
byte calculateXORChecksum(byte *data, int length) { byte calculateXORChecksum(byte *data, int length) {
byte checksum = 0; byte crc = 0x00;
for (int i = 0; i < length -1; i++) { byte poly = 0x07; // полином для CRC8
checksum ^= data[i];
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() 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); int length = sizeof(data);
@ -91,27 +103,30 @@ void loop()
byte checking = calculateXORChecksum(data, length); byte checking = calculateXORChecksum(data, length);
int size = sizeof(data) / sizeof(data[0]); int size = sizeof(data) / sizeof(data[0]);
data[size - 1] = checking; data[size - 1] = checking;
Print(data, size);
// Serial.println(last); // Serial.println(last);
SPI_MasterTransmit(data, length); SPI_MasterTransmit(data, length);
_delay_ms(1000); _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); int length2 = sizeof(data2);
const int last2 = data2 [ (sizeof(data2) / sizeof(data2[0]))-1]; const int last2 = data2 [ (sizeof(data2) / sizeof(data2[0]))-1];
byte checking2 = calculateXORChecksum(data2, length2); byte checking2 = calculateXORChecksum(data2, length2);
int size2 = sizeof(data2) / sizeof(data2[0]); int size2 = sizeof(data2) / sizeof(data2[0]);
data2[size2 - 1] = checking2; data2[size2 - 1] = checking2;
Print(data2, size2);
SPI_MasterTransmit(data2, length2); SPI_MasterTransmit(data2, length2);
_delay_ms(1000); _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); int length3 = sizeof(data3);
const int last3 = data3 [ (sizeof(data3) / sizeof(data3[0]))-1]; const int last3 = data3 [ (sizeof(data3) / sizeof(data3[0]))-1];
byte checking3 = calculateXORChecksum(data3, length3); byte checking3 = calculateXORChecksum(data3, length3);
int size3 = sizeof(data3) / sizeof(data3[0]); int size3 = sizeof(data3) / sizeof(data3[0]);
data3[size3 - 1] = checking3; data3[size3 - 1] = checking3;
Print(data3, size3);
SPI_MasterTransmit(data3, length3); SPI_MasterTransmit(data3, length3);
_delay_ms(1000); _delay_ms(1000);