#include "SPIMaster.h" #include <avr/io.h> #include <util/delay.h> void SPI_MasterInit(void) { DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS); DDRB |= (1<<DDB2); SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); // SPCR = (1 << SPE) | (1 << MSTR) ; } void SPI_MasterTransmit(char *data, int length) { PORTB &= ~(1<<2); for(int i = 0; i < length; i++) { SPDR = data[i]; // отправляем байт массива while (!(SPSR & (1 << SPIF))); // ждем, пока байт передастся } PORTB |= (1<<2); } 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; }