Перейти к содержанию

Как узнать режим SPI по даташиту?

Обновлено Редакция GAW

Режим SPI — это два бита: CPOL и CPHA. Их не нужно угадывать: они однозначно читаются с временной диаграммы в даташите ведомого устройства. Определения у всех производителей одинаковые — reference manual STM32 RM0008 и даташит ATmega328P описывают их одними словами.

РежимCPOLCPHASCK в покоеВыборка данных
000низкийпервый фронт — нарастающий
101низкийвторой фронт — спадающий
210высокийпервый фронт — спадающий
311высокийвторой фронт — нарастающий

Как читать диаграмму

  1. Найдите на диаграмме уровень SCK до опускания CS. Он и есть CPOL.
  2. Найдите фронт SCK, относительно которого заданы времена установки и удержания (setup/hold) входа ведомого, — на нём ведомый считывает бит.
  3. Если это первый фронт SCK после опускания CS — CPHA = 0, если второй — CPHA = 1.

Таблица выше — сводка табл. 19-2 даташита ATmega328P. Если на диаграмме выборка идёт по нарастающему фронту, подойдут режимы 0 или 3: разница только в уровне SCK в покое, и многие устройства принимают оба.

Пример: BME280

Bosch пишет в даташите BME280 прямо: SPI работает в режимах 00 и 11, и датчик сам выбирает режим по уровню SCK в момент опускания CSB. Там же есть подвох: после первого опускания CSB интерфейс I2C отключается до перезапуска питания.

Если режим выбран неверно, данные обычно сдвигаются на один бит или читаются одни 0xFF — разбор таких случаев в ответе «Почему SPI читает только 0xFF?». Подробно о битах — в термине «режимы SPI», диаграмму для своих настроек нарисует кадр SPI, а основы шины — на странице SPI.

Похожие вопросы

Что делать, если в даташите режим не указан?

Посмотреть диаграмму: если SCK до начала обмена нарисован внизу, CPOL = 0, вверху — CPOL = 1. Затем найти фронт, на котором данные на входе ведомого уже стабильны и отмечены моментом выборки: первый после опускания CS — CPHA = 0, второй — CPHA = 1.

Почему датчик работает и в режиме 0, и в режиме 3?

В обоих режимах данные читаются на нарастающем фронте SCK, отличается только уровень SCK в покое. Многие датчики, например BME280, принимают оба режима: он определяет режим по уровню SCK в момент опускания CSB.

Почему BME280 перестал отвечать по I2C после проверки SPI?

У BME280 интерфейс выбирается выводом CSB: после первого опускания CSB в ноль I2C отключается до следующего включения питания. Если CSB подключён к выводу микроконтроллера, он должен быть в единице уже при подаче питания.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — разд. 19.4, табл. 19-2 — режим 0: CPOL = 0, CPHA = 0, выборка на переднем (нарастающем) фронте; режим 1: CPOL = 0, CPHA = 1, выборка на заднем (спадающем); режим 2: CPOL = 1, CPHA = 0, выборка на переднем (спадающем); режим 3: CPOL = 1, CPHA = 1, выборка на заднем (нарастающем)
  2. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 25.3.1 — CPOL задаёт уровень SCK в покое (0 — низкий, 1 — высокий); при CPHA = 1 данные защёлкиваются на втором фронте SCK, при CPHA = 0 — на первом
  3. Bosch Sensortec. BME280 Combined humidity and pressure sensor: Data sheet (BST-BME280-DS001-24, revision 1.24, February 2024) — разд. 6 и 6.3 — SPI в режимах 00 (CPOL = CPHA = 0) и 11 (CPOL = CPHA = 1), режим выбирается автоматически по уровню SCK на спаде CSB; разд. 6.1 — после первого опускания CSB интерфейс I2C выключен до следующего включения питания

Нашли ошибку?