ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
18 февраля
1571319 Топик полностью
Eddy_Em (Сегодня, 09:21, просмотров: 32) ответил Eddy_Em на Плак-плак… Чего ж так мало памяти под USB btable в "младших" STM32F303?
В общем, вчера таки все интерфейсы заработали. Правда, одновременно все пока не тестировал - для этого нужно что-нибудь простенькое набросать (открыл два устройства и пиши туда-сюда, проверяя, что из другого приходит). 

Уже чуть ли не волосы на жопе рвал: 4 интерфейса работают, а пятый в blocking_handler уходит. Кинул дипсику, мол, где ошибка. Он и говорит, мол, в ДНК! Я rx и tx каналы DMA для этого интерфейса перепутал, соответственно, ловил несуществующее прерывание TC на rx, а вот на tx — нет. Понятно, что оно и уходило "в себя". И скорость поднять он мне посоветовал как: сделать циркулярный буфер (и объем побольше) на прием. Тогда не нужно во время обработки блокировать прием, соответственно, данные продолжают капать, пока ты часть из них передаешь.

Заодно закинул свой код для кольцевого буфера. Все ОК, говорит, кроме нескольких косяков. Прямо-таки грубых косяков не нашел, но по мелочи кое-что я подправил (где есть потенциальные проблемы). Правда, мы так с ним и не добились консенсуса насчет моего блокирующего флага (который, естественно, не атомарный): дипсик твердит, что херня, и могут быть гонки, а я утверждаю, что гонок быть не может. Потому как после выхода из прерывания, если в нем была работа с буфером, флаг занятости будет опущен. Соответственно, если в суперлупе мы прочитаем, что буфер свободен, а потом выстрелит прерывание, то ничего страшного не будет, когда мы по возврату из прерывания тоже выставим этот флаг.


Остается вроде за малым — CAN и SSI добавить, но, чует мое сердце, на какой-нибудь опять косяк нарвусь. Да и я сдуру развел плату так, что SSI повесил на SPI1, а не SPI3 (у которого как раз свободен DMA rx). В итоге нужно будет DMA с USART'ом делить. И придется в настройки добавить пунктик: кому по DMA, а кому — по прерываниям. В принципе, у SSI посылочки короткие, если не опрашивать энкодеры с килогерцовой частотой (как я на малых телескопах делаю), то по идее и на прерываниях пойдет.


P.S. Тестировал RS-485 на преобразователе на основе CH340, а он быстрей 2Мбод не умеет, надо будет с PL2303 попробовать.

P.P.S. Несмотря на то, что во время тестов 485 у меня 232 вообще не работал, стоящая там MAX3232 прилично раскалилась. Видимо, "паль" какая-то попалась.

eddy-em.livejournal.com github.com/eddyem