Страница 1 из 1
Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 00:38:31
КАШАК
Доброго времени суток
Надо сделать обмен данными по SPI на Mega8. Взял абсолютно рабочий код с Mega16, изменил под Mega8, запускаю, а он не работает. При попытке послать данные, МК намертво зависает. Выяснил, что это происходит из-за строчки:
А без нее, естественно, получается каша вместо данных. Настроен SPI вот так:
Передача данных идет вот так:
Код: Выделить всё
void spi_write(unsigned char adress, unsigned char data){
CE_LOW; // низкий уровень на CE, инициализация начала обмена данными
SPDR = adress; // передача адреса
while(!(SPSR & (1<<SPIF))); // ждем, если линия зянята
SPDR = data; // передача данных
while(!(SPSR & (1<<SPIF))); // ждем, если линия зянята
CE_HIGH; // высокий уровень на CE, конец обмена данными
}
На Mega16 работает идеально, а на Mega8 виснет. Тактовая частота одинаковая, 12 МГц. Из-за чего это может быть?
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:08:03
SergeBS
Из-за того, что порт ввода-вывода забыл настроить. По крайней мере тут не показал, как он настроен.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:13:20
КАШАК
Да настроил я его:
Код: Выделить всё
#define SPI_PORT PORTB // spi порт
#define SPI_DDR DDRB
#define CE_PIN 1 // линия ce
#define MOSI_PIN 3 // линия mosi
#define MISO_PIN 4 // линия miso
#define SCK_PIN 5 // линия sck
DDRB |= (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
SPI_PORT |= (1<<MOSI_PIN)|(1<<SCK_PIN)|(1<<MISO_PIN);
DDRD |= (1<<CE_PIN);
PORTD |= (1<<CE_PIN);
В Mega16 то же самое, только вывод CE на том же порту, что и остальные.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:23:14
SergeBS
КАШАК писал(а):Да настроил я его:
Код: Выделить всё
DDRB |= (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
SPI_PORT |= (1<<MOSI_PIN)|(1<<SCK_PIN)|(1<<MISO_PIN);
В Mega16 то же самое, только вывод CE на том же порту, что и остальные.
MOSI и MISO - выходы, и ждешь данные? Оригинально. 0 так в DDR для MISO не запихнешь. Если было 1, останется 1.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:26:34
КАШАК
В смысле выходы? MOSI - вход, MISO - выход.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:33:04
SergeBS
DDR_XXXX: 1 - выход, 0 - вход. По ИЛИ 0 не запихнешь.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:44:31
КАШАК
Убрал ИЛИ, ничего не изменилось. Виснет на передаче...
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:50:17
SergeBS
DDRB |= (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
В смысле выходы? MOSI - вход, MISO - выход.
DDR_XXXX: 1 - выход, 0 - вход. Т.е. с точностью до наоборот. ТУТ MOSI_PIN - OUTPUT.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:55:44
SergeBS
Короче где выход, где вход - я пока не понял. Словами - одно, инициализация - наоборот. А как правильно - поздно уже, не въезжаю. Завтра (т.е. сегодня после старательного плющенья подушки).
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 01:58:57
КАШАК
Сейчас сделал так
Код: Выделить всё
DDRB = (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
Заметил еще одну странную особенность. Если ничего не подсоединять к МК, то при чтении из SPI получаю 255, только с какой-то заторможенностью. А если подсоединить вывод SCK, все зависает. Вот это мне вообще непонятно, как SCK может влиять на передачу?
В общем утро вечера мудренее.

Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 07:32:53
dosikus
КАШАК писал(а):Сейчас сделал так
Код: Выделить всё
DDRB = (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
Абздец ...
Код: Выделить всё
DDRB |= (1<<MOSI_PIN)|(1<<SCK_PIN);
DDRB &= ~(1<<MISO_PIN);
Вы бы читать начали для приличия ...
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 09:15:34
ibiza11
dosikus писал(а):Абздец ...
да все там нормально, у него идет присваивание, а не наложение маски. Хоть и выражение (0<<MISO_PIN) не имеет смысла в том контексте)))) Остальная часть порта B видимо не используется. Хотя я бы сделал, так как и Вы,
dosikus.
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 09:42:54
san4esmc
Для инициализации SPI Master на AVR нужно либо устанавливать SS как выход, либо подтягивать к питанию:
When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the
direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the SPI system. Typically, the pin will be driving the SS pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master SPI operation.
P.S.: Для ATmega8 SS = PB2
Re: Отказывается работать SPI на Mega8
Добавлено: Ср май 15, 2013 09:59:15
s_black
КАШАК писал(а):
Надо сделать обмен данными по SPI на Mega8. Взял абсолютно рабочий код с Mega16, изменил под Mega8, запускаю, а он не работает.
Здесь есть рабочий код для 8-й меги. Посмотрите, может что-то себе возьмете.
Re: Отказывается работать SPI на Mega8
Добавлено: Чт май 16, 2013 01:12:46
КАШАК
san4esmc писал(а):Для инициализации SPI Master на AVR нужно либо устанавливать SS как выход, либо подтягивать к питанию:
When the SPI is configured as a Master (MSTR in SPCR is set), the user can determine the
direction of the SS pin.
If SS is configured as an output, the pin is a general output pin which does not affect the SPI system. Typically, the pin will be driving the SS pin of the SPI Slave.
If SS is configured as an input, it must be held high to ensure Master SPI operation.
P.S.: Для ATmega8 SS = PB2
Точно, и как я мог забыть про это! Привык, что CE всегда на SS вешаю и из головы вылетело

Огромное спасибо за напоминание, теперь все работает
