Добавлен CRC

This commit is contained in:
2023-04-26 12:38:06 +03:00
parent f40daf62d4
commit a71fd231fc
2 changed files with 79 additions and 177 deletions
+21 -71
View File
@@ -10,16 +10,17 @@
void SPI_MasterInit(void)
{
DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS);
DDRB |= (1<<DDB2); // set SS as output
SPCR = (1 << SPE) | (1 << MSTR);
DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK) | (1 << DD_SS);
DDRB |= (1<<DDB2); // set SS as output
SPCR = (1 << SPE) | (1 << MSTR);
// SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << DORD) | (1 << CPOL) | (1 << CPHA) | (1 << SPE);
// SPSR = (1 << SPI2X) | (1 << WCOL) | (1 << SPIF);
}
void Print(byte *data2, int lenght){
Serial.println("----");
for(int i = 0; i < lenght; i++) {
Serial.print(data2[i]);
Serial.print(data2[i], HEX);
Serial.print(" ");
}
}
@@ -44,25 +45,6 @@ void SPI_MasterTransmit(char *data, int length)
while (!(SPSR & (1 << SPIF))); // ждем, пока байт передастся
}
PORTB |= (1<<2);
// Print(spdr, length);
// return check;
// //ждем, пока придет контрольная сумма
// while (!(SPSR & (1 << SPIF)));
// uint8_t received_checksum = SPDR;
// // вычисляем контрольную сумму XOR для принятых данных
// uint8_t calculated_checksum = calculateXORChecksum((byte*)data, length);
// Serial.println();
// Serial.println(received_checksum);
// // проверяем, совпадает ли принятая контрольная сумма с вычисленной
// if (received_checksum == calculated_checksum) {
// Serial.println("\nChecksum is correct");
// } else {
// Serial.println("\nChecksum is incorrect");
// }
}
void setup()
@@ -77,7 +59,7 @@ byte calculateXORChecksum(byte *data, int length) {
byte crc = 0x00;
byte poly = 0x07; // полином для CRC8
for (int i = 0; i < length; i++) {
for (int i = 0; i < length-2; i++) {
crc ^= data[i]; // XOR текущего байта с crc
for (int j = 0; j < length; j++) {
@@ -92,53 +74,21 @@ byte calculateXORChecksum(byte *data, int length) {
return crc;
}
void loop()
{
char data[8] = {6, 1, 3, 8, 8, 8, 8, 0};
int length = sizeof(data);
char data[] = {6, 1, 3, 5, 16, 17, 18, 0};
int length = sizeof(data);
const int last = data [ (sizeof(data) / sizeof(data[0]))-1];
byte checking = calculateXORChecksum(data, length);
int size = sizeof(data) / sizeof(data[0]);
data[size - 1] = checking;
Print(data, size);
// Serial.println(last);
SPI_MasterTransmit(data, length);
_delay_ms(1000);
char data2[8] = {6, 9, 7, 10, 8, 8, 8, 0};
int length2 = sizeof(data2);
const int last2 = data2 [ (sizeof(data2) / sizeof(data2[0]))-1];
byte checking2 = calculateXORChecksum(data2, length2);
int size2 = sizeof(data2) / sizeof(data2[0]);
data2[size2 - 1] = checking2;
Print(data2, size2);
SPI_MasterTransmit(data2, length2);
_delay_ms(1000);
char data3[8] = {6, 11, 12, 13, 8, 8, 8, 0};
int length3 = sizeof(data3);
const int last3 = data3 [ (sizeof(data3) / sizeof(data3[0]))-1];
byte checking3 = calculateXORChecksum(data3, length3);
int size3 = sizeof(data3) / sizeof(data3[0]);
data3[size3 - 1] = checking3;
Print(data3, size3);
SPI_MasterTransmit(data3, length3);
_delay_ms(1000);
// ожидаем ответа
// while (!(SPSR & (1 << SPIF)));
// byte response = SPDR;
// if (response == 0x55) { // 0x55 - успешный ответ
// Serial.println("Command executed successfully");
// } else if (response == 0xAA) { // 0xAA - ошибка контрольной суммы
// Serial.println("Error: Checksum does not match");
// } else { // другие значения - неизвестный ответ
// Serial.println("Error: Unknown response");
// }
const int last = data [ (sizeof(data) / sizeof(data[0]))-1];
byte checking = calculateXORChecksum(data, length-1);
int size = sizeof(data) / sizeof(data[0]);
data[size - 1] = checking;
Print(data, size);
// Serial.println(last);
SPI_MasterTransmit(data, length);
_delay_ms(1000);
}