60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
#include <avr/io.h>
|
||
#include "SPISlave.h"
|
||
#include "head_oled_i2c.h"
|
||
|
||
static int index = 0;
|
||
static int arIndex = 0;
|
||
static char data[255];
|
||
|
||
void SPI_SlaveInit(void)
|
||
{
|
||
DDR_SPI = (1 << DD_MISO);
|
||
SPCR = (1 << SPE) | (1 << SPIE);
|
||
}
|
||
|
||
// Функция для вычисления контрольной суммы XOR
|
||
char CRC8(char *data, int length) {
|
||
char crc = 0x00;
|
||
char 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 crc;
|
||
}
|
||
|
||
char crc8(char *data, int len) {
|
||
char crc = 0x00;
|
||
while (len--) {
|
||
crc ^= *data++;
|
||
for (int i = 0; i < 8; i++) {
|
||
if (crc & 0x80) {
|
||
crc = (crc << 1) ^ 0x07;
|
||
} else {
|
||
crc <<= 1;
|
||
}
|
||
}
|
||
}
|
||
return crc;
|
||
}
|
||
|
||
|
||
// Проверка массива на ноль
|
||
char checkArray(char *arr, int size) {
|
||
for (int i = 0; i < size; i++) {
|
||
if (arr[i] != 0) {
|
||
return 1;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|