Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 продолжает подкидывать сюрпрайзы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3
Dr.Alex
Цитата(Golikov A. @ Feb 18 2015, 10:16) *
я так понимаю у вас мастер.
А слейв чипселект использует? Может так получиться что вы его снимаете программно слишком рано, и слейв бросает передавать?


Этафсё лишние сущности. Есть осциллограмма, её надо воспринимать как данность. Там видно, что на шине присутствуют некие даные, а принимаются они с ошибкой.
Golikov A.
какая то же причина должна быть. Не вы же один используете этот процессор.
Dr.Alex
Цитата(Golikov A. @ Feb 18 2015, 14:44) *
какая то же причина должна быть. Не вы же один используете этот процессор.


А при чём тут не относящиеся к делу факты вроде самочувствия слэйва и прочее?
ViKo
Цитата(Dr.Alex @ Feb 18 2015, 13:54) *
А при чём тут не относящиеся к делу факты вроде самочувствия слэйва и прочее?

Сначала поменяйте режимы, а потом обсудим самочувствие всех и всего. Потом вернем назад, обещаю. biggrin.gif
Dr.Alex
Цитата(ViKo @ Feb 18 2015, 14:58) *
Сначала поменяйте режимы, а потом обсудим самочувствие всех и всего. Потом вернем назад, обещаю. biggrin.gif


Не вижу смысла. С лаподрыгалкой всё работает, думал уж так и оставить, но стрёмно. Не из-за паршивого СПИ даже, а в целом.
Нужно понять, можно ли вообще доверять этому таракану или больше с ним не работать.
А то у меня ещё на записи в СД-карточку по ДМА стоит жуткая заплатка, без которой не работает.
Поэтому сейчас решил не использовать их либу и проверяю, что будет если самому всё делать.
ViKo
Цитата(Dr.Alex @ Feb 18 2015, 14:05) *
Поэтому сейчас решил не использовать их либу и проверяю, что будет если самому всё делать.

И это правильно.
Golikov A.
Цитата
Не вижу смысла. С лаподрыгалкой всё работает, думал уж так и оставить, но стрёмно.

Цитата
А при чём тут не относящиеся к делу факты вроде самочувствия слэйва и прочее?


Это все ИМХО с одного поля ягоды.

То что стало работать с ногодрыгом, не означает что проблема была со стороны STM в железном модуле. А что если слейв делает что-то не так, и просто в железном SPI это повторяется так что вы постоянно это видите, в ногодрыге по какой-то причине пропускаете. Что если ошибка просто маскируется... Такая ошибка будет появлятся и устраняться от изменения кода и нагрузки проца.

У себя в проекте если есть ошибка, а потом она пропала, я ищу что я такого сделал чтобы это произошло, и если не вижу ничего, то не считаю ошибку устраненной, копаю дальше. Но не призываю всех делать так. Писал для ПЛИС один раз как раз SPI, вот там была ошибка очень далеко, а проявлялась в сдвиге приема, причем чуть поправишь код в одном месте, а она вылезает в другом - неприятно...
Dr.Alex
Цитата(Golikov A. @ Feb 18 2015, 15:53) *
А что если слейв делает что-то не так


Никакого слейва нет, а есть сигнал, который присутствует на шине, и который нужно воспринимать как данность. Откуда он берётся, я не знаю. Надувает электроны ветром, может быть.
ViKo
Я тоже не вижу никаких сбоев на картинках. Проблема внутри STM, аппаратная или программная. Своя программа должна показать.
Dr.Alex
Вот такой код работает с тем же косяком.. :-о

