player631 0 13 июля, 2016 Опубликовано 13 июля, 2016 (изменено) · Жалоба Доброго времени суток всем! Мне требуется связать 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 на ардуино между собой, там все хорошо, передает то что нужно. Никак не могу разобраться Заранее спасибо. Изменено 13 июля, 2016 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 14 июля, 2016 Опубликовано 14 июля, 2016 (изменено) · Жалоба Со стороны 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). Изменено 14 июля, 2016 пользователем aiwa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться