#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;
}