Допустим у меня аппаратный SS.
Управляется подачей напряжением на пин SS.
У Мастера и Слейва SS соединены между собой.
На Мастере нужна постоянная единица, а на Слейве надо менять состояние пина.
Если просто управлять напряжением, то этого сделать нельзя.
Спасибо этому человеку
https://www.youtube.com/watch?v=T6IjgaT7Dvw
Такое короткое и такое понятное видео.
Горы информации про SPI в интернете, но этого не говорят, всё двусмысленно и непонятно.
В режиме аппаратного мастера NSS не используется и должен иметь состояние единицы.
То есть NSS на SPI находится в основном на тот случай, если прибор станет Слейвом.
Или для Мультимастер режима.
Доброго Времени !
Аппаратный NSS у SPI на чипах stm, на сколько я понял лучше не использовать. Многие советуют именно в ручную выставлять "чип селект" (выбор чипа). Сам тоже пробовал ради интереса, spi заработал только в "ручном" режиме (разбираться не стал почему).
Лучше не использовать?))
Если NSS существует на борту уже третьей ревизии STM32F407, значит он рабочий.
И его можно использовать.
Принцип работы я описал.
Если в сети только один мастер, тогда на NSS подаётся единица, аппаратно или программно и NSS не используется.
То есть здесь можно сказать, что для мастера NSS не используется, но это такая заложенная функция.
Если в сети несколько мастеров, то в программном режиме можно отключить бит SSI, тогда мастер станет слейвом.
Не совсем понял...
Мастер при обмене по spi, всегда выставляет на выводе NSS - еденицу.
Аппаратно или програмно (вручную) - это уже второе дело.
Автоматически выставляет?
Нигде такого не слышал.
Вручную надо выставлять NSS.
Если программно, то это биты SSM, SSI.
Если аппаратно, то надо подавать единицу на пин NSS.
Автоматически выставляет?
Нигде такого не слышал.
- Это в настройках например, куб иде (или самому в регистрах) выбирается програмный или аппаратный выбор чипа (nss).
И далее, сам микроконтроллер (модуль spi) уже управляет этим выводом. В программе не надо "дёргать" этим выводом (повторюсь, у меня этот режим не заработал)
Ок. Понял.
Я думал SPI всегда сам управляет NSS.
То есть мне не надо после передачи каждого байта дёргать NSS пином.
В аппаратном режиме так же.
Подаёшь единицу на NSS, а SPI уже сам дёргает пин.
Я ссылку на видео выше дал, там это рассказано.
Не надо в аппаратном режиме дёргать самому пин NSS, просто единицу на него подать надо.
Но ваше сообщение помогло мне, увидел, что SPI управляет NSS самостоятельно.
// записываю и считываю данные { CS_LOW( ); addres = 0x0A; while ( !( SPI1->SR & SPI_SR_TXP ) ); // ждём завершение передачи *( ( __IO uint8_t * )&SPI1->TXDR ) = addres; while( !( SPI1->SR & SPI_SR_RXP ) ); // ждём завершение приёма data = *( volatile uint8_t * )&( SPI1->RXDR ); CS_HIGH( ); //Set CS high to end communication }
Например, здесь вручную (программно управляется). Только не 1, а 0 (неправильно я написал))
Это выставление Слейва ведь.
CS_LOW( ); //Слейв выставлен
CS_HIGH( ); //Слейв отключён
Вы ведь не дёргаете NSS пином после передачи каждого байта.
Вы выставляете NSS один раз, а SPI дёргает NSS сколько ему угодно.
Как показано на изображении NSS дёргается при передаче каждого байта.
CS_LOW( ); //Слейв выставлен
CS_HIGH( ); //Слейв отключён
Да, в начале выставляем, а далее пока передачу (передачу - приём) не закончим не снимаем.
В течении транзакции всего пакета (одного байта или нескольких) не снимаем.
> Сам тоже пробовал ради интереса, spi заработал только в "ручном" режиме (разбираться не стал почему).
Ручной режим это вы что имели в виду?
У SPI один режим. Это ручной. Автоматически NSS не выставляется.
Я не до конца понял о чём вы столько написали. Если вы выбрали хардварное управление ведомыми устройствами, то контроллер сам дёргает ногу управления "Выбор кристалла", и при приёме, и при передаче. Если не выбрать хардварное управление, то этого не происходит. И не нужно писать никуда никакие биты, что бы "выбрать кристалл". Для управления "выборкой кристалла" можно взять любую свободную ногу МК. Настроить её на вывод и самому дёргать её вниз, перед передачей/приёмом. И дёргать вверх после окончания обмена. Таким образом можно посадить на линию SPI до нескольких устройств.
Я никогда не использую хардварное управление, что бы драйвера не устраивали драку из за вывода управления "выбора кристалла"
>Для управления "выборкой кристалла" можно взять любую свободную ногу МК.
До меня сейчас только дошло, что для Слейва это будет уже аппаратный способ выбора.
Вы пишете, что вы не используете аппаратный способ, но подача напряжения на пин NSS Слейва, для слейва является аппарттным способом выбора.
Программный способ это только включение битов SSM, SSI.
Для Мастера вы видимо используете программный способ(активируете биты SSM, SSI), а для слейва аппаратный.
Но ничто не мешает и на мастере использовать аппаратный способ.
Просто подать на NSS пин мастера единицу. Почему конфликт драйверов должен быть из за этого?
В сброшенном состоянии(по умолчанию,default) на Слейве используется апапратный сособ управления, не программный.
Поэтому при подаче напряжения на NSS Слейва, Слейв выбирается.