diff --git a/MASTER.ino b/MASTER.ino new file mode 100644 index 0000000..24ad964 --- /dev/null +++ b/MASTER.ino @@ -0,0 +1,75 @@ +#include <avr/interrupt.h> +#include <avr/io.h> + +#define SPI_PORTX PORTB +#define SPI_DDRX DDRB + +#define SPI_MISO 4 +#define SPI_MOSI 3 +#define SPI_SCK 5 +#define SPI_SS 2 + + + +void SPI_MasterInit(void) +{ + /* Настройка MOSI и SCK как выход, + все остальные сигналы как вход: */ + SPI_DDRX = (1 << SPI_MOSI)|(1 << SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO); + /* Разрешить работу SPI, режим Master, + установить скорость тактов fck/16: */ + SPCR = (1 << SPE)|(1 << MSTR)|(0<<CPOL)|(0<<CPHA)|(1 << SPR0); + SPI_PORTX |= (1 << SPI_SS); +} + + +void SPI_MasterTransmit(char* buffer, size_t length) +{ + SPI_PORTX &= ~(1 << SPI_SS); + + for(int i=0; i<length; i++ ){ + SPDR = buffer[i]; + while(!(SPSR & (1 << SPIF))); + Serial.println("Transmitede"); + delay(2000); + } + SPI_PORTX |= (1 << SPI_SS); +} + +byte crc8(byte *data, int length) { + byte crc = 0x00; + byte poly = 0x07; //полином для CRC + for (int i=0; i<length-2; 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; +} + + +void setup() { + SPI_MasterInit(); + Serial.begin(9600); + Serial.println("Arduino 1 starded"); +} + + +void loop() { + char buffer[] = {'a', 't', 'g', '1', 0}; + for(int y=5; y<21; y++) { + buffer[0]=0x06; + buffer[1]=3; + buffer[2]=y; + buffer[3]=0x01; + buffer[4]=crc8(&buffer[0], 4); + SPI_MasterTransmit(&buffer[0], 5); + + } + +} diff --git a/sketch_apr13a2.ino b/sketch_apr13a2.ino new file mode 100644 index 0000000..b75ac01 --- /dev/null +++ b/sketch_apr13a2.ino @@ -0,0 +1,85 @@ +#include <avr/interrupt.h> +#include <avr/io.h> + +#define SPI_PORTX PORTB +#define SPI_DDRX DDRB + +#define SPI_MISO 4 +#define SPI_MOSI 3 +#define SPI_SCK 5 +#define SPI_SS 2 + + + +void SPI_MasterInit(void) +{ + /* Настройка MOSI и SCK как выход, + все остальные сигналы как вход: */ + SPI_DDRX = (1 << SPI_MOSI)|(1 << SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO); + /* Разрешить работу SPI, режим Master, + установить скорость тактов fck/16: */ + SPCR = (1 << SPE)|(1 << MSTR)|(0<<CPOL)|(0<<CPHA)|(1 << SPR0); + SPI_PORTX |= (1 << SPI_SS); +} + + +void SPI_MasterTransmit(char* buffer, size_t length) +{ + SPI_PORTX &= ~(1 << SPI_SS); + + for(int i=0; i<length; i++ ){ + SPDR = buffer[i]; + while(!(SPSR & (1 << SPIF))); + Serial.println("Transmitede"); + delay(2000); + } + SPI_PORTX |= (1 << SPI_SS); +} + +byte crc8(byte* data, int length) { + byte crc = 0x00; + byte poly = 0x07; + for (int i=0; i<length-2; i++){ + crc ^= data[i]; + for (int j=0; j<length; j++) { + if (crc & 0x80){ + crc = (crc << 1) ^ poly; + }else{ + crc <<= 1; + } + } + } + return crc; +} +/*void SPI_MasterTransmit(char cData) +{ + Serial.println("SPI_MasterTransmitSPI_MasterTransmitSPI_MasterTransmit"); + SPI_PORTX &= ~(1 << SPI_SS); + Запуск передачи данных: + SPDR = cData; + Ожидание завершения передачи: + while(!(SPSR & (1 << SPIF))); + Serial.println("Transmitede"); + SPI_PORTX |= (1 << SPI_SS); +}*/ + +void setup() { + SPI_MasterInit(); + Serial.begin(9600); + Serial.println("Arduino 1 starded"); +} + + +void loop() { + char buffer[] = {'a', 't', 'g', '1', 0}; + for(int y=5; y<21; y++) { + buffer[0]=0x06; + buffer[1]=3; + buffer[2]=y; + buffer[3]=0x01; + buffer[4]=crc8; + SPI_MasterTransmit(&buffer[0], 5); + + } + +}