Нужна помощь Задержки в SPI при передачe буфера

r44083

New member
Здравствуйте,
Делал свой hal для SPI и столкнулся с такой проблемой:
при передачи буфера данных на прерываниях, возникают паузы в обмене данными после окончания передачи буфера (W[0..15]) и новым стартом передачи его.
Минимум до чего мне удалось сократить эти задержки это 3 us (ставил CTRL1 в 0, увеличил частоту CPU до 160 МГц). Но эти паузы в обмене данными всё равно есть.



Даже если использовать весь буфер (W[0..15]), то паузы будут между его обновлением. И 3 us это явно очень долго и дело тут не в обработчике прерывания.
На форуме находил подобную тему, но у меня так не получилось сократить их до сколь угодно нормального значения.
Есть идеи?
 

pvvx

Активный участник сообщества
Не очень ясно, что и где с паузой в 3 us.
При перезарядке буфера вам надо записать 16 регистров и все управляющие контроллеру. Это идет через шину CPU в 26 МГц, при этом 16 записей уже занимает 16/26 = 0.615385 us
SPI
 
Последнее редактирование:

r44083

New member
Странно что у меня эта перезарядка занимает не 0,6 us, а 3 us.
 

pvvx

Активный участник сообщества
Странно что у меня эта перезарядка занимает не 0,6 us, а 3 us.
Ещё раз - ТОЛЬКО запись 16 регистров 0.6 us.
У вас то наверно там более 40 обращений к медленной шине периферии между прерываниями + сохранение регистров и т.д...
О том, что лишнего кода очень много говорит то, что повысив частоту CPU у вас уменьшилась пауза и сильно.
При работе с регистрами через тормоз-шину в ESP изменение частоты CPU особо не влияет на скорость, т.к. его шина к периферии работает всё равно на той-же частоте и между обращениями к ней он всегда успевает считать из RAM или выполнить какие команды из IRAM, пока FIFO шины загружено.
Пишите оптимальнее - получите свои 1..1.5 us
А если нужно непрерывная работа по SPI или ещё какому интерфейсу на больших скоростях, то возьмите другой SoC, который имеет DMA. Тот-же RTL871x всё это делает "из коробки".
 

r44083

New member
Понятно, благодарю за пояснение.

Тут остался ещё один последний вопрос связанный с SPI:
настроил SPI на ESP в режиме Slave, но он работает только если мастер в начале передаёт "MASTER_WRITE_DATA_TO_SLAVE_CMD" (2) или "MASTER_READ_DATA_FROM_SLAVE_CMD" (3) команды.
Можно ли как-то сделать что бы ESP работала в режиме слейва без необходимости использования данных команд от мастера?
 

pvvx

Активный участник сообщества
Тут остался ещё один последний вопрос связанный с SPI:
настроил SPI на ESP в режиме Slave, но он работает только если мастер в начале передаёт "MASTER_WRITE_DATA_TO_SLAVE_CMD" (2) или "MASTER_READ_DATA_FROM_SLAVE_CMD" (3) команды.
Можно ли как-то сделать что бы ESP работала в режиме слейва без необходимости использования данных команд от мастера?
Это наверно разговор о автоматическом режиме с псевдо DMA? Я его не изучал - документации = нуль, примеров - всего один, но это уже работает аппаратный блок, по аналогии автоматического чтения flash, но наоборот - контролер прикидывается flash...
 

r44083

New member
Это наверно разговор о автоматическом режиме с псевдо DMA? Я его не изучал - документации = нуль, примеров - всего один, но это уже работает аппаратный блок, по аналогии автоматического чтения flash, но наоборот - контролер прикидывается flash...
Я имею ввиду обычный классический SPI slave, без всяких там команд. Самое интересное что в режиме слейва, даже без отправки мастером этих команд, само прерывание с флагом "SPI_SLAVE_TRANS_DONE" и "SPI_SLAVE_RD_BUF_DONE" возникает, но не удаётся вычитать буфер W[0..15].
 
Сверху Снизу