Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456

STM32F407 SPI NSS

03.11.2021, 09:05. Показов 1690. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему контроллер передав данные по spi, подав 0 на ногу NSS(chip select) не возвращает её в 1?
Миниатюры
STM32F407 SPI NSS  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2021, 09:05
Ответы с готовыми решениями:

Управление NSS в SPI
Доброго времени суток. У меня такая ситуация : Установка не активного уровня сигнала NSS(CS) ГЛОБАЛЬНО КРИТИЧНО отстает от последнего...

STM32F103 SPI не дрыгает ножкой NSS
Блин никак не могу заставить стм-ку задрыгать ногой NSS самостоятельно В чем косяк ? #define SPI SPI1 #define...

STM32F103C8t6 SPI управление ногой NSS
Вообщем настраиваю я SPI на STM32F103C8t6. Ногу NSS настраиваю на software управление: #define CS_LOW GPIOB->BRR=GPIO_BRR_BR12; ...

17
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.11.2021, 09:06  [ТС]
Тестил в HAL и CMSIS результат одинаковый
0
 Аватар для northcitizen
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
03.11.2021, 10:50
Можно настроить SPI_NSS_SOFT и вручную с помощью GPIO дергать. обсуждалось тут https://stackoverflow.com/ques... on-stm32f4 подобная тема
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.11.2021, 17:31  [ТС]
И ещё одна проблема хочу отправить подряд данные по spi, несколько раз подряд с помощью DMA
C++
1
2
spi1.send(mac, 3); 
spi1.send(buf, 3);
Уйдут только первые три байта, если не использовать DMA уйдут все шесть байт

Добавлено через 3 минуты
Функция отправки данных
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Spi1::send(uint8_t *data, uint8_t len)
{ 
  uint8_t i;
  while(SPI2->SR & SPI_SR_BSY);                  //Wait transmit all data 
  //while(!(SPI1->SR & SPI_SR_TXE));
  DMA2->LIFCR |= DMA_LIFCR_CTCIF3;               //Clear flag DMA event
  DMA2_Stream3->NDTR = len;                     //Set len tx 
  for(i = 0; i < len; i++)
        {
            txData[i] = *data++;                       //Copy data to buffer
       }     
  DMA2_Stream3->CR |= DMA_SxCR_EN;                //Enable DMA tx */
}
Добавлено через 2 минуты
Причём если использовать HAL c DMA Проблема точно такая же
C++
1
2
HAL_SPI_Transmit_DMA(&hspi1, mac, 3);
     HAL_SPI_Transmit_DMA(&hspi1, buf, 3);
Уйдут также только первые три байта

Добавлено через 25 минут
Решил эту проблему таким костылём
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Spi1::send(uint8_t *data, uint8_t len)
{ 
 uint8_t i;
 while(SPI2->SR & SPI_SR_BSY);                  //Wait transmit all data 
 while(!(SPI1->SR & SPI_SR_TXE));               //Crutch
 DMA2->LIFCR |= DMA_LIFCR_CTCIF3;               //Clear flag DMA event
 DMA2_Stream3->NDTR = len;                      //Set len tx 
 for(i = 0; i < len; i++)
      {
         txData[i] = *data++;                       //Copy data to buffer
      }  
 DMA2_Stream3->CR |= DMA_SxCR_EN;                 //Enable DMA tx */
}
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
03.11.2021, 17:33  [ТС]
Хотя по даташиту должно работать, может кто сталкивался?
Миниатюры
STM32F407 SPI NSS  
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 11:05  [ТС]
А сам накосячил с регистром SPI2 указал

