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?
С уважением, Али
@user3752073, 👍3
Обсуждение2 ответа
Вашему коду Arduino, вероятно, необходимо реализовать растяжение тактовой частоты в качестве подчиненного устройства i2c. Это говорит ведущему немного расслабиться, пока ведомый выполняет некоторую работу, чтобы получить ответ.
Можно ли использовать I2C и SPI одновременно?
Да, это так. Оба реализованы аппаратно в чипе. Они могут работать «в фоновом режиме» и вызывать прерывание, когда нужно что-то сделать.
Нужно ли вводить задержки между командами I2C и SPI?
Нет.
- OVF в последовательном мониторе вместо данных
- Путаница между SPI и I2C для SSD1306 OLED
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Последовательная связь между несколькими устройствами (или ардуино)
- MPU-9250 IMU на SPI, внешнем датчике или магнитометре с использованием мастера I2C
- Сбой при записи данных MPU-6050 на SD-карту
- Хорошие способы подключения нескольких шин I2C?
- Arduino UNO несовместимо с чтением регистра I2C из ArduCam
Я чувствую, что их прерывания будут сталкиваться друг с другом., @Bort
Они находятся на разных автобусах, так что да, вы можете сделать и то, и другое в одной программе. Однако, если один из них запускается прерыванием другого и сам полагается на прерывания, то здесь может возникнуть проблема. У вас должно быть одно прерывание, сообщающее вашей основной программе, что пришло время выполнить вторую операцию, а не запускать ее непосредственно из прерывания., @Majenko
Ожидаете ли вы, что Arduino сможет выполнить транзакцию SPI и вернуть данные в STM32 *в той же транзакции I2C?* Это вряд ли сработает. Вам понадобится какой-то механизм управления потоком или механизм установления связи, который сообщит STM32, когда данные действительно доступны. Это может быть что угодно: от растяжения тактовой частоты до разделения ее на несколько циклов I2C, в которых STM32 опрашивает Arduino на предмет статуса., @Dave Tweed
Вы получите лучшие ответы, если опубликуете свой код. Вы спрашиваете об ошибках в неопубликованном коде без схемы. Таким образом, любые ответы носят общий характер и в основном являются догадками., @Nick Gammon
*Мне кажется, что их прерывания будут натыкаться друг на друга* - на самом деле прерывания не «натыкаются друг на друга». Они выполняются в приоритетном порядке упорядоченным образом., @Nick Gammon
Я хотел бы сообщить вам всем, что несколько дней назад мне удалось решить свою проблему, следуя советам @Majенко. Спасибо всем за помощь., @user3752073