Код
HAL_StatusTypeDef SPI_TransmitReceive (SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
{
    while (Size--)
    {
        hspi->Instance->DR = *(pTxData++);

        while (!(hspi->Instance->SR & SPI_SR_RXNE));
        while (  hspi->Instance->SR & SPI_SR_BSY);

        *(pRxData++) = hspi->Instance->DR;
    }

    return HAL_OK;
}
ViKo
Еще раз советую попробовать вместо "всё по нулям" сделать "всё по единицам".
Dr.Alex
Цитата(ViKo @ Feb 18 2015, 17:30) *
Еще раз советую попробовать вместо "всё по нулям" сделать "всё по единицам".


Ну попробовал спеццыально для вас. Трудно что ли? К моему удивлению, принимаемые числа остались теми же, хотя стоило ожидать полной лабуды.
Но нестабильно, иногда ловится имено лабуда, что и предсказуемо.
ViKo
А картину (маслом) осциллографом можно? Как первая из показанных.
Dr.Alex
Цитата(ViKo @ Feb 18 2015, 17:46) *
А картину (маслом) осциллографом можно? Как первая из показанных.

UPD: Заметил стабильный полтергейст:: младший бит остаётся от предыдущего байта!!!
На картинке младший бит первого 0, а второго 1, но читается 0.
Если бы у первого байта младший был 1, то и второй прочитался бы с 1!!! :-о :-о :-о

blackfin
Цитата(Dr.Alex @ Feb 18 2015, 16:42) *
Ну попробовал спеццыально для вас. Трудно что ли?
А где чип селект?
ViKo
Подумайте над этой хренью:
During discontinuous communications, there is a 2 APB clock period delay between the
write operation to SPI_DR and the BSY bit setting.

Цитата(Dr.Alex @ Feb 18 2015, 16:51) *
UPD: Заметил стабильный полтергейст:: младший бит остаётся от предыдущего байта!!!

Т.е. он принялся, но не успел записаться в DR, а готовность уже выскочила (вернее, BSY не вскочила?).
Dr.Alex
Цитата(blackfin @ Feb 18 2015, 17:55) *
А где чип селект?

Зачем?

Цитата(ViKo @ Feb 18 2015, 17:58) *
Подумайте над этой хренью:
During discontinuous communications, there is a 2 APB clock period delay between the
write operation to SPI_DR and the BSY bit setting.

Чё-то не вижу тут никакой засады.
У меня RXNE проверяется, и чиста паприколу поставил я задержку 1 мс между записью и проверкой.

Цитата(ViKo @ Feb 18 2015, 18:00) *
Т.е. он принялся, но не успел записаться в DR, а готовность уже выскочила.

Да я уже между каждым действием задержки по 1 мс ставил..
Golikov A.
а режим работы не 7 бит стоит?
ViKo
А вы там такты случайно нигде не отключаете для экономии питания? Или в спящий режим не впадаете?

Цитата(Golikov A. @ Feb 18 2015, 17:09) *
а режим работы не 7 бит стоит?

Такого нема.

Я свою фантазию исчерпал. Запитайте от 3V, и накатайте кляузу производителю.
Golikov A.
погодите как такого нет?
формат данных может быть установлен от 4 до 16, в SMT32F3, неужели в F4 не так?

думаю пора привести значения регистров конфигурационных после инициализации, и поглядеть какой в итоге режим бибилотека задала
ViKo
Цитата(Golikov A. @ Feb 18 2015, 17:30) *
погодите как такого нет?
формат данных может быть установлен от 4 до 16, в SMT32F3, неужели в F4 не так?

Точно, в F3 есть, а в F2, F4 нет.
Golikov A.
ну тоды ой...
тоды этот модуль может работать вообще как ему нравиться... если они от серии к серии меняют его...
scifi
Ну, чуйдеса бывают, кто же от них застрахован?
Я вот делал на STM32F4 генератор произвольных сигналов на внешнем 8-разрядном ЦАП, закачивал туда данные с частотой 20 МГц через GPIO при помощи DMA. Всё работало 99% времени, и иногда проскакивали произвольные данные, которые довольно чётко коррелировали с тем, что приходило на вход АЦП (там параллельно работал АЦП, данные опять же шли через DMA). То есть как будто данные из АЦП иногда просачивались на GPIO через DMA. Поскольку 99% меня устраивало, я забил :-)
Dr.Alex
Кароче, диагноз подтверждается:: Каждый младший бит берётся из предыдущего байта.
Первая осциллограмма принимается как 83 84 1B 0A, вторая 83 4E 09 2B.
ViKo
Не могу такого представить. Там же сдвиговый регистр. Ни один бит не задерживается, все передвигаются, и не по кольцу. Значит, в сдвиговом регистре все биты верные, а при переносе в DR младший бит задерживается в неком промежуточном регистре?

А еще можно понизить уровень оптимизации компилятора. И посмотреть в ассемблерный листинг. У меня компилятор "ператрахивал" команды, ставил не попорядку.
Golikov A.
в F3 там еще после сдвигового регистра FIFO стоит, тут тоже может быть. И в этом фифо может быть какая-то беда...

А что будет если послать 4 байта, а потом 4 раза считать. в F3 фифо32 бита обещали...

и еще как-то надо исключить проблемы одного конкретного экземпляра
blackfin
Цитата(ViKo @ Feb 18 2015, 19:46) *
Не могу такого представить. Там же сдвиговый регистр. Ни один бит не задерживается, все передвигаются, и не по кольцу. Значит, в сдвиговом регистре все биты верные, а при переносе в DR младший бит задерживается в неком промежуточном регистре?.

Я могу представить.. Слейв неверно определяет границы байта. Скорей всего сигнал "слейв селект" не синхронизирован с клоком и данными.. biggrin.gif
ViKo
Но, тем не менее, исправно выдает в шину правильные бит за битом?
Dr.Alex
Цитата(blackfin @ Feb 18 2015, 21:01) *
Я могу представить.. Слейв неверно определяет границы байта. Скорей всего сигнал "слейв селект" не синхронизирован с клоком и данными.. biggrin.gif

Это шутко?

Цитата(ViKo @ Feb 18 2015, 21:05) *
Но, тем не менее, исправно выдает в шину правильные бит за битом?

С передачей проблем не замечено.
blackfin
Цитата(Dr.Alex @ Feb 16 2015, 21:22) *
Ещё используются SPI4 и SPI6, передача на всех трёх без вопросов, приём на 4-ом тоже без проблем, 2-й вот почему-то глючит.

Цитата(ViKo @ Feb 18 2015, 20:05) *
Но, тем не менее, исправно выдает в шину правильные бит за битом?

Ну, может, не слейв, а FSM мастера SPI2. Либо из-за неверного сброса FSM, либо из-за того, что где-то нарушается времянка setup для первого клока, FSM пропускает первый бит и все последующие байты принимает со сдвигом на один бит. Возможно битый МК. Хорошо бы проверить на другой такой же плате.
Dr.Alex
Цитата(blackfin @ Feb 18 2015, 21:22) *
Ну, может, не слейв, а FSM мастера SPI2. Либо из-за неверного сброса FSM, либо из-за того, что где-то нарушается времянка setup

Паффторяю:: никакого слэйва вооообще нет и никогда не было. Не существует в природе. В принципе.
А сигнал на лапе MISO появляется случайно, за счёт возмущений в хаотичном движении электронов в проводе.
Если этот сигнал нарушает протокол SPI и какие-то сетап-холды, это должно быть видно из осциллограммы.
А если на осциллограмме всё ОК (как оно и есть), то поблагодарим послушные электроны и займёмсо делом.
blackfin
Цитата(Dr.Alex @ Feb 18 2015, 20:28) *
А если на осциллограмме всё ОК (как оно и есть), то поблагодарим послушные электроны и займёмсо делом.

Есть вторая такая же плата, на которой можно было бы проверить обнаруженный эффект?
Dr.Alex
Цитата(blackfin @ Feb 18 2015, 21:32) *
Есть вторая такая же плата, на которой можно было бы проверить обнаруженный эффект?


Есть. Как только я налетел на проблему (ещё не понятую на тот момент), то видел её и на второй плате. Однако вся дальнейшая работа шла с одной платой.
ViKo
В сообщении №19 младший бит не берется из предыдущего байта.
blackfin
Цитата(Dr.Alex @ Feb 18 2015, 20:35) *
Есть. Как только я налетел на проблему (ещё не понятую на тот момент), то видел её и на второй плате. Однако вся дальнейшая работа шла с одной платой.

Тогда присоединяюсь к мнению Porty из поста #18. Нужно попробовать задержать клок и данные друг относительно друга на несколько нс.
Еще хорошо бы сравнить длины проводников клока и данных с длинами проводников в тех портах, которые работают без ошибок, например, с SPI4.
То есть, если на SPI4 клок короче данных, то и на SPI2 данные нужно задержать. Для этого можно повесить на линию небольшую емкость.
Dr.Alex
Цитата(ViKo @ Feb 18 2015, 21:57) *
В сообщении №19 младший бит не берется из предыдущего байта.

Не может быть. В то время я просто не очень смотрел на предыдущий байт, поскоку ещё не понял в чём дело. При этом сам этот первый байт менялся. То есть, именно в тот раз наверняка действительно принялось 0x85, хотя я написал что якобы 0x84.


Цитата(blackfin @ Feb 18 2015, 22:10) *
Нужно попробовать задержать клок и данные друг относительно друга на несколько нс.
Еще хорошо бы сравнить длины проводников клока и данных с длинами проводников в тех портах, которые работают без ошибок, например, с SPI4.

Хосспади, ну какие наносекунды, когда там и так сдвиг на полтакта..
Все "участники рынка" выставляют данные по отрицательному фронту, а фиксируют по положительному.
blackfin
Цитата(Dr.Alex @ Feb 18 2015, 21:16) *
Хосспади, ну какие наносекунды, когда там и так сдвиг на полтакта..
Все "участники рынка" выставляют данные по отрицательному фронту, а фиксируют по положительному.

Ну, сравнить-то длины проводников не трудно? SPI4 vs SPI2. А то, все ж уже заинтригованы.. biggrin.gif
Dr.Alex
Цитата(blackfin @ Feb 18 2015, 22:27) *
Ну, сравнить-то длины проводников не трудно? SPI4 vs SPI2. А то, все ж уже заинтригованы.. biggrin.gif


Не трудно, но вредно. Опять пойдёт трындёж о не имеющих отношения к делу сущностях.
Как вы не поймёте, что конечный итог всех этих измерений это осциллограмма.
А длины там 4 см максимум по качественной 6-слой плате....
blackfin
Цитата(Dr.Alex @ Feb 18 2015, 21:32) *
А длины там 4 см максимум по качественной 6-слой плате....

OK. Нет вопросов..
ViKo
Код
  size--;
  SPI2->DR = *pTx++;
  while (size--) {
    while (!(SPI2->SR & SPI_SR_TXE));
    SPI2->DR = *pTx++;
    while (!(SPI2->SR & SPI_SR_RXNE));
    *pRx++ = SPI2->DR;
  }
  while (!(SPI2->SR & SPI_SR_RXNE));
  *pRx++ = SPI2->DR;
  while (SPI2->SR & SPI_SR_BSY);
Golikov A.
DrAlex - вы зря исходитесь про возмущения электронов.
В конечном итоге SPI - это железный аппарат у которого есть синхронизация и прочее, и требования на setup и hold, а также процедура сброса. В которой часто принимает участие чипселект. Потому его вам часто и советуют. Добавили бы вы его на осциллограмму и все бы успокоились sm.gif.

В вашем конкретном случае действительно наверное он непричем. При сбое синхронизации младший бит принимался бы как старший следующего байта.

А вот вычитывание данных раньше срока - может быть. При передачи данных внутри по FIFO (надеюсь оно есть) вы хватаете байт раньше чем успел передаться младший бит.

Попробуйте
такое.
вычитать из DR 8 байт. (чтобы наверняка)
потом передать 4 байта
потом сделать паузу секунду (ну тоже чтобы наверняка)
потом считать из DR 4 байта и проанализировать.

потом надо сделать тоже только передать - секунда - считать
а потом уменьшать интервал и глядеть.


И еще одно, надо проверить инициализацию, тщательно, особенно клоки тактирующие аппарат SPI и скорости, последовательность присвоения регистров, многие из них требуют настройки до включения модуля. Вполне возможно что все же где то какая-то синхронизация сбита и модуль хромает.
ViKo
FIFO там нет, схема в руководстве показана.
Ну, хорошо, ....., а по одному байту пересылку проверить?
А выбор в низкий уровень навсегда посадить?
SasaVitebsk
Я использую SPI1 и SPI3. Никаких глюков слава богу не заметил. И вообще всё как-то хорошо работает. Слава богу. ))
Golikov A.
А какой конкретно проц? Надо уже мануал почитать...

в F3 есть и FIFO и разные биты на SPI...
ViKo
Цитата(Golikov A. @ Feb 19 2015, 11:16) *
А какой конкретно проц? Надо уже мануал почитать...

В теме есть. Надо! rolleyes.gif
blackfin
Цитата(SasaVitebsk @ Feb 19 2015, 11:03) *
Я использую SPI1 и SPI3. Никаких глюков слава богу не заметил.

Наверняка их нет и в SPI2. Если в доках не оговорены какие-то особые фичи для SPI2, то почти наверняка производитель использует один и тот же hard-macro для всех модулей SPI на кристалле. То есть, у всех модулей SPI не только одинаковый код RTL, но и одинаковая топология в кремнии. Поэтому, на мой взгяд, нужно искать различия в подключении модулей. Различия могут быть или в софтверной инициализации (что, как я понимаю, маловероятно) или в топологии ПП. Топология ПП действительно не должна иметь влияния, но при том лишь условии, что данные выставляются и защелкиваются по разным фронтам, на что нам ТС усиленно и намекает. Но вполне возможны ошибки в доках на чип, в результате чего все модули выставляют и защелкивают данные по одному и тому же фронту. При этом, из-за задержек в ПП, какие-то модули работают, а какие-то нет.. Вот такое мое ИМХО.. rolleyes.gif
scifi
Цитата(Golikov A. @ Feb 19 2015, 11:16) *
Надо уже мануал почитать...

Мануалы - для трусов! Только хардкор, только реверс-инжениринг! biggrin.gif
ViKo
Разница в том, что SPI2 подключена к APB1, и тактируется другой частотой, которую Dr.Alex...?
Golikov A.
Цитата
В теме есть. Надо! rolleyes.gif


есть как и 7 страниц темы, я чет не нашел, что явно еще раз сказать трудно?
ViKo
Цитата(Golikov A. @ Feb 19 2015, 11:50) *
есть как и 7 страниц темы, я чет не нашел, что явно еще раз сказать трудно?

STM32F439
P.S. У меня в настройках задано N (много) сообщений на страницу, и это у меня вторая страница. rolleyes.gif
P.P.S. Не прочитав всей темы, вы рискуете задавать одни и те же вопросы, и давать уже даденые рекомендации.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.