Добавлено через 3 минуты
Но нашёл ещё косяк, если слать пакеты данных друг за другом нога MOSI, остаётся в состоянии 1
C++
1
2
HAL_SPI_Transmit(&hspi2, buf, 3 , 0xFFFFFFF);
HAL_SPI_Transmit(&hspi2, mac, 3 , 0xFFFFFFF);
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 11:06  [ТС]
Вот
Миниатюры
STM32F407 SPI NSS  
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 11:17  [ТС]
C++
1
HAL_SPI_Transmit(&hspi2, buf, 3 , 0xFFFFFFF);
оправляю один раз всё нормально
Миниатюры
STM32F407 SPI NSS  
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.11.2021, 11:40
По началу отправки буфера билиотека HAL не предполагает, что вы будете делать это сразу после вызова. Вам нужно сначала дождаться окончания передачи и уже тогда вызывать функцию передачи данных снова. Ну, или переделать функции библиотеки с применением буфера FIFO
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 13:00  [ТС]
Разобрался с пасхалкой, если в цикле слать данные и последний байт больше 127, то у ноги mosi остаётся высокий уровень
C++
1
2
3
4
5
6
uint8_t buf[6] = {50, 128, 0 , 0, 0};
while(1)
      { 
        HAL_SPI_Transmit(&hspi2, buf, 2 , 0xFFFFFFF);
        HAL_Delay(20);
       }
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 13:02  [ТС]
Мозг взорвало
Миниатюры
STM32F407 SPI NSS  
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 13:06  [ТС]
если последний байт меньше 127, то возвращается низкий уровень mosi
C++
1
2
3
4
5
6
uint8_t buf[6] = {50, 127, 0 , 0, 0};
while(1)
      { 
        HAL_SPI_Transmit(&hspi2, buf, 2 , 0xFFFFFFF);
        HAL_Delay(20);
       }
Миниатюры
STM32F407 SPI NSS  
0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
04.11.2021, 13:14
Насколько я знаю, управление ногой SPI_SS только ручное.
По вашим исследованиям видно, что нога MOSI остается в том состоянии, которому соответствует последний переданный бит (меня этот вопрос никогда не интересовал). Где-то написано что она должна возвращаться в определенное состояние? Зачем? Вы с ногой SPI_SCK не путаете - там это важно и зависит от режима работы.
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 13:21  [ТС]
Нет я именно про ногу mosi
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 13:30  [ТС]
SCK, работает как надо. Да пересмотрел документацию там неуказанно что с 0 должна начинаться передача mosi, а nss не работает всегда 0
Миниатюры
STM32F407 SPI NSS  
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
04.11.2021, 13:35  [ТС]
Использую просто другую ногу для cs
0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
04.11.2021, 15:00
Цитата Сообщение от Korbofos Посмотреть сообщение
Использую просто другую ногу для cs
Ногу можно ту же использовать. Не назначайте ее как Alternative и все.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.11.2021, 18:18
Цитата Сообщение от Korbofos Посмотреть сообщение
Нет я именно про ногу mosi
Состояние MOSI не имеет значения в момент отсутствия clock'а. То что Вы видите "1" _при последнем байте > 127" лишь говорит о том, что 7й бит передается последним. Соответственно, вы его и видите.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2021, 18:18
Помогаю со студенческими работами здесь

STM32F103CB SPI, Hardware NSS не работает
Всю голову сломал. STM32F103CB, SPI1. NSS в режиме мастера может дрыгаться хардово, если веритьИспользуется только MOSI (односторонняя...

Stm32f407 и SPI
начал запускать дисплейчик на ST7735 на программным SPI все работает, на железном глюки везде видел такую конструкцию( посылка с...

STM32F407+mcp3201(spi)
Доброго времени суток. Заблудился в элементарном.Суть проблемы в следующем. Читается не верное напряжение с mcp3201. показывает то 21V...

Прием с SPI 16bit STM32F407 DISCOVERY
Всем доброго времени суток! Может ли кто-то подсказать как считать данные по SPI, которые приходят в 16bit ном режиме.

[Решено] STM32F407 SPI slave + Cubieboard2 не работает
Добрый день! Отлаживаю связку STM32F407 SPI в режиме slave и Cubieboard2. SPI не передаёт данные, пока я не войду в режим отладки (Keil)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru