коллеги, у кого есть возможность проверить, прошу проверить и рассказать, есть проблема или нет.
суть: 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;
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:8
Спойлер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
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Если же микроконтроллер находится в режиме «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».
большуще спаибо, коллеги! и ведь видел я эти строки, но, прочитав первое предложение сразу перескакивал на конец, считая, что нюансов там нет и быть не может...
однако, теперь вопрос: как с этим бороться? у меня SS постоянно на земле (перемычка), не спрашивайте, почему. при этом попытка ставить бит MSTR в обработчике прерываний (для SPI вообще-то у меня прерывания не используются, работаю поллингом) ни к чему не приводит. ощущение такое, что MSTR сброшен всегда, если SS вход и на земле.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
ну... когда сильно-сильно прижмет, изворотливость границ не знает вышел из положения тем, что на момент опроса перемычки пин перевожу на вход с подтяжкой, а потом на выход с выводом 0. тогда КЗ не возникает, кристалл не раскаляется, я для SPI пин является выходм и ноль игнорируется...
вот что бывает, когда при разводке платы на графическом изображении МК не обозначены назначения его выводов, только номера... KiCAD подвел. ну и сам тоже баран, не спорю.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
однако, теперь вопрос: как с этим бороться? у меня SS постоянно на земле (перемычка)
Раз вывод не используется, то его можно тупо удалить… или поднять вверх разорвав контакт с площадкой (как предложил akl). Или как уже сделали Вы… варианты есть всегда...
вышел из положения тем, что на момент опроса перемычки пин перевожу на вход с подтяжкой, а потом на выход с выводом 0. тогда КЗ не возникает, кристалл не раскаляется, я для SPI пин является выходм и ноль игнорируется...
Нормально. 0 на 0 - ничего не будет, допустимо. Сначала порт, затем ддр.)
вывод задействован в качестве селектора адреса устройства, поэтому для некоторых устройств он должен быть всегда на земле, а для некоторых - в отрыве от земли. поэтому просто навсегда оторвать его нельзя...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Если честно, странно, что вы по SPI не знали, что вывод при SS при включенном SPI аппаратно переключает мк в слейв. Ладно бы другая периферия и их заморочки. Ну да ладно. Ну шо, поэхали.
Код:
set_bit (SS_DDR, __SS);
Усе. Пин назначен как выход. Подключение на минус ему не страшно.
Тогда (если есть такая возможность) можно перерезать дорожку и в разрыве припаять резистор 330 Ом. Тогда при любых раскладах Ваш пин останется невредимым. . При работе SPI пин конфигурируемый как выход (лог 0) не подсадит линию источника сигнала если даже она будет в 1. А после завершения работы SPI номинал данного резистора (330 Ом.) тоже не внесёт каких либо проблем когда пин будет настроен как вход.
Точно. (опередил ) либо вместо перемычки использовать такой резистор...
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
коллеги, либо я написал не очень внятно, либо вы не читаете: проблема решена путем опроса этой перемычки в режиме ввода с подтяжкой, затем перевода пина в режим выхода и вывода в него 0, и только затем инициализации SPI. не потребовалось ни дорожки резать, ни резисторы вешать.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
коллеги, либо я написал не очень внятно, либо вы не читаете:
После данных постов, я понял, что проблема решена, но есть опасения сжечь порт если у источника сигнала будет лог 1.
Цитата:
ну... когда сильно-сильно прижмет, изворотливость границ не знает
Цитата:
вывод задействован в качестве селектора адреса устройства, поэтому для некоторых устройств он должен быть всегда на земле, а для некоторых - в отрыве от земли.
Цитата:
а если на него выводится единица?
Цитата:
Порт, вроде, уцелел... А вот обход проблемы мне не понравился.
----------
ARV писал(а):
не потребовалось ни дорожки резать, ни резисторы вешать.
Хорошо, рас решена и всё устраивает, тогда я Вас не буду более отвлекать своими глупостями.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения