• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

r44083

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
 
Последнее редактирование:

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

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

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