-
- busy в одном из spi(не помню каком, вроде spi5) периодически лажал. передача закончилась, а он висит. в остальных spi такого не было. юзаю два потока dma(прием и передача). все передалось когда dma на прием сработало. если прием не нужен - Mikla(534 знак., 03.03.2020 18:46)
- пробывал чтение DR между обменами , не помогло - Aleksey_75(03.03.2020 18:57)
- Дабы не плодить темы! чудо-чудное partII) Послыка по SPI состоит из двух массивов, в первом 1 или 4 байта (в зависимости от команды) и второй из N кол-ва байт. Все это оформлено двумя заходами DMA, первый только на отправку, второй прием и Aleksey_75(372 знак., 03.03.2020 15:00)
- UPD! Если кто столкнется с подобной проблемой, мой костыль! Лишние байты летят только при делителях BR от 16 и больше, при меньших их нет! Чтоб не заморачиваться , просто перед каждой транзакцией по spi делаем reinit spi интерфейса и никаких левых данных! - Aleksey_75(06.03.2020 03:57)
- У вас, похоже, косяк с CS#, при низком битрейте снимаете рано. - evgeniy1294(06.03.2020 10:43)
- нет! вот весь расклад, с cs все норм да и каким он боком мастеру Aleksey_75(105 знак., 06.03.2020 11:32, ссылка)
- как минимум dma rx разрешают первым - Mikla(06.03.2020 11:48)
- побывал разрешать первым все тоже самое, "левый байт" в приеме - Aleksey_75(06.03.2020 12:01)
- первым разрешают dma rx на случай если возможно прерывание между запусками dma tx и rx. - Mikla(06.03.2020 16:23)
- это я понимаю, вообще изначально таки и было, видимо при экспериментах поменял, но сути это не меняет - Aleksey_75(06.03.2020 23:06)
- первым разрешают dma rx на случай если возможно прерывание между запусками dma tx и rx. - Mikla(06.03.2020 16:23)
- побывал разрешать первым все тоже самое, "левый байт" в приеме - Aleksey_75(06.03.2020 12:01)
- 1) У вас в постах слишком много восклицательных знаков. 2) Вы уже дважды проигнорировали мои намёки на CCR_EN. Кое-кто, видимо, не читатель. - SciFi(06.03.2020 11:39)
- CCR_EN устанавливается мгновенно, ну как минимум если в следующей строке его проверить он уже стоит, так что не туда - Aleksey_75(06.03.2020 12:07)
- Чукча не читатель: SciFi(68 знак., 06.03.2020 12:08, ссылка)
- точно пЕсатель! говорю же, проверка ничего не дает , т.к. при первой проверке EN уже установлен, для чего циклы городить ? - Aleksey_75(06.03.2020 23:07)
- Вот: SciFi(381 знак., 06.03.2020 23:34)
- ээээ... Какой Вы веселый !! Aleksey_75(1034 знак., 07.03.2020 02:09)
- Вот: SciFi(381 знак., 06.03.2020 23:34)
- точно пЕсатель! говорю же, проверка ничего не дает , т.к. при первой проверке EN уже установлен, для чего циклы городить ? - Aleksey_75(06.03.2020 23:07)
- Чукча не читатель: SciFi(68 знак., 06.03.2020 12:08, ссылка)
- У меня есть железки на stm32f1, f4, f7, h7, g4. Почти на всех используется spi, проблем нет. - evgeniy1294(06.03.2020 11:49)
- если я отправляю все одной посылкой у меня тож проблем нет, а вот две транзакции подряд в рамках одного пакета дают такое - Aleksey_75(06.03.2020 12:09)
- глянул чуть внимательнее ваш код, т.е. вы запускаете dma tx, ждете отправки, не выгребаете приемный буфер spi, потом опять запускаете dma tx и уже rx и хотите чтобы не было левого байта? Это как? перед вторым запуском гляньте бит rxne. - Mikla(06.03.2020 16:48)
- При активации dma rxne автоматом сбрасывается, побывал и ручками все флаги сбрасывать перед отправкой самих данных один фиг один , а иногда и два лишних байта! Aleksey_75(176 знак., 06.03.2020 23:04)
- Ууу, как все у вас запущенно... - LightElf(07.03.2020 20:03)
- как интересно вы флаг rxne сбрасываете? и при активации dma rx при взведенном rxne он сбрасывается т.к. dma выгребает лишний байт. - Mikla(07.03.2020 18:50)
- Не автоматом, а пулеметом, бля. - il-2(07.03.2020 11:47)
- При активации dma rxne автоматом сбрасывается, побывал и ручками все флаги сбрасывать перед отправкой самих данных один фиг один , а иногда и два лишних байта! Aleksey_75(176 знак., 06.03.2020 23:04)
- глянул чуть внимательнее ваш код, т.е. вы запускаете dma tx, ждете отправки, не выгребаете приемный буфер spi, потом опять запускаете dma tx и уже rx и хотите чтобы не было левого байта? Это как? перед вторым запуском гляньте бит rxne. - Mikla(06.03.2020 16:48)
- если я отправляю все одной посылкой у меня тож проблем нет, а вот две транзакции подряд в рамках одного пакета дают такое - Aleksey_75(06.03.2020 12:09)
- CCR_EN устанавливается мгновенно, ну как минимум если в следующей строке его проверить он уже стоит, так что не туда - Aleksey_75(06.03.2020 12:07)
- как минимум dma rx разрешают первым - Mikla(06.03.2020 11:48)
- нет! вот весь расклад, с cs все норм да и каким он боком мастеру Aleksey_75(105 знак., 06.03.2020 11:32, ссылка)
- Юзаем в каждом устройстве от 3 до 5 spi. В редких случаях без DMA. скорости абсолютно разные -2 - 40МГц. процы от 105 до 427. в разных корпусах. Глобальных глюков не замечено. Чем меньше скорость, тем больше времени для вашего глюка. - Mikla(06.03.2020 09:12)
- На большой скорости лучше заметны гонки между периферией и процом, например. - SciFi(06.03.2020 09:14)
- Ты хоть понимаешь, что ты чего-то не понимаешь? Сгибнешь ни за что под ворохом своих костылей. - il-2(06.03.2020 08:52)
- У вас, похоже, косяк с CS#, при низком битрейте снимаете рано. - evgeniy1294(06.03.2020 10:43)
- FIFO включен? - evgeniy1294(03.03.2020 18:05)
- у spi нету fifo - Aleksey_75(03.03.2020 18:25)
- у какого STM32 нету? В STM32L476 есть Лагунов(03.03.2020 19:30 - 19:34)
- у мну нету - Aleksey_75(03.03.2020 19:37)
- барабашка какая-то, вкладываю исходники Aleksey_75(872 знак., 03.03.2020 18:30 - 18:34)
- Короче, слухай сюды: il-2(895 знак., 06.03.2020 12:27)
- Ничего не понимаю. Приём и передача у SPI работают одновременно жеж. Почему в коде как бы сначала ждём окончания передачи, потом пытаемся что-то принять? Ведь поздно принимать. Ну и просто к сведению: "DMA_CCR &= ~EN" работает не сразу, желательно SciFi(45 знак., 03.03.2020 21:23)
- Вы о чем ?? "Почему в коде как бы сначала ждём окончания передачи, потом пытаемся что-то принять?" это почему поздно то ? в DR принятый байт и он будет там лежать пока мы не поместим туда данные для отправки! Короч! я не одинок! похоже глюк Aleksey_75(43 знак., 03.03.2020 21:30, ссылка)
- Ээээ? регистр DR для приема, и регистр DR для передачи, суть разные физически регистры. Поэтому фраза " в DR принятый байт и он будет там лежать пока мы не поместим туда данные для отправки" лишена смысла. - Rainman62(06.03.2020 06:08)
- вообще говоря меня картинки из RM в ступор вводят, судя по картинкам DMA в DR задвигает второй байт после отправки первого БИТА первого байта, что там можно принять в первом байте ХЗ! Aleksey_75(03.03.2020 21:35)
- веселый spi! выкинул DMA, по флагам "ручками" гружу/выгружаю DR и опять смещение на один байт! Все нормально получается если перед первым байтом прочитать DR? почему с dma это не прокатывает хз(( - Aleksey_75(03.03.2020 22:00)
- Просто не разобрался. Впрочем, если и без DMA работает, зачем грузиться лишний раз? Мы уже не так молоды для этих упражнений. И ещё не так стары, чтобы отгонять альцгеймера ребусами. - SciFi(03.03.2020 22:11)
- )) ну работает тоже через ЖО, перед транзакцией надо читать DR! Почему заморочился с дма, т.к. бывают очень большие пакеты 4-8К в связи с этим и не создал локальный буфер чтоб за один раз все выплевывать, да и колбек там можно поставить чтоб Aleksey_75(327 знак., 03.03.2020 22:18)
- Просто не разобрался. Впрочем, если и без DMA работает, зачем грузиться лишний раз? Мы уже не так молоды для этих упражнений. И ещё не так стары, чтобы отгонять альцгеймера ребусами. - SciFi(03.03.2020 22:11)
- веселый spi! выкинул DMA, по флагам "ручками" гружу/выгружаю DR и опять смещение на один байт! Все нормально получается если перед первым байтом прочитать DR? почему с dma это не прокатывает хз(( - Aleksey_75(03.03.2020 22:00)
- Виноват, не дочитал. Всё-таки CCR_EN надо ждать (про это в доке не написано, это да). У меня так: SciFi(1033 знак., 03.03.2020 21:35)
- Вы о чем ?? "Почему в коде как бы сначала ждём окончания передачи, потом пытаемся что-то принять?" это почему поздно то ? в DR принятый байт и он будет там лежать пока мы не поместим туда данные для отправки! Короч! я не одинок! похоже глюк Aleksey_75(43 знак., 03.03.2020 21:30, ссылка)
- Вот мой код: evgeniy1294(1687 знак., 03.03.2020 21:15)
- В этих недоконтроллерах, в отличии от NXP, fifo табу ;) - Гудвин(03.03.2020 18:30)
- у какого STM32 нету? В STM32L476 есть Лагунов(03.03.2020 19:30 - 19:34)
- у spi нету fifo - Aleksey_75(03.03.2020 18:25)
- UPD! Если кто столкнется с подобной проблемой, мой костыль! Лишние байты летят только при делителях BR от 16 и больше, при меньших их нет! Чтоб не заморачиваться , просто перед каждой транзакцией по spi делаем reinit spi интерфейса и никаких левых данных! - Aleksey_75(06.03.2020 03:57)
- Пару лет назад озадачился переводом своей платы на стм32 и захотел DMA... POV_(1289 знак., 02.03.2020 20:52, )
- да взлетело оно сразу, единственное время от времени последний байт был прое) - Aleksey_75(02.03.2020 20:54)
- Совершенно естественный порядок вещей, если хоть немного задуматься, как эта штуковина работает. - SciFi(02.03.2020 18:18)
- ээээ! Вот вы злодей! Естественно, dma ужо пустой, а spi ищо шлеть ))) - Aleksey_75(02.03.2020 18:22)
- Нужно в прерывании DMA разрешить прерывание SPI TC. Либо программно разрулить - evgeniy1294(02.03.2020 20:05)
- в stm32 нету TC, есть только TE, поэтому пользую бусю ) - Aleksey_75(02.03.2020 20:08)
- Да, действительно. У меня конечный автомат не отпускает интерфейс, пока не увидит флаг busy. - evgeniy1294(03.03.2020 14:41)
- в stm32 нету TC, есть только TE, поэтому пользую бусю ) - Aleksey_75(02.03.2020 20:08)
- Нужно в прерывании DMA разрешить прерывание SPI TC. Либо программно разрулить - evgeniy1294(02.03.2020 20:05)
- ээээ! Вот вы злодей! Естественно, dma ужо пустой, а spi ищо шлеть ))) - Aleksey_75(02.03.2020 18:22)
- busy в одном из spi(не помню каком, вроде spi5) периодически лажал. передача закончилась, а он висит. в остальных spi такого не было. юзаю два потока dma(прием и передача). все передалось когда dma на прием сработало. если прием не нужен - Mikla(534 знак., 03.03.2020 18:46)