Теперь подробно. На изображениях ниже приведена схема в протеусе и настройки самих микроконтроллеров.
Далее, приведен код прошивки каждого из устройств.
Мастер (U1):
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void SPI_Init(void)
{
DDRB |= (1 << PB2) | (1 << PB3) | (1 << PB5); //Настроить выводы DDRB на выход
SPCR |= (1<<MSTR)|(1<<SPR0); //Режим мастер, F=Fosc/16
SPCR |=(1<<SPE);//Включить SPI
PORTB |= (1 << PB2);
}
void SPI_Send_byte(char data)
{
PORTB &= ~(1 << PB2);
SPDR = data; //Отправить байт
while(!(SPSR&(1<<SPIF))) ; //Дождаться окончания передачи
PORTB |= (1 << PB2);
}
int main(void)
{
SPI_Init();
_delay_ms(20);
while (1)
{
SPI_Send_byte('H');
}
}
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
void SPI_Init_Slave(void)
{
DDRB &= ~((1<<2)|(1<<3)|(1<<5)); // SCK, MOSI and SS as inputs
DDRB |= (1<<4);
SPCR |= (1<<SPR0);
SPCR |=(1<<SPE); //Включить SPI
SPSR = 0x00; SPDR = 0x00;
}
char SPI_Receive(void)
{
while (!(SPSR & (1 << SPIF)));
return SPDR;
}
int main(void)
{
char letter;
SPI_Init_Slave();
while (1)
{
letter = SPI_Receive();
}
}Привожу фотку, на которой показана передача данных, а так же факт того, что данные не записываются в регистр SPDR (U2) -
Прошу помочь понять на каком этапе я ошибаюсь, чтобы исправить проблему. Заранее спасибо!



