*Поэтому при подаче напряжения на NSS Слейва, Слейв выбирается.
Ну вы поняли, не выбирается, а отключается))
У вас в голове всё перемешалось. Люди, кони и SPI. 🤣
Забудьте красивые слова NSS, SSM, SSI. Начинайте мыслить по другому.
Исходные данные:
МК - STM32F103C8Т. Всеми любимый.
К одному SPI подключено 5 устройств.
В CubeMX включаем первый SPI
Получаем хардварный вывод PA4 для управления CS для ведомых устройств. Он будет опускаться в 0 и подниматься в 1 автоматически. Но фирма ST не рекомендует использовать этот режим, так как они что то там напутали.
Да и не подходит это нам. Да, при определённых условиях можно включать хардварное управление и этим выводом можно управлять через установку определённых битов. Нам же нужно управлять пятью устройствами. Значит про этот вывод мы забываем, как и NSS, SSM, SSI. Так как вывод управления выбором CS только один, при попытке написания драйверов на 5 устройств, наши драйвера будут биться за этот вывод, да и все 5 к нему не подключишь.
Что мы делаем?
Использовал чужую картинку. Самому лень рисовать.
SS# - это сигнал CS у ведомого
Для этих целей мы используем PB0, PB1, PB2, PB10, PB11.
Настраиваем их на выход и выставляем в единичное состояние.
Инициализируем SPI.
Теперь пишем 5 драйверов на разные устройства. При инициализации указываем в качестве интерфейса передачи/приёма SPI1 и, для каждого устройства, свой порт для управления CS. Теперь драйвера не буду драться друг с другом.
Теперь можно по SPI обратиться к датчику 1, потом 2 и т.д. А на дисплей подключенному к PB11, вывести данные с этих датчиков. Нужно не забывать в своих драйверах дёргать порт для управления сигналом CS.
И забудьте про прерывания и DMA. В 99.9 случаях это не нужно и нецелесообразно. Иначе с этими пятью устройствами будете трахаться до скончания века.
Спасибо, я это почти всё знаю, а нужное как раз не описано.
Всё немного сложнее чем я думал.
У NSS есть 2 режима работы hardware nss output signal и hardware nss input signal.
Режим hardware nss input signal я описал на изображении.
А вот режим hardware nss output signal у меня применить не получилось, возможно он и не работает как вы и сказали.
Думаю в режиме hardware nss output signal, пин NSS должен выдавать импульсы при передаче данных.
Скорее всего этот режим работает правильно, только я не знаю алгоритм применения.
То что на изображении я проверял, всё работает, это не вопрос, просто хотел описать, о чём я раньше писал.
Извиняюсь, чуть чуть не так.
Быстро истекает время редактирования сообщений.
Для Слейва как вы и описали можно использовать любой GPIO выход.
Но можно сделать на Слейве Аппаратный способ управления, а на мастере настроить Программный способ управления.
Но можно сделать на Слейве Аппаратный способ управления, а на мастере настроить Программный способ управления.
Это в случае, когда ведомый является контроллером, который программируете то же вы.
Если это сторонее устройство. В этом необходимости нет.
Вы пытаетесь два МК связать по SPI?
Я делал такое, правда CS-NSS не использовал. Нужно попробовать.
Задачи просто такой не возникало.
В Reference Manual нашёл следующее по поводу режима "Hardware NSS OUTPUT Signal".
NSS output enabled (SSM = 0, SSOE = 1) This configuration is used only when the device operates in master mode.
The NSS signal is driven low when the master starts the communication and is kept low until the SPI is disabled.
Не совсем понимаю, что это значит.
У меня NSS на Мастере постоянно остаётся на низком уровне и не поднимается в режиме "Hardware NSS OUTPUT Signal".
Написано, что после отключения SPI, должен появляться высокий уровень на NSS.
Я отключаю бит SPE в регистре CR1, но NSS на Мастере так же остаётся в низком уровне.
NSS Мастера и Слейва не соединены между собой.
NSS Мастера ник чему не подсоединён, код работает, NSS Слейва управляется через GPIO вывод.
@stm Ключевой нюанс, что про появление высокого уровня не написано, только про выставление низкого )
Если логически рассуждать, то к CS slave'а могут быть подключены сигналы от нескольких ведущих. Я предполагаю, что из этого уже вытекает, что master либо дает на NSS низкий уровень, либо переводит в Hi-Z в случае неактивности, чтобы другие ведущие могли также работать со slave'ом. Поэтому решение - внешняя или внутренняя подтяжка вверх, само собой предпочтительнее внешняя (как и в большинстве других случаев).
>Вы пытаетесь два МК связать по SPI?
Нет. Я соединяю МК с акселерометром, который на плате находится STM32F407.
>Я предполагаю, что из этого уже вытекает, что master либо дает на NSS низкий уровень,
Мастер даёт низкий уровень на Слейв?
Как бы возможность такая заложена?
Я точно так же сначала подумал, но NSS Слейва должен обязательно переключаться в единицу после передачи пакета данных.
Попробуйте сделать две передачи данных друг за другом
HAL_SPI_Transmit(&hspi1, &pdata,1,1000);
HAL_SPI_Transmit(&hspi1, &pdata,1,1000);
SPI не поймёт.
После каждой передачи данных, на NSS Слейва надо подавать единицу
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); //GPIOE Пин 3 Соединён с NSS Слейва
HAL_SPI_Transmit(&hspi1, &pdata,1,1000);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); //GPIOE Пин 3 Соединён с NSS Слейва
А NSS при "Hardware NSS OUTPUT Signal" режиме постоянно в нуле.
Слейв можно выставить только в "Hardware NSS INPUT Signal", это в Reference Manual написано, я сначала думал может слейв как то в режим "Hardware NSS OUTPUT Signal" перевести и проверить смогут ли правильно коммуницировать Мастер "Hardware NSS OUTPUT Signal" и Слейв "Hardware NSS OUTPUT Signal".
Но это невозможно.
Я раньше уже писал, вот так более понятней.
Любой SPI прибор в сброшенном состоянии является слейвом с аппаратным спрособом управления NSS, объяснение на изображении.
А NSS при "Hardware NSS OUTPUT Signal" режиме постоянно в нуле.
Я про это писал.
Физически есть подтяжка на выходе NSS, чтобы там мог в принципе откуда-то взяться высокий уровень?
Подтяжка NSS Мастера на плюс питания?
Если я правильно понял, то это не вход, это выход, "Hardware NSS OUTPUT Signal".
OUTPUT Signal.
И если подать напряжение на NSS пин Мастера в режиме "Hardware NSS OUTPUT Signal" (Хотя это неправильно), то это никак не повлияет на работу NSS Мастера.
Так можно делать только в режиме "Hardware NSS INPUT Signal".
@stm нет, для NSS грубо говоря есть два варианта - master подтянул его к земле, master его оставил в покое и он висит в воздухе (SPI disabled). Так вот чтобы во втором случае на выходе появилась единица нужна подтяжка вверх.
Ок. Упоминайте тоже о каком NSS вы говорите, о Мастер или о Слейв.
Я понял.
> чтобы другие ведущие могли также работать со slave'ом.
Но из этого мне показалось, что вы хотите отключать таким образом Мастер в Мультимастерной системе.
-------------------------------------------------------------
Но если надо отключать включать Слейвы, то зачем мне NSS выход мастера, который всегда в нуле?
Включить отключить Slave полноценно я могу через GPIO выход.
А для того что вы говорите что то ещё городить надо.
Плюс к тому "Hardware NSS OUTPUT Signal" это выход и к нему даже наверное и нельзя подсоединять питание.
Но из этого мне показалось, что вы хотите отключать таким образом Мастер в Мультимастерной системе.
Не, я еще не совсем из ума выжил ) Главное, что по итогу мы поняли друг друга.
Включить отключить Slave полноценно я могу через GPIO выход.
А для того что вы говорите что то ещё городить надо.
Верный вывод, поэтому аппаратный NSS по большому счету никто и не юзает.
Плюс к тому "Hardware NSS OUTPUT Signal" это выход и к нему даже наверное и нельзя подсоединять питание.
Не питание, а подтяжку к питанию, то есть через резистор, чтобы даже если вдруг что - то порт не выгорел.
В F4 или в каких-то там других, не помню, есть возможность напрямую на NSS аппаратно подавать и высокий и низкий уровень, то есть по факту внутри контроллера все куда надо подтягивается.
> поэтому аппаратный NSS по большому счету никто и не юзает.
Аппаратный NSS ВЫХОД на Мастере наверное не используют.
Аппаратный NSS ВХОД используют на Слейве постоянно.
И для Мастера аппаратный NSS ВХОД удобный режим, чтоб в мультимастерной системе отключать включать Мастер.