Добавлен CRC
This commit is contained in:
+21
-71
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user