Перейти к содержанию
    

Связка Attiny828 и Arduino Pro Mini по SPI

Доброго времени суток всем! Мне требуется связать Arduino Pro Mini и Attiny828 по SPI протоколу, в роли мастера будет ардуино. Никак не могу разобраться. Подключаю все верно, но передачи нет. Ошибок в коде найти не могу, делал все с помощью datasheet на аттину, изучением библиотек ардуино ну и гугла конечно:)

Вот код для Ардуино (Arduino IDE):

#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const byte SLAVE_1 = 10;
const byte SLAVE_2 = 9;

void setup() {
 // put your setup code here, to run once:
 SPI.begin();
 SPI.setClockDivider(SPI_CLOCK_DIV16);
 pinMode(SLAVE_2, OUTPUT);
 digitalWrite(SLAVE_2, HIGH);
 lcd.init();
 lcd.backlight();
 lcd.print("test");
}

byte transferAndWait(byte SLAVE)
{
 digitalWrite(SLAVE, LOW);
 delay(20);
 byte rx = SPI.transfer(3);
 delay(20);
 digitalWrite(SLAVE, HIGH);

 return rx;
}

void loop() {
 // put your main code here, to run repeatedly:
 byte data = transferAndWait(SLAVE_1);
 if(data != 0)
 {
lcd.clear();
lcd.print(data);
delay(1500);
 }

 if(transferAndWait(SLAVE_2) == 3)
 {
lcd.clear();
lcd.print("123");
delay(1500);
 }
}

 

Здесь подключаю еще к ней экранчик, чтобы видеть делается/ передается ли что то вообще.

А вот код для Аттину (Atmel Studio 7):

#define F_CPU 1000000
#define DD_MISO DDD1
#define DD_MOSI DDD0
#define DD_SCK DDD3
#define DDR_SPI DDRD

#include <avr/io.h>
#include <util/delay.h>

void SPI_SlaveInit(void)
{
DDR_SPI = (1<<DD_MISO);
SPCR = (1<<SPE);
}

char SPI_SlaveReceive(void)
{
SPDR = 3;
while(!(SPSR & (1<<SPIF)));
_delay_ms(20);
return SPDR;
}

int main(void)
{
DDRA = 0xFF;

SPI_SlaveInit();

PORTA |= (1<<PORTA5);
_delay_ms(2000);
PORTA &= ~(1<<PORTA5);
_delay_ms(500);

while (1)
{
	int data = SlaveReceive();

	if(data != 0)
	{
		for(int i = 0; i < data; i++)
		{
			PORTA |= (1<<PORTA5);
			_delay_ms(500);
			PORTA &= ~(1<<PORTA5);
			_delay_ms(500);
		}
	}
	else
	{
		PORTA |= (1<<PORTA5);
		_delay_ms(1000);
		PORTA &= ~(1<<PORTA5);
		_delay_ms(500);
	}
}
}

У Аттину код уже переделанный на 1000 раз после долгих мучений)) Вроде как застрявает программа на SlaveReceive функции или "while(!(SPSR & (1<<SPIF)))" иногда даже тут. Подключал лампочку опять же для проверки что происходит. Пробовал просто "замкнуть" MOSI и MISO на ардуино между собой, там все хорошо, передает то что нужно. Никак не могу разобраться Заранее спасибо.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Со стороны Arduino Pro Mini у Вас тактирование SPI ( SPI.setClockDivider(SPI_CLOCK_DIV16)) может быть либо 1 МГц при 5В (16МГц / SPI_CLOCK_DIV16),

либо 0.5 МГц при 3.3В (8МГц / SPI_CLOCK_DIV16).

 

В любом случае это при кварце на Attiny828 в 1Мгц (#define F_CPU 1000000) больше допустимого тактирования SPI в 0.25Мгц. (F_CPU/4).

Изменено пользователем aiwa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...