реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F105 и SPI, Добавьте ясности, пожалуйста
Still Enemy
сообщение Apr 14 2015, 12:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Стоит задача работать с FlashMemory M25P128 по SPI1 с помощью STM32. Под SPI1 выделено только три пина: MOSI,MISO,SCK, которые висят PB с 3 по 5 пин(Remap запилен). Платой(разработка фирмы) не предусмотрен NSS, пин PA14 забит другим устройством, зато под NSS заведён пин PB6. Как необходимо настроить ноги SPI, чтобы всё работало?
Я представляю, что и с текущей конфигурацией платы можно сделать, но как?
Как я рассуждаю, читая Reference Manual: нужно заделать SSM=1 и SSI=1 в SPI_CR1 и SSOE = 0 в SPI_CR2. Запилить PB6 как обычный GPIO на выход и подавать на него лог ноль при обмене.
После этого начинаю углубляться в Reference Manual. Возникло дохера вопросов(некоторые не по теме, но всё же хотелось знать):
Цитата
NSS: Slave select. This is an optional pin to select a slave device. This pin acts as a ‘chip select’ to let the SPI master communicate with slaves individually and to avoid contention on the data lines.

Как с помощью одного пина то можно управлять индивидуально одним из нескольких слейвов?
Дальше интереснее:
Цитата
Software NSS management (SSM = 1)
The slave select information is driven internally by the value of the SSI bit in the SPI_CR1 register. The external NSS pin remains free for other application uses.

Прочитав пару десятков раз мануал и еще посмотрев вот сюда рассудил про себя, что всё же 2 варианта работы в режиме программного управления ногой NSS:
1) SSOE = 0, SSM = 1, SSI = 1. Тут включается режим "какбэ" мультимастер. Выставить SSI в ноль - значит вылет ошибки MODF с последующим понижением в рабы) Выдержка из мануала по этому поводу:
Цитата
25.3.10 Error flags
Master mode fault (MODF)
Master mode fault occurs when the master device has its NSS pin pulled low (in NSS hardware mode) or SSI bit low (in NSS software mode), this automatically sets the MODF bit.

2) SSOE = 0, SSM = 1, SSI = ?(SSI в этом случае видимо нахрен не нужен). Подтягиваем NSS мастера к питанию, а CS слейва к земле(это я увидел по картинке 238 в том же мануале). Тут не понятно, что делать с SSI.
Вот тут я уже не понимаю как в 1 варианте работать с слейвом, без подтягивания к земле CS слейва. И опять же вопрос по работе с несколькими слейвами тоже актуален.
Как же нужно настроить регистры SPI в моём случае? Это вообще реально?
Go to the top of the page
 
+Quote Post
mcheb
сообщение Apr 14 2015, 13:57
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Совершенно очевидно,что МК-мастер,флэш-слэйв. Поэтому последовательность действий простая
1. Чип селект - лоу
2. Шлём команду - запись
3. Шлём адрес
4. Шлём данные
5. пауза (готовность)
6. Чип селект - Хай
Всё
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 14 2015, 13:58
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Управляйте сигналом выборки памяти ногодрыгом. Аппаратное дерганье NSS в STM32 сделано непонятно зачем - он дергается на каждый посланный байт, ни для какой памяти такой сигнал не подходит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Apr 14 2015, 15:08
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Сергей Борщ @ Apr 14 2015, 09:58) *
Управляйте сигналом выборки памяти ногодрыгом. Аппаратное дерганье NSS в STM32 сделано непонятно зачем - он дергается на каждый посланный байт, ни для какой памяти такой сигнал не подходит.

A разве NSS работает не только на инпут в слейв моде?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 14 2015, 17:56
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



mcheb, спасибо, кэп, я спрашивал не про то.

Сергей Борщ, я собственно запиливаю свой вариант. Программное управление: SSM=1 и SSI=1 в SPI_CR1 и SSOE = 0 в SPI_CR2. И дергаю ногой PB6 для чип селекта. Так пойдёт?
Go to the top of the page
 
