Акселерометр BMA180. Как удается разделить контакты между I2C и SPI?

11

Акселерометр BMA180 может быть ведомым SPI или ведомым I 2 C. Контакты для обоих автобусов являются общими.

SPI mode                    I2C mode
---------------------------------------------------
SDI  input                  SDA  bidirectional (!)
SDO  output                 ADDR address bit, input
SCLK input                  SCL  input
CSB  chip select, input     I2C  mode select, input

Согласно спецификации (см. Главу 8) , выбор между шинами осуществляется через контакт CSB. Когда уровень CSB низкий, устройство является ведомым SPI. Когда CSB высокий, устройство является ведомым I 2 C.

Вот режим сбоя , который меня беспокоит. Предположим, что BMA180 находится на шине SPI. На той же шине есть еще одно устройство с собственным чипом выбора. Предположим, мастер шины SPI связывается с этим другим устройством. CSB для BMA180 высокий, поэтому его I 2 C должен быть включен. BMA180 видит тактовые частоты на SCL (SPI's SCLK) и биты на SDA (SPI's MOSI), пролетающие мимо. Что если некоторые из этих битов выглядят для BMA180 как начало действительной транзакции чтения I 2 C, а BMA180 начинает выводить данные и забивает существующую транзакцию SPI? Как бы дизайн BMA180 предотвратить это?

Это вопрос любопытства. Я еще не экспериментировал с этими проблемами. Я буду использовать BMA180 на SPI.

Любое предложение, понимание или ссылка действительно приветствуются!

Обновить. Нашел что-то в таблице (см. 7.7.11) . Рекомендуется отключить I 2 C путем установки dis_i2cбита, если связь с BMA180 осуществляется через SPI.

Когда используется интерфейс SPI, настоятельно рекомендуется установить dis_i2c в 1, чтобы избежать сбоя.

BMA180 имеет встроенную EEPROM. Содержимое регистра может быть сохранено в EEPROM и автоматически загружено при включении питания. Таким образом, можно заставить BMA180 полностью и всегда игнорировать I 2 C.

Обновить. Гироскоп L3GD20 - это еще одна микросхема, которая аналогичным образом разделяет контакты между I 2 C и SPI. Кажется, он не имеет настройки для отключения режима I 2 C. Таким образом, для этого потребуются вентили ИЛИ, такие как ADXL345, которые вывел @markrages.

Берегись! Bosch прекратил отправку BMA180 ( официальное письмо здесь ).

Ник Алексеев
источник

Ответы:

14

Я видел именно то поведение, которого вы боитесь на ADXL345, который использует ту же схему выбора I2C / SPI. У меня было другое SPI-устройство, которое использовало другую полярность часов, и оно имитировало стартовый код I2C, ADXL345 пытался говорить по очереди как I2C. Плохие новости.

Я аккуратно переписал SPI как битовый удар вместо использования периферийного устройства, стараясь не менять линию MOSI, пока тактовая частота была высокой. (Это начальное условие I2C.) Это, казалось, решало проблемы.

Если бы я начинал с нуля, я бы попытался использовать шину I2C или выделенный порт SPI для ADXL345.

Видимо, я не единственный, кто столкнулся с этим. Этот абзац появился в более поздней редакции таблицы данных ADXL345:

введите описание изображения здесь

markrages
источник
+1 и спасибо! Только что обнаружил в спецификации, что BMA180 имеет бит отключения I2C (см. 7.7.11). Вполне возможно, что BMA180 также имеет встроенный логический элемент ИЛИ, и он просто не упоминается в таблице данных в явном виде.
Ник Алексеев
1
Шлюз OR эффективно отключает режим I2C, поэтому он не встроен в чип. (Если бы разработчик чипа смог сэкономить лишнюю булавку, ситуацию можно было бы полностью избежать.)
markrages
Я не должен был писать "слишком" в предыдущем посте. Под «слишком» подразумевается «в дополнение к биту отключения I2C». Я также был неправ, что в этой схеме шлюз ИЛИ может быть постоянно встроен в ИС акселерометра. Это отключило бы I2C навсегда. Я перепишу этот предыдущий комментарий.
Ник Алексеев
BMA180 имеет 3x DNC / зарезервированные контакты. Может быть, они уже используются в заводских целях.
Ник Алексеев
1
Я заметил, что цифровые акселерометры, как правило, совместимы по выводам друг с другом. Это может объяснить неиспользованные контакты. Или заводской тест, как вы сказали.
markrages