Отказывается работать SPI на Mega8

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Доброго времени суток :)

Надо сделать обмен данными по SPI на Mega8. Взял абсолютно рабочий код с Mega16, изменил под Mega8, запускаю, а он не работает. При попытке послать данные, МК намертво зависает. Выяснил, что это происходит из-за строчки:

Код: Выделить всё

while(!(SPSR & (1<<SPIF)));
А без нее, естественно, получается каша вместо данных. Настроен SPI вот так:

Код: Выделить всё

SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
Передача данных идет вот так:

Код: Выделить всё

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 МГц. Из-за чего это может быть?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение SergeBS »

Из-за того, что порт ввода-вывода забыл настроить. По крайней мере тут не показал, как он настроен.
Человек - это звучит гордо, а обезьяна - объективно...
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Да настроил я его:

Код: Выделить всё

#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 на том же порту, что и остальные.
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение 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.
Последний раз редактировалось SergeBS Ср май 15, 2013 01:31:08, всего редактировалось 1 раз.
Человек - это звучит гордо, а обезьяна - объективно...
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

В смысле выходы? MOSI - вход, MISO - выход.
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение SergeBS »

DDR_XXXX: 1 - выход, 0 - вход. По ИЛИ 0 не запихнешь.
Человек - это звучит гордо, а обезьяна - объективно...
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Убрал ИЛИ, ничего не изменилось. Виснет на передаче...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение SergeBS »

DDRB |= (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
В смысле выходы? MOSI - вход, MISO - выход.
DDR_XXXX: 1 - выход, 0 - вход. Т.е. с точностью до наоборот. ТУТ MOSI_PIN - OUTPUT.
Человек - это звучит гордо, а обезьяна - объективно...
Вымогатель припоя
Аватара пользователя
Сообщения: 683
Зарегистрирован: Пт апр 11, 2008 11:24:53
Откуда: Владимир

Сообщение SergeBS »

Короче где выход, где вход - я пока не понял. Словами - одно, инициализация - наоборот. А как правильно - поздно уже, не въезжаю. Завтра (т.е. сегодня после старательного плющенья подушки).
Человек - это звучит гордо, а обезьяна - объективно...
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

Сейчас сделал так

Код: Выделить всё

DDRB = (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
Заметил еще одну странную особенность. Если ничего не подсоединять к МК, то при чтении из SPI получаю 255, только с какой-то заторможенностью. А если подсоединить вывод SCK, все зависает. Вот это мне вообще непонятно, как SCK может влиять на передачу?

В общем утро вечера мудренее. :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

КАШАК писал(а):Сейчас сделал так

Код: Выделить всё

DDRB = (1<<MOSI_PIN)|(1<<SCK_PIN)|(0<<MISO_PIN);
Абздец ...

Код: Выделить всё

DDRB |= (1<<MOSI_PIN)|(1<<SCK_PIN);
           DDRB &= ~(1<<MISO_PIN);
Вы бы читать начали для приличия ...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

dosikus писал(а):Абздец ...
да все там нормально, у него идет присваивание, а не наложение маски. Хоть и выражение (0<<MISO_PIN) не имеет смысла в том контексте)))) Остальная часть порта B видимо не используется. Хотя я бы сделал, так как и Вы, dosikus.
Ставим плюсы: )
Родился
Сообщения: 12
Зарегистрирован: Вт апр 30, 2013 17:29:16

Сообщение 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
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

КАШАК писал(а): Надо сделать обмен данными по SPI на Mega8. Взял абсолютно рабочий код с Mega16, изменил под Mega8, запускаю, а он не работает.
Здесь есть рабочий код для 8-й меги. Посмотрите, может что-то себе возьмете.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

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 вешаю и из головы вылетело :oops: Огромное спасибо за напоминание, теперь все работает :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
Ответить

Вернуться в «AVR»