+Quote Post
uriy
сообщение Apr 15 2015, 04:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
A разве NSS работает не только на инпут в слейв моде?
Тоже всегда думал что NSS это вход.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 15 2015, 04:56
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(uriy @ Apr 15 2015, 08:20) *
Тоже всегда думал что NSS это вход.

Не пойму где вы и A. Fig Lee углядели что-то про слейв мод и NSS в режиме входа в словах Сергей Борщ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2015, 05:14
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(uriy @ Apr 15 2015, 06:20) *
Тоже всегда думал что NSS это вход.
А я всегда читаю документацию:
Цитата
NSS: Slave select. This is an optional pin to select a slave device. This pin acts as a
‘chip select’ to let the SPI master communicate with slaves individually and to avoid
contention on the data lines. Slave NSS inputs can be driven by standard IO ports on
the master device. The NSS pin may also be used as an output if enabled (SSOE bit)
and driven low if the SPI is in master configuration
. In this manner, all NSS pins from
devices connected to the Master NSS pin see a low level and become slaves when
they are configured in NSS hardware mode.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Apr 15 2015, 10:20
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



A как вы тогда предлагаете угадывать, когда дергать NSS, через сколько байт?
По моему, логично. Ну, можно сделать 8/16 бит. Но больше только ручками


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 15 2015, 12:42
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Что-то у меня никак не работает. Взял осциллограф, выставил PB6 в лог ноль, померил, нога CS в нуле. Отправляю через библиотечную функцию(STM HAL driver), ни на SCK ничего не подаётся, ни на Data Input памяти ничего нет. Я вообще хз, как с этой ***лой работать. В библиотечной функции отправки просто происходит присвоение отправляемых данных регистру SPI_DR, так что на неё нет смысла грешить.
Инициализация SPI происходит так:
CODE
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
HAL_SPI_Init(&hspi1);

Инициализация пинов вот так:
CODE
GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

GPIOB->BSRR = GPIO_PIN_6;

Куда копать, скажите, пожалуйста.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Apr 15 2015, 13:57
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



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


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 15 2015, 16:25
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(A. Fig Lee @ Apr 15 2015, 17:57) *
Посмотреть регистры, убедится, что они меняются. Если не меняются, значит клок не включен.
Проверить ножки, надо ли делать ремап, ту да ли выведено.

Регистры меняются. Туда выведено, ремап нужен.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 16 2015, 06:07
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



В итоге оказалось, что не работала нога PB3. Сделал из неё обычную ногу на вывод, подавал на неё 1 и 0 попеременно, никакой реакции. Потом еще запилил SPI1 на порту A(без ремапа), там всё хорошо тактировалось, нога работала.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Apr 17 2015, 10:15
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Кароч ребят, вы не поверите. Дело оказалось в новых дровах, которые генерирует Куб, там нашелся касяк очень и очень старый: у меня МК шьётся через SW/JTAG. Я использую SW, он под себя выделает 2 пина PA13,PA14. В коде вызывалась команда, которая делает ремап, чтобы освободить остальные пины(в том числе и злосчастный PB3!!!), кроме тех что под SW, но на деле ремап никакой не происходил по одной простой причине: чтобы делать ремап, надо сначала включить тактирование на порт(в моём случае на B ). Вот только в таком случае оно начинает работать, а не сначала ремап, а потом включить тактирование.

Сообщение отредактировал Still Enemy - Apr 17 2015, 10:16
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 17 2015, 14:53
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Still Enemy @ Apr 17 2015, 13:15) *
чтобы делать ремап, надо сначала включить тактирование на порт(в моём случае на B ).
Только наверное не тактирование порта, а тактирование AFIO. Я - то библиотеками не пользуюсь, первым делом инициализирую тактирование всех нужных блоков записью всех трех регистров RCC_xxxENR целиком, но логика подсказывает, что раз регистр MAPR находится в группе AFIO, то и за его тактирование отвечает тактирование AFIO.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016