59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
|
||
#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;
|
||
}
|