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

 
 
> stm32f407 SPI обнаружил косяк
SasaVitebsk
сообщение Nov 16 2012, 10:45
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



При инициализации с делителем на 64 (с другими не проверял). SPI3 (с другими не проверял). stm407 на 168МГц (с другими не проверял).
После записи в регистр DR необходимо выждать задержку до проверки флага BSY в регистре SR. Иначе байт может потерятся (затерется следующим).
То есть флаг занятости выскакивает с задержкой. Причём задержка приличная, успеваю выйти и войти в процедуру.
После установки задержки всё устаканилось.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Flexz
сообщение Nov 16 2012, 15:14
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



наверное не просто так в RM написано
Цитата
Note: Do not use the BSY flag to handle each data transmission or reception. It is better to use the
TXE and RXNE flags instead.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Nov 16 2012, 22:37
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Flexz @ Nov 16 2012, 17:14) *
наверное не просто так в RM написано

Поддерживаю. Для полнодуплексного (даже если только передача нужна) SPI завершение передачи нужно проверять по... RXNE (и забыть о TXE или BSY, т.к. STM32F не поддерживает аппаратное формирование SS в режиме мастера!). Тогда будет абсолютная уверенность, что байт ушел, а следующий его не затрет по пути: ведь пока байт выдвигается по MOSI, входящий байт вдвигается по MISO тем же тактовым сигналом. Это означает, что флаг RXNE все равно возникнет, пусть позже TXE, зато наверняка после последнего такта. Нужно помнить чистить RXNE путем чтения DR перед записью туда:

1. Прочесть DR.
2. Записать в DR байт для передачи.
3. Ждать RXNE (будь-то тупо или путем реакции на прерывание).
4. Перейти к п.1., если еще есть данные для передачи.

Сообщение отредактировал KnightIgor - Nov 16 2012, 22:44
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 19 2012, 15:47
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(KnightIgor @ Nov 17 2012, 04:37) *
Это означает, что флаг RXNE все равно возникнет, пусть позже TXE, зато наверняка после последнего такта.

Кстати, не факт, что после. В зависимости от режима SPI, RXNE может возникать на середине последнего такта (если данные на приёме защёлкиваются по переднему фронту). Вот тут-то наверное и может пригодиться BSY. (Хотя я лично просто делаю несколько nop-ов перед отпусканием CS)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 9 2013, 14:22
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Nov 19 2012, 18:47) *
Кстати, не факт, что после. В зависимости от режима SPI, RXNE может возникать на середине последнего такта (если данные на приёме защёлкиваются по переднему фронту). Вот тут-то наверное и может пригодиться BSY. (Хотя я лично просто делаю несколько nop-ов перед отпусканием CS)

Пробую понять SPI от STM32. Действие битов SSM, SSI не соответствует описанным в документации. В Интернете фантазируют, кто во что горазд.
Насчет RXNE и BSY. Похоже, они переключаются одновременно в конце передачи.
Но задержка на полтакта для программного снятия CS не нужна. Потому что выборка (защелкивание) данных ведомым устройством как раз и произойдет в момент, когда возникнет RXNE. А дальше пусть такт заканчивается, все равно. Главное, чтобы время удержания данных на входе ведомого устройства не оказалось меньше нормы. Но это наносекунды. С учетом работы программы, беспокоиться не о чем.
Если же ведомое устройство - какой-нибудь регистр, то нужно правильно выбрать полярность тактов SCK.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 9 2013, 19:18
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Jan 9 2013, 20:22) *
Насчет RXNE и BSY. Похоже, они переключаются одновременно в конце передачи.

Что значит "похоже"? Как вы это выяснили?
Нет, не одновременно.
Цитата(ViKo @ Jan 9 2013, 20:22) *
Но задержка на полтакта для программного снятия CS не нужна. Потому что выборка (защелкивание) данных ведомым устройством как раз и произойдет в момент, когда возникнет RXNE.

