-
- Решилось так: сбросил тактовую HCLK (и процессора) с 110.592МГц (была выбрана для UART и прямой работы с флеш) до 77.4144МГц. Зато получил тактовую модуля SPI 19.3536МГц и идеальное удержание последнего бита в 52нс - один такт этой тактовой. Заодно повысил скорость SPI на целых 40%, до этого она не попадала в ограничения с делителями шин 2^N. Увеличение скорости SPI, вобщем, штука позитивная для проекта. Позволит реализовать дополнительный опрос и, тем самым, сократить время Nikolay_Po(28 знак., 29.04.2025 12:33)
- В общем, это именно косяк модуля SPI. Сделал передачу на
прерываниях. И вот что (сиреневым к нулю - время нахождения в
прерывании TXE - буфер передачи пуст): Nikolay_Po(394 знак., 28.04.2025 17:25, картинка, картинка)
- В 16 бит режиме та же ситуация. С CPHA=1, недодерживается последний бит каждого 16бит-слова. Nikolay_Po(1 знак., 28.04.2025 18:02, картинка)
- Бедный, бедный SPI на СТМ-подобных контроллерах. Как можно было
сделать такое уродство, ХЗ... - mse homjak(28.04.2025 14:19)
- Поделитесь опытом, какой SPI лучше, в плане организации - модуля,
регистров, буферов, взаимодействия с DMA, размеров транзакций?
Понятно, что STM-like SPI простоват хотя бы тем, что не имеет
собственного FIFO. Но вкупе с DMA, позволяет гнать поток на своей
максимальной скорости. - Nikolay_Po(28.04.2025 14:30)
- Не, у меня в системах стоит ФПГА и я все скоростные интерфейсы ваяю на ней. А так, у меня ни с АВР, ни с ДСПИК и ПИК32 проблем не было. Натыкал в регистры и оно поехало. Про то, что можно изговнять СПИ, я узнал тока, когда пересел на CH32V*** и выяснил, что для программной совместимости, китайцы старательно перенесли все косяки из СТМ в свои клоны.. - mse homjak(28.04.2025 17:06)
- У некоторых дспиков (33ЕП) идеальный на мой вкус СПИ. Очень длинный ФИФО - Можно не грузить ДМА. Ну и прозрачная настройка всего. - Kpoк(28.04.2025 14:41)
- Поделитесь опытом, какой SPI лучше, в плане организации - модуля,
регистров, буферов, взаимодействия с DMA, размеров транзакций?
Понятно, что STM-like SPI простоват хотя бы тем, что не имеет
собственного FIFO. Но вкупе с DMA, позволяет гнать поток на своей
максимальной скорости. - Nikolay_Po(28.04.2025 14:30)
- А если фазу инвертировать - выдавать новый бит по спаду, а
защёлкивать его (клок) по положительному фронту? Картина изменится?
Может, в связке с DMA проблема (попробовать выдачу 0х55 в цикле, из
регистра, просто по опросу)? А то попахивает жирной эратой. :( - vpv.vpv(28.04.2025 09:28)
- Если фазу ставить по первому перепаду, CPHA=0, то всё отлично - чистенький меандр. - Nikolay_Po(28.04.2025 09:31)
- Ну да, похоже на косяк в конце байта. Возможно, что на более
высоком разрешении по времени там видна задержка на 1 такт МК(или
такт для модуля SPI) - т.е. десятки наносекунд. Если так, то в
принципе можно смириться, надо только смотреть в даташитах на
периферию, чтобы Data hold time была не более. Что у тебя там
подцеплено на SPI? Работает? - il-2(28.04.2025 06:26)
- Шансов для устройства, тактируемого по второму перепаду, мало.
Данные изменяются на 9нс
раньшепосле того, как происходит нештатный, преждевременный тактовый перепад. Вместо требуемых в моём случае 50нс, удержание данных сохраняется лишь 9нс. Это нехорошо. Nikolay_Po(127 знак., 28.04.2025 11:56, картинка)- Ты ниже написал - что тактовая МК 110МГц - т.е. период как раз 9нс.
Можно попробовать посмотреть - изменится ли эта задержка от смены
тактовой МК. Посмотреть - от какой частоты зависит - от AHB или
APB. Если от APB - то можно в принципе снизить ее до 20-30МГц и
таким образом сделать эту задержку более "приличной" - 30-50нс. Так
глядишь - и победить это горе через задний проход :-) - il-2(28.04.2025 18:13)
- Хмм... Спасибо! Гениально! Я сам не догадался. Сейчас проработаю
этот вариант. У меня на этой же шине уже разведённый UART работает.
Но я предусмотрительно сделал тактовую и кварц кратным UART. Должно
сложиться. Мне нужно удержание данных 50нс. Это значит, что
тактовую нужно понизить не выше чем до 1/50нс=20МГц. Системная
частота у меня сейчас 110.592МГц. Значит, нужен делитель не менее
5.5296
МГц. В наличии делители 2, 4, 8 и 16. Беру 8. Nikolay_Po(476 знак., 28.04.2025 22:31)- Сработало! После изменения делителя PPRE2 в регистре CFGR0 модуля
тактирования RCC, частота второй периферийной шины (PB2) поделилась
на 8, стала 13.824МГц. USART-делители пересчитались автоматически,
связь по RS-485 с устройством не нарушилась. Кадровый таймер
интерфейса связи не пострадал - оказался на первой периферийной
шине (впрочем, и он пересчитывается автоматически - стоит лишь
делитель верно задать). Nikolay_Po(435 знак., 28.04.2025 22:46, картинка, картинка)
- Погонял малость. По устранял ошибки. Типа, в режиме только передачи, когда входящие с SPI не нужны, не включал DMA на приём. А в SPI ошибка OVR и её выявлял обработчик состояния SPI. Так же нужно было не забыть добавить очистку лишнего байта в буфере приёма и сброса ошибки последовательным чтением сначала регистра данных, потом статуса. Nikolay_Po(522 знак., 29.04.2025 01:37)
- Если переходить на программный, тогда зачем ДМА? В обычном режиме
оно работает нормально. Ну как, "нормально"... Работает. А я, в
ряде случаев, делаю программный интерфейс для РС232, СПИ, через
ДМА, чтобы не отвлекаться, в процэссе передачи. Формирую в ОЗУ
последовательность установок-сбросов бит порта и травлю на него
ДМА. Много ОЗУ идёт в расход, но щас этого ОЗУ, как у дурака
фантиков. Скорости можно добиться высокой. - mse homjak(28.04.2025 23:17)
- Эта схема понятна. Но вы видели самое первое сообщение? И диаграмму
в нём? У меня не UART. И этим же, дефектным, модулем SPI, подобная
эмуляция нужного, верного сигнала невозможна - просто не хватит
сигнальных линий или будет невозможной своевременная выборка по
приёму. - Nikolay_Po(29.04.2025 01:42)
- Ну это как вариант предложил. Если, например, нужно чота быстро загрузить в ЦАП, по таймеру и чтобы с NSS и минимальным жыттером. А СПИ от СТМ. Он, кстати, когда шлёт 16 бит, все флаги готовности, подымает на 8 бите. В общем, апофигей. У кого они это говно купили? Или сами сделали? - mse homjak(29.04.2025 11:18)
- Эта схема понятна. Но вы видели самое первое сообщение? И диаграмму
в нём? У меня не UART. И этим же, дефектным, модулем SPI, подобная
эмуляция нужного, верного сигнала невозможна - просто не хватит
сигнальных линий или будет невозможной своевременная выборка по
приёму. - Nikolay_Po(29.04.2025 01:42)
- Сработало! После изменения делителя PPRE2 в регистре CFGR0 модуля
тактирования RCC, частота второй периферийной шины (PB2) поделилась
на 8, стала 13.824МГц. USART-делители пересчитались автоматически,
связь по RS-485 с устройством не нарушилась. Кадровый таймер
интерфейса связи не пострадал - оказался на первой периферийной
шине (впрочем, и он пересчитывается автоматически - стоит лишь
делитель верно задать). Nikolay_Po(435 знак., 28.04.2025 22:46, картинка, картинка)
- Хмм... Спасибо! Гениально! Я сам не догадался. Сейчас проработаю
этот вариант. У меня на этой же шине уже разведённый UART работает.
Но я предусмотрительно сделал тактовую и кварц кратным UART. Должно
сложиться. Мне нужно удержание данных 50нс. Это значит, что
тактовую нужно понизить не выше чем до 1/50нс=20МГц. Системная
частота у меня сейчас 110.592МГц. Значит, нужен делитель не менее
5.5296
- Ты ниже написал - что тактовая МК 110МГц - т.е. период как раз 9нс.
Можно попробовать посмотреть - изменится ли эта задержка от смены
тактовой МК. Посмотреть - от какой частоты зависит - от AHB или
APB. Если от APB - то можно в принципе снизить ее до 20-30МГц и
таким образом сделать эту задержку более "приличной" - 30-50нс. Так
глядишь - и победить это горе через задний проход :-) - il-2(28.04.2025 18:13)
- Периферия у меня старый АЦП, у него 50нс требуется удерживать
данные с момента перехода сигнала тактирования. - Nikolay_Po(28.04.2025 09:34)
- Должно всё выдерживаться. Я всегда использовал режимы "0" и "1" в SPI, т.е. данные сразу на шине (CPHA=0), а после клок (защёлка) или положительный или отрицательный. Пин /SS настроен правильно? - vpv.vpv(28.04.2025 09:48)
- Я так думаю, что задержки SPI должны быть равны половине периода
клока. Для этого частота SPI и выбирается (1/2, 1/8, ... 1/64...).
Тут что-то другое. - vpv.vpv(28.04.2025 09:34)
- У меня тактовая 110МГц, делитель 128. А тактов за 5..10, по первому
фронту, DMA успевает загрузить следующий символ. Вроде как фазу
тактового сигнала на выходе (и на входе?) поменяли, а момент
загрузки нового символа остался по первому фронту. - Nikolay_Po(28.04.2025 09:41)
- А каких-нибудь коллизий с флагом "SPI_ENABLE" (или как там его, готовность передачи следующего символа) - нет? Надо аппаратную часть CH32V смотреть, как там буферизация устроена. - vpv.vpv(28.04.2025 09:53)
- У меня тактовая 110МГц, делитель 128. А тактов за 5..10, по первому
фронту, DMA успевает загрузить следующий символ. Вроде как фазу
тактового сигнала на выходе (и на входе?) поменяли, а момент
загрузки нового символа остался по первому фронту. - Nikolay_Po(28.04.2025 09:41)
- Шансов для устройства, тактируемого по второму перепаду, мало.
Данные изменяются на 9нс