Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Связка Attiny828 и Arduino Pro Mini по SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
player6131
Доброго времени суток всем! Мне требуется связать Arduino Pro Mini и Attiny828 по SPI протоколу, в роли мастера будет ардуино. Никак не могу разобраться. Подключаю все верно, но передачи нет. Ошибок в коде найти не могу, делал все с помощью datasheet на аттину, изучением библиотек ардуино ну и гугла конечноsm.gif
Вот код для Ардуино (Arduino IDE):
CODE
#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):
CODE
#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 на ардуино между собой, там все хорошо, передает то что нужно. Никак не могу разобраться Заранее спасибо.
aiwa
Со стороны 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).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.