ATmega328P SPI Master SS-pin - errata?????

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

коллеги, у кого есть возможность проверить, прошу проверить и рассказать, есть проблема или нет.

суть: SPI настраивается в режим мастера, при этом пин SS как бы не участвует в работе и может быть испольован как обычный пин ввода-вывода (если я верно понял даташит). так вот, я конфигурирую этот пин SS на вход с подтяжкой, просаживаю его на землю, и все - SPI в режиме мастера не работает. для WS2812b я использую SPI с передачей по ожиданию конца передачи - конец передачи не наступает, на MOSI ничего не меняется. стоит оторвать SS от земли - все работает.

тут есть следующие варианты:
1. я чего-то недопонял в логике работы SPI в режиме мастера. как бы маловероятно, все-таки не первый день замужем... но вдруг?
2. я получил из Китая левак с вышеописанным дефектом (TQFP32 корпус, есличо)
3. это проблема всех 328-ых мег, но тогда почему в Errata нет ни слова об этом?!

помогите разобраться!

Добавлено after 4 minutes 15 seconds:
в догонку:


мой рабочий код инициализации SPI:

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

// на SS единичка подана заранее в другом месте	
	DDR(SPI_PORT) |= MOSI_PIN | SCK_PIN;
	SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPHA);
	SPSR = _BV(SPI2X);
	SPDR=1;
этот код работает только в том случае, если SS оторван от земли.

вот так работает, но, естественно, раскаляется кристалл (из-за чего подумал, что спалил, пришлось перепаивать), т.к. в нормальном режиме у меня SS на земле глухо:

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

	DDR(SPI_PORT) |= MOSI_PIN | SCK_PIN | SS_PIN; // т.е. SS на выход принудительно
	SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPHA);
	SPSR = _BV(SPI2X);
	SPDR=1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Спойлер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. If the SS pin is driven low by
peripheral circuitry when the SPI is configured as a Master with the SS pin defined as an input, the SPI system
interprets this as another master selecting the SPI as a slave and starting to send data to it. To avoid bus
contention, the SPI system takes the following actions:
1. The MSTR bit in SPCR is cleared and the SPI system becomes a Slave. As a result of the SPI becoming
a Slave, the MOSI and SCK pins become inputs.
2. The SPIF Flag in SPSR is set, and if the SPI interrupt is enabled, and the I-bit in SREG is set, the interrupt
routine will be executed.
Thus, when interrupt-driven SPI transmission is used in Master mode, and there exists a possibility that SS is
driven low, the interrupt should always check that the MSTR bit is still set. If the MSTR bit has been cleared by
a slave select, it must be set by the user to re-enable SPI Master mode.
Страница 165 datasheet ATmega48A/PA/88A/PA/168A/PA/328/P [DATASHEET] Atmel-8271J-AVR- ATmega-Datasheet_11/2015
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Самсусамыч

Сообщение Самсусамыч »

Это проблема всех ATmega…
Если же микроконтроллер находится в режиме «Master» (разряд MSTR регистра SPCR установлен в «1»), направление передачи данных через вывод SS определяется пользователем. Если вывод сконфигурирован как выход, он работает как линия вывода общего назначения и не влияет на работу модуля SPI. Как правило, в этом случае он используется для управления выводом SS микроконтроллера, работающего в режиме «Slave».
Если же вывод сконфигурирован как вход, то для обеспечения нормальной работы модуля SPI, на него должно быть подано напряжение ВЫСОКОГО уровня. Подача на этот вход напряжения НИЗКОГО уровня от какой-либо внешней схемы будет воспринята модулем SPI как выбор данного микроконтроллера в качестве ведомого, и соответственно, начало передачи ему данных. Во избежание конфликта на шине модуль SPI в таких случаях выполняет следующие действия:
1. Флаг MSTR регистра SPCR сбрасывается, и микроконтроллер
переключается в режим «Slave». Как следствие, выводы MOSI и
SCK начинают функционировать как входы.
2. Устанавливается флаг SPIF регистра SPSR, генерируя запрос на
прерывание от SPI. Если прерывания от SPI разрешены и флаг I
регистра SREG установлен в «1», происходит запуск подпрограммы обработки прерывания.

Таким образом, если ведущий микроконтроллер использует передачу данных, управляемую прерыванием, и существует вероятность подачи
на вход SS напряжения НИЗКОГО уровня, в подпрограмме обработки прерывания от SPI обязательно должна осуществляться проверка состояния
флага MSTR. При обнаружении сброса этого флага он должен быть программно установлен обратно в «1» для обратного перевода микроконтроллера в режим «Master».
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

большуще спаибо, коллеги! и ведь видел я эти строки, но, прочитав первое предложение сразу перескакивал на конец, считая, что нюансов там нет и быть не может...

однако, теперь вопрос: как с этим бороться? у меня SS постоянно на земле (перемычка), не спрашивайте, почему. при этом попытка ставить бит MSTR в обработчике прерываний (для SPI вообще-то у меня прерывания не используются, работаю поллингом) ни к чему не приводит. ощущение такое, что MSTR сброшен всегда, если SS вход и на земле.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="ARV",url="/forum/viewtopic.php?p=3897453#p3897453"]однако, теперь вопрос: как с этим бороться? у меня SS постоянно на земле (перемычка)...[/uquote]
Боюсь что ответ не устроит - только программный SPI.(
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ну... когда сильно-сильно прижмет, изворотливость границ не знает :)))
вышел из положения тем, что на момент опроса перемычки пин перевожу на вход с подтяжкой, а потом на выход с выводом 0. тогда КЗ не возникает, кристалл не раскаляется, я для SPI пин является выходм и ноль игнорируется...

вот что бывает, когда при разводке платы на графическом изображении МК не обозначены назначения его выводов, только номера... KiCAD подвел. ну и сам тоже баран, не спорю.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Раз корпус TQFP, поднять от печати 14 лапу не вариант?
Самсусамыч

Сообщение Самсусамыч »

[uquote="ARV",url="/forum/viewtopic.php?p=3897453#p3897453"]однако, теперь вопрос: как с этим бороться? у меня SS постоянно на земле (перемычка)[/uquote]
Раз вывод не используется, то его можно тупо удалить… :) или поднять вверх разорвав контакт с площадкой (как предложил akl). Или как уже сделали Вы… варианты есть всегда... :))
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="ARV",url="/forum/viewtopic.php?p=3897457#p3897457"]вышел из положения тем, что на момент опроса перемычки пин перевожу на вход с подтяжкой, а потом на выход с выводом 0. тогда КЗ не возникает, кристалл не раскаляется, я для SPI пин является выходм и ноль игнорируется...[/uquote]
Нормально. 0 на 0 - ничего не будет, допустимо. Сначала порт, затем ддр.)
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Я так понимаю что вывод-то всё-таки используется, поэтому оторвать его просто так нельзя.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Если честно, странно, что вы по SPI не знали, что вывод при SS при включенном SPI аппаратно переключает мк в слейв. Ладно бы другая периферия и их заморочки. Ну да ладно. Ну шо, поэхали.

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

   set_bit (SS_DDR, __SS);
Усе. Пин назначен как выход. Подключение на минус ему не страшно.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):Пин назначен как выход. Подключение на минус ему не страшно
даладна!
а если на него выводится единица? :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Значит, сожгете порт. Это у всех AVR так с SPI. Понимаете? Либо вы его используете как выход, либо никак. Точка. В режиме SPI последствия понятны.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Порт, вроде, уцелел... А вот обход проблемы мне не понравился.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Значит на PORTx откуда то прилетает единичка.
Контактная информация:
Самсусамыч

Сообщение Самсусамыч »

[uquote="ARV",url="/forum/viewtopic.php?p=3897519#p3897519"]поэтому просто навсегда оторвать его нельзя...[/uquote]
Тогда (если есть такая возможность) можно перерезать дорожку и в разрыве припаять резистор 330 Ом. :solder: Тогда при любых раскладах Ваш пин останется невредимым. :) . При работе SPI пин конфигурируемый как выход (лог 0) не подсадит линию источника сигнала если даже она будет в 1. А после завершения работы SPI номинал данного резистора (330 Ом.) тоже не внесёт каких либо проблем когда пин будет настроен как вход. :)
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Точно. (опередил :) ) либо вместо перемычки использовать такой резистор...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

коллеги, либо я написал не очень внятно, либо вы не читаете: проблема решена путем опроса этой перемычки в режиме ввода с подтяжкой, затем перевода пина в режим выхода и вывода в него 0, и только затем инициализации SPI. не потребовалось ни дорожки резать, ни резисторы вешать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Самсусамыч

Сообщение Самсусамыч »

[uquote="ARV",url="/forum/viewtopic.php?p=3897840#p3897840"]коллеги, либо я написал не очень внятно, либо вы не читаете:[/uquote]
После данных постов, я понял, что проблема решена, но есть опасения сжечь порт если у источника сигнала будет лог 1. :dont_know:
ну... когда сильно-сильно прижмет, изворотливость границ не знает
вывод задействован в качестве селектора адреса устройства, поэтому для некоторых устройств он должен быть всегда на земле, а для некоторых - в отрыве от земли.
а если на него выводится единица?
Порт, вроде, уцелел... А вот обход проблемы мне не понравился.
:roll:
-----------------
ARV писал(а):не потребовалось ни дорожки резать, ни резисторы вешать.
Хорошо, рас решена и всё устраивает, тогда я Вас не буду более отвлекать своими глупостями.
Ответить

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