А если на пару наносекунд позже? sm.gif
Понимаете, базируясь на RXNE, вы устраиваете гонки - кто первый примет последний бит. Если сначала примет устройство, потом STM-ка, то всё в порядке. А если в гонке победит STM-ка, то CS будет сброшен раньше чем нужно, и вся посылка будет потеряна.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 9 2013, 19:47
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Jan 9 2013, 22:18) *
Что значит "похоже"? Как вы это выяснили?

по картинке
Цитата
А если на пару наносекунд позже? sm.gif

У нас есть команды проверки флага, перехода, если установился, подготовки байта (CS) для засылки в порт, засылки в порт. Даже на 168 MHz тактовой это займет не один десяток ns. Пара nop, что вы добавляете, составит ~1/4 от всего количества команд.

Цитата(HHIMERA @ Jan 9 2013, 22:33) *
Вытащил из "мусорника"...

вытащите из чего угодно не "мусор", а программирование битов SSM и SSI.

Цитата(AHTOXA @ Jan 9 2013, 22:18) *
Понимаете, базируясь на RXNE, вы устраиваете гонки - кто первый примет последний бит. Если сначала примет устройство, потом STM-ка, то всё в порядке. А если в гонке победит STM-ка, то CS будет сброшен раньше чем нужно, и вся посылка будет потеряна.

Грубо говоря, они примут одновременно. Если не обращать внимания на скорость распространения сигналов по плате (~ 20 sm за 1 ns) и на разные пороги срабатывания триггеров в STM и ведомом устройстве (при нормальных фронтах SCK вряд ли разбежка будет больше 1 ns). Если SCK в ведомое устройство доберется с опозданием, то, очевидно, и CS так же опоздает.
Во всяком случае, задержка именно на полтакта не нужна. Нужно смотреть на время удержания для конкретного ведомого устройства. В некоторых тормозных оно может быть большим, в некоторых равно 0.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 9 2013, 20:30
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Jan 10 2013, 01:47) *
по картинке

Думаю, что врёт картинка. Потому что в тексте не так. (И из опыта - тоже не так.)
BSY сделан для управления чипселектом, а чипселект надо держать до конца байта, а не до гипотетического момента, когда нам думается, что ведомое устройство уже приняло байт.
Цитата(ViKo @ Jan 10 2013, 01:47) *
У нас есть команды проверки флага, перехода, если установился, подготовки байта (CS) для засылки в порт, засылки в порт. Даже на 168 MHz тактовой это займет не один десяток ns. Пара nop, что вы добавляете, составит ~1/4 от всего количества команд.

Да ради бога, если вам нравится делать устройства, работа которых зависит от погоды на Марсе - делайте, как вам угодно. Только потом не удивляйтесь, если ваш девайс перестанет работать с новой партией микросхем. Вам два человека хором говорят, что RXNE и BSY - это не одно и то же, и что они ходили по этим граблям. Но выбор, конечно, за вами.

Цитата(ViKo @ Jan 10 2013, 01:55) *
Именно на STM32F207. НА STM32F103 разрешал отдельной командой. Иначе - никак.

У меня на 10x тоже одной командой:
Код
    RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
    SPIx->I2SCFGR &= ~SPI_I2SCFGR_I2SMOD;
    SPIx->CR2 = 0;
    SPIx->CR1 = SPI_CR1_MSTR | divisor | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | phase | cpol;

И работает. ЧЯДНТ?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 9 2013, 20:53
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Jan 9 2013, 23:30) *
... а чипселект надо держать до конца байта, а не до гипотетического момента...

Не надо
Цитата
И работает. ЧЯДНТ?

Что нам скажет товарищ HHIMERA?

103-й я программировал так. Возможно, при другом сочетании можно было бы сразу разрешить.
Код
  SPI1->CR1 = SPI_CR1_SSI | SPI_CR1_BR_0 | SPI_CR1_MSTR;        // Fpclk/4
  SPI1->CR2 = SPI_CR2_SSOE;
...
  SPI_Cmd(SPI1, ENABLE);        // разрешить SPI1


Цитата(AHTOXA @ Jan 9 2013, 23:30) *
два человека хором говорят, что RXNE и BSY - это не одно и то же, и что они ходили по этим граблям

И я прошелся когда-то давным-давно, и ничего не заметил:
Код
inline uint8_t SFMByte_send(uint8_t data) {
  while (!(SPI1->SR & SPI_SR_TXE));    // ждать освобождения
  SPI1->DR = data;            // послать данные
  while (!(SPI1->SR & SPI_SR_RXNE));    // ждать байта в приемнике (конца передачи)
//  while (SPI1->SR & SPI_SR_BSY);    // другой способ дождаться конца передачи
  return SPI1->DR;
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 9 2013, 21:18
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Jan 10 2013, 02:53) *
Не надо

Я лично сталкивался с устройствами, которые отбрасывали посылку, если чипселект не удерживать до окончания клоков. Но раз вам не надо, то конечно, дело ваше.
Вообще, у вас очень странная позиция. Если вы утверждаете, что нет разницы между RXNE и BSY, то почему вы упёрлись в использование RXNE? Чисто чтоб поспорить?
Короче, утомили вы меня, не стану больше вас отговаривать от глупых поступков. Да и вообще зря я это начал, сразу было понятно, что бесперспективняк.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   stm32f407 SPI обнаружил косяк   Nov 16 2012, 10:45
- - VslavX   Цитата(SasaVitebsk @ Nov 16 2012, 12:45) ...   Nov 16 2012, 11:00
- - skripach   Попробуйте проверять TXE, а не BSY. BSY это навер...   Nov 16 2012, 11:07
- - SasaVitebsk   Я конечно понимаю, но ЦитатаBit 7 BSY: Busy flag 0...   Nov 16 2012, 13:44
|- - VslavX   Цитата(KnightIgor @ Nov 17 2012, 00:37) П...   Nov 16 2012, 23:22
|- - HHIMERA   Цитата(KnightIgor @ Nov 17 2012, 02:37) П...   Nov 16 2012, 23:23
||- - SasaVitebsk   Цитата(HHIMERA @ Nov 17 2012, 03:23) Да в...   Nov 17 2012, 14:55
||- - SasaVitebsk   Цитата(AHTOXA @ Nov 19 2012, 18:47) Вот т...   Nov 20 2012, 20:27
||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 17:22) Пробую п...   Jan 9 2013, 15:36
|||- - ViKo   Цитата(HHIMERA @ Jan 9 2013, 18:36) Это з...   Jan 9 2013, 17:28
|||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 21:28) Я провер...   Jan 9 2013, 18:19
|||- - ViKo   Цитата(HHIMERA @ Jan 9 2013, 21:19) Пусть...   Jan 9 2013, 18:23
|||- - HHIMERA   Ещё раз... не то же самое!!! Когда нар...   Jan 9 2013, 18:39
|||- - ViKo   Цитата(HHIMERA @ Jan 9 2013, 21:39) Ещё р...   Jan 9 2013, 19:09
|||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 23:09) Покажите...   Jan 9 2013, 19:33
||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 23:36) а програ...   Jan 9 2013, 19:48
|||- - ViKo   Цитата(HHIMERA @ Jan 9 2013, 22:48) А пра...   Jan 9 2013, 19:55
|||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 23:55) Ржу-нима...   Jan 9 2013, 20:03
||||- - ViKo   Цитата(HHIMERA @ Jan 9 2013, 23:03) Продо...   Jan 9 2013, 20:05
|||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 23:55) Вы по пр...   Jan 9 2013, 20:07
||- - HHIMERA   Что вы референс не читали... RXNE говорит только о...   Jan 9 2013, 21:00
|||- - ViKo   Цитата(HHIMERA @ Jan 10 2013, 00:00) Что ...   Jan 9 2013, 21:02
|||- - Tahoe   Цитата(ViKo @ Jan 10 2013, 01:02) Да ну? ...   Jan 9 2013, 21:15
|||- - HHIMERA   Цитата(ViKo @ Jan 10 2013, 00:02) Да ну? ...   Jan 9 2013, 21:15
||- - HHIMERA   Цитата(ViKo @ Jan 9 2013, 23:53) И я прош...   Jan 9 2013, 21:06
|||- - ViKo   Цитата(HHIMERA @ Jan 10 2013, 00:06) О дё...   Jan 9 2013, 21:13
|||- - ViKo   Цитата(HHIMERA @ Jan 10 2013, 00:06) whil...   Jan 9 2013, 21:20
||- - Tahoe   Цитата(AHTOXA @ Jan 10 2013, 01:18) Я лич...   Jan 9 2013, 21:22
||- - ViKo   Цитата(AHTOXA @ Jan 10 2013, 00:18) Я лич...   Jan 9 2013, 21:48
||- - HHIMERA   Цитата(ViKo @ Jan 10 2013, 00:38) Фантази...   Jan 9 2013, 21:51
||- - Tahoe   Цитата(ViKo @ Jan 10 2013, 01:48) О том, ...   Jan 9 2013, 22:00
|- - sidy   Цитата(KnightIgor @ Nov 17 2012, 02:37) 1...   Dec 18 2012, 13:47
||- - Danis   Цитата(sidy @ Dec 18 2012, 17:47) Не полу...   Dec 18 2012, 17:04
|- - sidy   Цитата(KnightIgor @ Nov 17 2012, 02:37) 1...   Dec 19 2012, 09:25
|- - AHTOXA   Цитата(sidy @ Dec 19 2012, 15:25) И еще о...   Dec 19 2012, 09:36
|- - sidy   Цитата(AHTOXA @ Dec 19 2012, 13:36) Скоре...   Dec 19 2012, 15:35
- - HHIMERA   Цитата(SasaVitebsk @ Nov 16 2012, 13:45) ...   Nov 16 2012, 18:34
|- - SasaVitebsk   Цитата(HHIMERA @ Nov 16 2012, 22:34) ника...   Nov 16 2012, 19:09
- - cyb   Похоже у меня подобная проблема на STM32F103VE. По...   Dec 19 2012, 13:58
|- - AHTOXA   Цитата(cyb @ Dec 19 2012, 19:58) Похоже у...   Dec 19 2012, 14:22
|- - cyb   Цитата(AHTOXA @ Dec 19 2012, 16:22) У вас...   Dec 19 2012, 17:02
- - AHTOXA   Цитата(sidy @ Dec 19 2012, 21:35) Привожу...   Dec 19 2012, 17:36
|- - sidy   Цитата(AHTOXA @ Dec 19 2012, 21:36) Хорош...   Dec 20 2012, 04:08
|- - AHTOXA   А чему равно Rx_Data? Как настроен SPI, какие прер...   Dec 20 2012, 04:28
|- - sidy   Цитата(AHTOXA @ Dec 20 2012, 08:28) А чем...   Dec 20 2012, 04:51
- - sidy   Посмотрел я сейчас осциллограммы и кажется (если я...   Dec 20 2012, 06:41
- - AHTOXA   Цитата(sidy @ Dec 20 2012, 10:51) Кодvoid...   Dec 20 2012, 07:16
- - cyb   ЦитатаКак я понял для поднятия CS нужно ждать когд...   Dec 20 2012, 09:22
- - sidy   Спасибо за разъяснения. Задам еще вопрос здесь по ...   Dec 21 2012, 12:08
|- - AHTOXA   Похоже, MISO сконфигурирован как выход.   Dec 21 2012, 15:32
- - ViKo   Подправил код для чтения идентификатора SPI Flash ...   Jan 11 2013, 07:55
|- - AHTOXA   Я тут проделал несколько опытов, чтобы разобраться...   Jan 11 2013, 16:01
|- - HHIMERA   "Песец... серебристый."(С) Цитата(AH...   Jan 11 2013, 16:41
||- - AHTOXA   Цитата(HHIMERA @ Jan 11 2013, 22:41) Note...   Jan 11 2013, 17:04
|- - ViKo   Цитата(AHTOXA @ Jan 11 2013, 19:01) Перво...   Jan 11 2013, 17:24
||- - AHTOXA   Цитата(ViKo @ Jan 11 2013, 23:24) Разверт...   Jan 11 2013, 18:27
||- - ViKo   Цитата(AHTOXA @ Jan 11 2013, 21:27) Этой ...   Jan 11 2013, 18:50
|- - Tahoe   Цитата(AHTOXA @ Jan 11 2013, 20:01) Перво...   Jan 11 2013, 19:14
|- - ViKo   Цитата(Tahoe @ Jan 11 2013, 22:14) Сейчас...   Jan 11 2013, 19:20
- - Tahoe   На форуме ST были разборки с SPI_NSS и флагами, го...   Jan 11 2013, 19:24
|- - HHIMERA   Не секрет, что все эти флаги не обязательны... Что...   Jan 11 2013, 19:53
- - AHTOXA   Цитата(Tahoe @ Jan 12 2013, 01:14) Наскол...   Jan 11 2013, 20:30
|- - Огурцов   Можно я тут со своими аналогичными глупостями влез...   Jan 12 2013, 01:12
||- - AHTOXA   Цитата(Огурцов @ Jan 12 2013, 07:12) Вот ...   Jan 12 2013, 05:34
||- - Огурцов   Не проверял. По-любому проверки флага готовности о...   Jan 12 2013, 07:37
|- - ViKo   Цитата(AHTOXA @ Jan 11 2013, 23:30) Вот в...   Jan 12 2013, 07:40
||- - Огурцов   А что с атмелом не так ? у мег такой ерунды не был...   Jan 12 2013, 07:43
|- - ViKo   Цитата(AHTOXA @ Jan 11 2013, 23:30) Кстат...   Jan 12 2013, 08:13
|- - AHTOXA   Цитата(ViKo @ Jan 12 2013, 13:40) Пусть б...   Jan 12 2013, 09:01
|- - ViKo   Цитата(AHTOXA @ Jan 12 2013, 12:01) Как в...   Jan 12 2013, 09:35
- - Tahoe   ЦитатаI've never used slave mode without DMA b...   Jan 13 2013, 15:44
|- - AHTOXA   Цитата(Tahoe @ Jan 13 2013, 21:44) Цитата...   Jan 13 2013, 16:15
|- - Tahoe   Цитата(AHTOXA @ Jan 13 2013, 20:15) Судя ...   Jan 13 2013, 22:43
|- - AHTOXA   Понятно, что этот код работает. Но точно так же он...   Jan 14 2013, 05:28
- - Tahoe   Речь про "сакральный смысл" флага BSY. Н...   Jan 14 2013, 06:56
|- - AHTOXA   Так как раз его вариант и не раскрывает "сакр...   Jan 14 2013, 07:36
|- - ViKo   Цитата(Tahoe @ Jan 14 2013, 09:56) Речь п...   Jan 14 2013, 08:30
|- - Tahoe   Цитата(ViKo @ Jan 14 2013, 12:30) Смысл B...   Jan 14 2013, 09:05
|- - ViKo   Цитата(Tahoe @ Jan 14 2013, 12:05) Так во...   Jan 15 2013, 12:57
|- - HHIMERA   Приведённый вами код, как частный случай, ни о чём...   Jan 15 2013, 13:41
|- - AHTOXA   Цитата(ViKo @ Jan 15 2013, 18:57) Коль уж...   Jan 15 2013, 13:57
|- - HHIMERA   Цитата(AHTOXA @ Jan 15 2013, 16:57) С дру...   Jan 15 2013, 14:17
|- - ViKo   Цитата(AHTOXA @ Jan 15 2013, 16:57) С дру...   Jan 15 2013, 16:18
|- - AHTOXA   Цитата(ViKo @ Jan 15 2013, 22:18) Может в...   Jan 15 2013, 16:46
- - ViKo   Докладываю. Посылаю в длинный последовательный рег...   Mar 12 2013, 18:14
- - ViKo   И еще. Для переключения полярности синхроимпульсов...   Mar 13 2013, 04:38
- - ASDFG123   Как правильно написать функцию отправки 16 бит по ...   Mar 13 2016, 12:47
- - Alechek   Подниму тут тему. Странно, что обсуждают только ST...   Jun 22 2018, 08:36


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 03:00
Рейтинг@Mail.ru


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