Dr.Alex
Feb 18 2015, 10:05
Цитата(Golikov A. @ Feb 18 2015, 10:16)

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

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

А при чём тут не относящиеся к делу факты вроде самочувствия слэйва и прочее?
Сначала поменяйте режимы, а потом обсудим самочувствие всех и всего. Потом вернем назад, обещаю.
Dr.Alex
Feb 18 2015, 11:05
Цитата(ViKo @ Feb 18 2015, 14:58)

Сначала поменяйте режимы, а потом обсудим самочувствие всех и всего. Потом вернем назад, обещаю.

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

Поэтому сейчас решил не использовать их либу и проверяю, что будет если самому всё делать.
И это правильно.
Golikov A.
Feb 18 2015, 11:53
Цитата
Не вижу смысла. С лаподрыгалкой всё работает, думал уж так и оставить, но стрёмно.
Цитата
А при чём тут не относящиеся к делу факты вроде самочувствия слэйва и прочее?
Это все ИМХО с одного поля ягоды.
То что стало работать с ногодрыгом, не означает что проблема была со стороны STM в железном модуле. А что если слейв делает что-то не так, и просто в железном SPI это повторяется так что вы постоянно это видите, в ногодрыге по какой-то причине пропускаете. Что если ошибка просто маскируется... Такая ошибка будет появлятся и устраняться от изменения кода и нагрузки проца.
У себя в проекте если есть ошибка, а потом она пропала, я ищу что я такого сделал чтобы это произошло, и если не вижу ничего, то не считаю ошибку устраненной, копаю дальше. Но не призываю всех делать так. Писал для ПЛИС один раз как раз SPI, вот там была ошибка очень далеко, а проявлялась в сдвиге приема, причем чуть поправишь код в одном месте, а она вылезает в другом - неприятно...
Dr.Alex
Feb 18 2015, 12:19
Цитата(Golikov A. @ Feb 18 2015, 15:53)

А что если слейв делает что-то не так
Никакого слейва нет, а есть сигнал, который присутствует на шине, и который нужно воспринимать как данность. Откуда он берётся, я не знаю. Надувает электроны ветром, может быть.
Я тоже не вижу никаких сбоев на картинках. Проблема внутри STM, аппаратная или программная. Своя программа должна показать.
Dr.Alex
Feb 18 2015, 13:02
Вот такой код работает с тем же косяком.. :-о
Код
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;
}
Еще раз советую попробовать вместо "всё по нулям" сделать "всё по единицам".
Dr.Alex
Feb 18 2015, 13:42
Цитата(ViKo @ Feb 18 2015, 17:30)

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

А картину (маслом) осциллографом можно? Как первая из показанных.
UPD: Заметил стабильный полтергейст:: младший бит остаётся от предыдущего байта!!!
На картинке младший бит первого 0, а второго 1, но читается 0.
Если бы у первого байта младший был 1, то и второй прочитался бы с 1!!! :-о :-о :-о
blackfin
Feb 18 2015, 13:55
Цитата(Dr.Alex @ Feb 18 2015, 16:42)

Ну попробовал спеццыально для вас. Трудно что ли?
А где чип селект?
Подумайте над этой хренью:
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
Feb 18 2015, 14:03
Цитата(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.
Feb 18 2015, 14:09
а режим работы не 7 бит стоит?
А вы там такты случайно нигде не отключаете для экономии питания? Или в спящий режим не впадаете?
Цитата(Golikov A. @ Feb 18 2015, 17:09)

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

погодите как такого нет?
формат данных может быть установлен от 4 до 16, в SMT32F3, неужели в F4 не так?
Точно, в F3 есть, а в F2, F4 нет.
Golikov A.
Feb 18 2015, 14:46
ну тоды ой...
тоды этот модуль может работать вообще как ему нравиться... если они от серии к серии меняют его...
Ну, чуйдеса бывают, кто же от них застрахован?
Я вот делал на STM32F4 генератор произвольных сигналов на внешнем 8-разрядном ЦАП, закачивал туда данные с частотой 20 МГц через GPIO при помощи DMA. Всё работало 99% времени, и иногда проскакивали произвольные данные, которые довольно чётко коррелировали с тем, что приходило на вход АЦП (там параллельно работал АЦП, данные опять же шли через DMA). То есть как будто данные из АЦП иногда просачивались на GPIO через DMA. Поскольку 99% меня устраивало, я забил :-)
Dr.Alex
Feb 18 2015, 15:44
Кароче, диагноз подтверждается:: Каждый младший бит берётся из предыдущего байта.
Первая осциллограмма принимается как 83 84 1B 0A, вторая 83 4E 09 2B.
Не могу такого представить. Там же сдвиговый регистр. Ни один бит не задерживается, все передвигаются, и не по кольцу. Значит, в сдвиговом регистре все биты верные, а при переносе в DR младший бит задерживается в неком промежуточном регистре?
А еще можно понизить уровень оптимизации компилятора. И посмотреть в ассемблерный листинг. У меня компилятор "ператрахивал" команды, ставил не попорядку.
Golikov A.
Feb 18 2015, 16:59
в F3 там еще после сдвигового регистра FIFO стоит, тут тоже может быть. И в этом фифо может быть какая-то беда...
А что будет если послать 4 байта, а потом 4 раза считать. в F3 фифо32 бита обещали...
и еще как-то надо исключить проблемы одного конкретного экземпляра
blackfin
Feb 18 2015, 17:01
Цитата(ViKo @ Feb 18 2015, 19:46)

Не могу такого представить. Там же сдвиговый регистр. Ни один бит не задерживается, все передвигаются, и не по кольцу. Значит, в сдвиговом регистре все биты верные, а при переносе в DR младший бит задерживается в неком промежуточном регистре?.
Я могу представить.. Слейв неверно определяет границы байта. Скорей всего сигнал "слейв селект" не синхронизирован с клоком и данными..
Но, тем не менее, исправно выдает в шину правильные бит за битом?
Dr.Alex
Feb 18 2015, 17:15
Цитата(blackfin @ Feb 18 2015, 21:01)

Я могу представить.. Слейв неверно определяет границы байта. Скорей всего сигнал "слейв селект" не синхронизирован с клоком и данными..

Это шутко?
Цитата(ViKo @ Feb 18 2015, 21:05)

Но, тем не менее, исправно выдает в шину правильные бит за битом?
С передачей проблем не замечено.
blackfin
Feb 18 2015, 17:22
Цитата(Dr.Alex @ Feb 16 2015, 21:22)

Ещё используются SPI4 и SPI6, передача на всех трёх без вопросов, приём на 4-ом тоже без проблем, 2-й вот почему-то глючит.
Цитата(ViKo @ Feb 18 2015, 20:05)

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

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

А если на осциллограмме всё ОК (как оно и есть), то поблагодарим послушные электроны и займёмсо делом.
Есть вторая такая же плата, на которой можно было бы проверить обнаруженный эффект?
Dr.Alex
Feb 18 2015, 17:35
Цитата(blackfin @ Feb 18 2015, 21:32)

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

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

В сообщении №19 младший бит не берется из предыдущего байта.
Не может быть. В то время я просто не очень смотрел на предыдущий байт, поскоку ещё не понял в чём дело. При этом сам этот первый байт менялся. То есть, именно в тот раз наверняка действительно принялось 0x85, хотя я написал что якобы 0x84.
Цитата(blackfin @ Feb 18 2015, 22:10)

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

Хосспади, ну какие наносекунды, когда там и так сдвиг на полтакта..
Все "участники рынка" выставляют данные по отрицательному фронту, а фиксируют по положительному.
Ну, сравнить-то длины проводников не трудно? SPI4 vs SPI2. А то, все ж уже заинтригованы..
Dr.Alex
Feb 18 2015, 18:32
Цитата(blackfin @ Feb 18 2015, 22:27)

Ну, сравнить-то длины проводников не трудно? SPI4 vs SPI2. А то, все ж уже заинтригованы..

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

А длины там 4 см максимум по качественной 6-слой плате....
OK. Нет вопросов..
Код
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.
Feb 19 2015, 07:44
DrAlex - вы зря исходитесь про возмущения электронов.
В конечном итоге SPI - это железный аппарат у которого есть синхронизация и прочее, и требования на setup и hold, а также процедура сброса. В которой часто принимает участие чипселект. Потому его вам часто и советуют. Добавили бы вы его на осциллограмму и все бы успокоились

.
В вашем конкретном случае действительно наверное он непричем. При сбое синхронизации младший бит принимался бы как старший следующего байта.
А вот вычитывание данных раньше срока - может быть. При передачи данных внутри по FIFO (надеюсь оно есть) вы хватаете байт раньше чем успел передаться младший бит.
Попробуйте
такое.
вычитать из DR 8 байт. (чтобы наверняка)
потом передать 4 байта
потом сделать паузу секунду (ну тоже чтобы наверняка)
потом считать из DR 4 байта и проанализировать.
потом надо сделать тоже только передать - секунда - считать
а потом уменьшать интервал и глядеть.
И еще одно, надо проверить инициализацию, тщательно, особенно клоки тактирующие аппарат SPI и скорости, последовательность присвоения регистров, многие из них требуют настройки до включения модуля. Вполне возможно что все же где то какая-то синхронизация сбита и модуль хромает.
FIFO там нет, схема в руководстве показана.
Ну, хорошо, ....., а по одному байту пересылку проверить?
А выбор в низкий уровень навсегда посадить?
SasaVitebsk
Feb 19 2015, 08:03
Я использую SPI1 и SPI3. Никаких глюков слава богу не заметил. И вообще всё как-то хорошо работает. Слава богу. ))
Golikov A.
Feb 19 2015, 08:16
А какой конкретно проц? Надо уже мануал почитать...
в F3 есть и FIFO и разные биты на SPI...
Цитата(Golikov A. @ Feb 19 2015, 11:16)

А какой конкретно проц? Надо уже мануал почитать...
В теме есть. Надо!
blackfin
Feb 19 2015, 08:24
Цитата(SasaVitebsk @ Feb 19 2015, 11:03)

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

Надо уже мануал почитать...
Мануалы - для трусов! Только хардкор, только реверс-инжениринг!
Разница в том, что SPI2 подключена к APB1, и тактируется другой частотой, которую Dr.Alex...?
Golikov A.
Feb 19 2015, 08:50
Цитата
В теме есть. Надо! rolleyes.gif
есть как и 7 страниц темы, я чет не нашел, что явно еще раз сказать трудно?
Цитата(Golikov A. @ Feb 19 2015, 11:50)

есть как и 7 страниц темы, я чет не нашел, что явно еще раз сказать трудно?
STM32F439
P.S. У меня в настройках задано N (много) сообщений на страницу, и это у меня вторая страница.

P.P.S. Не прочитав всей темы, вы рискуете задавать одни и те же вопросы, и давать уже даденые рекомендации.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.