Top.Mail.Ru
Уведомления
Очистить все

[Закреплено] STM32 для начинающих

Страница 13 / 17
 stm
(@stm)
Level 4

*Поэтому при подаче напряжения на NSS Слейва, Слейв выбирается.
Ну вы поняли, не выбирается, а отключается))

ОтветитьЦитата
Размещено : 25.08.2023 05:03
(@eduard)
Level 4 Moderator

У вас в голове всё перемешалось. Люди, кони и  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 случаях это не нужно и нецелесообразно. Иначе с этими пятью устройствами будете трахаться до скончания века.

 

 

 

 

ОтветитьЦитата
Размещено : 25.08.2023 20:13
 stm
(@stm)
Level 4

Спасибо, я это почти всё знаю, а нужное как раз не описано.

Всё немного сложнее чем я думал.
У NSS есть 2 режима работы hardware nss output signal и hardware nss input signal.
Режим hardware nss input signal я описал на изображении.
А вот режим hardware nss output signal у меня применить не получилось, возможно он и не работает как вы и сказали.

Думаю в режиме hardware nss output signal, пин NSS должен выдавать импульсы при передаче данных.
Скорее всего этот режим работает правильно, только я не знаю алгоритм применения.

png

То что на изображении я проверял, всё работает, это не вопрос, просто хотел описать, о чём я раньше писал.

ОтветитьЦитата
Размещено : 27.08.2023 12:18
 stm
(@stm)
Level 4

Извиняюсь, чуть чуть не так.
Быстро истекает время редактирования сообщений.

png

Для Слейва как вы и описали можно использовать любой GPIO выход.

Но можно сделать на Слейве Аппаратный способ управления, а на мастере настроить Программный способ управления.

ОтветитьЦитата
Размещено : 27.08.2023 12:27
(@eduard)
Level 4 Moderator
От: @stm

Но можно сделать на Слейве Аппаратный способ управления, а на мастере настроить Программный способ управления.

Это в случае, когда ведомый является контроллером, который программируете то же вы.

Если это сторонее устройство. В этом необходимости нет.

Вы пытаетесь два МК связать по SPI?

Я делал такое, правда CS-NSS не использовал. Нужно попробовать.

Задачи просто такой не возникало.

ОтветитьЦитата
Размещено : 27.08.2023 16:18
 stm
(@stm)
Level 4

В 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 вывод.

png
ОтветитьЦитата
Размещено : 27.08.2023 23:42
Aveal
(@aveal)
Top level Admin

@stm Ключевой нюанс, что про появление высокого уровня не написано, только про выставление низкого )

Если логически рассуждать, то к CS slave'а могут быть подключены сигналы от нескольких ведущих. Я предполагаю, что из этого уже вытекает, что master либо дает на NSS низкий уровень, либо переводит в Hi-Z в случае неактивности, чтобы другие ведущие могли также работать со slave'ом. Поэтому решение - внешняя или внутренняя подтяжка вверх, само собой предпочтительнее внешняя (как и в большинстве других случаев).

ОтветитьЦитата
Создатель темы Размещено : 28.08.2023 10:26
 stm
(@stm)
Level 4

>Вы пытаетесь два МК связать по 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".
Но это невозможно.

ОтветитьЦитата
Размещено : 28.08.2023 15:59
 stm
(@stm)
Level 4

Я раньше уже писал, вот так более понятней.
Любой SPI прибор в сброшенном состоянии является слейвом с аппаратным спрособом управления NSS, объяснение на изображении.

png
ОтветитьЦитата
Размещено : 28.08.2023 16:05
Aveal
(@aveal)
Top level Admin
От: @stm

А NSS при "Hardware NSS OUTPUT Signal" режиме постоянно в нуле.

Я про это писал.

Физически есть подтяжка на выходе NSS, чтобы там мог в принципе откуда-то взяться высокий уровень?

ОтветитьЦитата
Создатель темы Размещено : 28.08.2023 16:25
 stm
(@stm)
Level 4

Подтяжка NSS Мастера на плюс питания?
Если я правильно понял, то это не вход, это выход, "Hardware NSS OUTPUT Signal".
OUTPUT Signal.
И если подать напряжение на NSS пин Мастера в режиме "Hardware NSS OUTPUT Signal" (Хотя это неправильно), то это никак не повлияет на работу NSS Мастера.

Так можно делать только в режиме "Hardware NSS INPUT Signal".

ОтветитьЦитата
Размещено : 28.08.2023 17:29
Aveal
(@aveal)
Top level Admin

@stm нет, для NSS грубо говоря есть два варианта - master подтянул его к земле, master его оставил в покое и он висит в воздухе (SPI disabled). Так вот чтобы во втором случае на выходе появилась единица нужна подтяжка вверх.

ОтветитьЦитата
Создатель темы Размещено : 28.08.2023 17:56
 stm
(@stm)
Level 4

Ок. Упоминайте тоже о каком NSS вы говорите, о Мастер или о Слейв.
Я понял.
> чтобы другие ведущие могли также работать со slave'ом.
Но из этого мне показалось, что вы хотите отключать таким образом Мастер в Мультимастерной системе.
-------------------------------------------------------------
Но если надо отключать включать Слейвы, то зачем мне NSS выход мастера, который всегда в нуле?
Включить отключить Slave полноценно я могу через GPIO выход.
А для того что вы говорите что то ещё городить надо.
Плюс к тому "Hardware NSS OUTPUT Signal" это выход и к нему даже наверное и нельзя подсоединять питание.

ОтветитьЦитата
Размещено : 28.08.2023 18:13
Aveal
(@aveal)
Top level Admin
От: @stm

Но из этого мне показалось, что вы хотите отключать таким образом Мастер в Мультимастерной системе.

Не, я еще не совсем из ума выжил ) Главное, что по итогу мы поняли друг друга.

Включить отключить Slave полноценно я могу через GPIO выход.
А для того что вы говорите что то ещё городить надо.

Верный вывод, поэтому аппаратный NSS по большому счету никто и не юзает.

Плюс к тому "Hardware NSS OUTPUT Signal" это выход и к нему даже наверное и нельзя подсоединять питание.

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

В F4 или в каких-то там других, не помню, есть возможность напрямую на NSS аппаратно подавать и высокий и низкий уровень, то есть по факту внутри контроллера все куда надо подтягивается.

ОтветитьЦитата
Создатель темы Размещено : 28.08.2023 18:50
 stm
(@stm)
Level 4

> поэтому аппаратный NSS по большому счету никто и не юзает.
Аппаратный NSS ВЫХОД на Мастере наверное не используют.

Аппаратный NSS ВХОД используют на Слейве постоянно.
И для Мастера аппаратный NSS ВХОД удобный режим, чтоб в мультимастерной системе отключать включать Мастер.

ОтветитьЦитата
Размещено : 28.08.2023 20:24
Страница 13 / 17
Поделиться: