I2C и SPI одновременно?

Я хотел бы задать вопрос, касающийся следующей настройки связи:

STM32 – Arduino Pro Mini – датчик ADNS3080

Интерфейс между STM32 — Arduino — I2C, а интерфейс между Arduino Pro Mini — ADNS3080 — SPI.

Я протестировал связь между STM32 и Arduino Pro Mini, а также между Arduino Pro Mini и датчиком ADNS3080. Оба они работают нормально; Я могу успешно отправлять и получать данные в обоих случаях.

Теперь я хочу прочитать регистр датчика ADNS3080 с помощью STM32. Сначала я запускаю связь I2C между STM32 и Arduino Pro Mini, затем отправляю адрес регистра ADNS3080 в Arduino Pro Mini. Arduino Pro Mini считывает адрес регистра и в той же функции начинает связь, используя SPI, с датчиком ADNS3080.

Но я получаю ошибки I2C в STM32. Можно ли использовать I2C и SPI одновременно? Нужно ли вводить задержки между командами I2C и SPI?

С уважением, Али

, 👍3

Обсуждение

Я чувствую, что их прерывания будут сталкиваться друг с другом., @Bort

Они находятся на разных автобусах, так что да, вы можете сделать и то, и другое в одной программе. Однако, если один из них запускается прерыванием другого и сам полагается на прерывания, то здесь может возникнуть проблема. У вас должно быть одно прерывание, сообщающее вашей основной программе, что пришло время выполнить вторую операцию, а не запускать ее непосредственно из прерывания., @Majenko

Ожидаете ли вы, что Arduino сможет выполнить транзакцию SPI и вернуть данные в STM32 *в той же транзакции I2C?* Это вряд ли сработает. Вам понадобится какой-то механизм управления потоком или механизм установления связи, который сообщит STM32, когда данные действительно доступны. Это может быть что угодно: от растяжения тактовой частоты до разделения ее на несколько циклов I2C, в которых STM32 опрашивает Arduino на предмет статуса., @Dave Tweed

Вы получите лучшие ответы, если опубликуете свой код. Вы спрашиваете об ошибках в неопубликованном коде без схемы. Таким образом, любые ответы носят общий характер и в основном являются догадками., @Nick Gammon

*Мне кажется, что их прерывания будут натыкаться друг на друга* - на самом деле прерывания не «натыкаются друг на друга». Они выполняются в приоритетном порядке упорядоченным образом., @Nick Gammon

Я хотел бы сообщить вам всем, что несколько дней назад мне удалось решить свою проблему, следуя советам @Majенко. Спасибо всем за помощь., @user3752073


2 ответа


2

Вашему коду Arduino, вероятно, необходимо реализовать растяжение тактовой частоты в качестве подчиненного устройства i2c. Это говорит ведущему немного расслабиться, пока ведомый выполняет некоторую работу, чтобы получить ответ.

,

6

Можно ли использовать I2C и SPI одновременно?

Да, это так. Оба реализованы аппаратно в чипе. Они могут работать «в фоновом режиме» и вызывать прерывание, когда нужно что-то сделать.

Нужно ли вводить задержки между командами I2C и SPI?

Нет.

,