SHIELD-Malb41k1/SPI/master/master.ino
2023-04-17 17:57:11 +03:00

129 lines
3.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//master
#include <avr/io.h>
#include <util/delay.h>
#define DDR_SPI DDRB
#define DD_MOSI PB3
#define DD_MISO PB4
#define DD_SCK PB5
#define DD_SS PB2
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);
}
void Print(byte *data2, int lenght){
for(int i = 0; i < lenght; i++) {
Serial.print(data2[i]);
Serial.print(" ");
}
}
void SPI_MasterTransmit(char *data, int length)
{
PORTB &= ~(1<<2);
// Serial.println();
int size = sizeof(data) / sizeof(data[0]);
if (data[size - 1] == SPDR){
Serial.println("Privet") ;
}
byte check = 0;
byte spdr[length];
Serial.println();
for(int i = 0; i < length; i++) {
SPDR = data[i]; // отправляем байт массива
Serial.print(data[i], HEX);
Serial.print(" ");
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()
{
Serial.begin(9600);
SPI_MasterInit();
Serial.println("Master Initialization ");
}
// Функция для вычисления контрольной суммы XOR
byte calculateXORChecksum(byte *data, int length) {
byte checksum = 0;
for (int i = 0; i < length -1; i++) {
checksum ^= data[i];
}
return checksum;
}
void loop()
{
char data[5] = {6, 1, 3, 8, 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;
// Serial.println(last);
SPI_MasterTransmit(data, length);
_delay_ms(1000);
char data2[5] = {6, 9, 7, 10, 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;
SPI_MasterTransmit(data2, length2);
_delay_ms(1000);
char data3[5] = {6, 11, 12, 13, 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;
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");
// }
}