У меня есть 2 MCU, и я хочу соединить их вместе по шине I2C. MCU1 будет контроллером, а MCU2 будет целью. Только эти 2 MCU находятся на шине. Эта конфигурация фиксирована, и я не могу ее изменить.
Есть 2 сценария. В первом сценарии к шине подключены только MCU1 и MCU2, а во втором сценарии к этой общей шине также подключены некоторые дополнительные устройства I2C.
Моя основная цель подключить их, как указано выше, — отправить данные с MCU2 (цель) на MCU1 (контроллер).
Насколько я понимаю I2C, это протокол команд-ответов. Контроллер дает команды таргетам, а затем таргеты отвечают на эту команду и отправляют свои данные в контроллер. Цели не могут отправлять свои данные самостоятельно, не получив предварительно команду.
Если контроллер хочет получить 32 байта данных от цели, то какую команду он отправит цели, и как цель будет утверждать, что она получила действительную команду для отправки данных? Я думаю, что это называется передачей данных в «блочном режиме».
Мой целевой адрес зафиксирован как 0x08.
К счастью или к сожалению, вы должны придумать протокол для этого сценария, поскольку вы контролируете обе стороны. Как вы говорите, ведомое устройство может отвечать только на передачи, инициированные ведущим. Затем вашему ведущему необходимо опросить подчиненное устройство (запросить данные по повторяющемуся расписанию), если у вас нет другого способа для подчиненного устройства связаться, когда данные будут готовы. (Последнее обычно решается с помощью отдельной линии прерывания.) Ведущий и ведомый должны оба согласовать специальный ответ, когда ведомый еще не имеет доступных данных. Ведомому также необходимо сбросить свой ответ на это значение «нет данных» после запроса ведущим, чтобы избежать повторной отправки одних и тех же данных.
Проще всего было бы поменяться ролями ведущего и ведомого, чтобы именно ведущее устройство инициировало отправку данных ведомому устройству.
Если вам также необходимо обмениваться данными с другими ведомыми устройствами на той же шине I2C, вы, тем не менее, будете ограничены в том, какое устройство может быть ведущим, если только вы не используете режим нескольких ведущих устройств I2C.
Требуемые конкретные вызовы API I2C зависят от того, какое устройство и HAL вы используете. На физическом уровне это будет «чтение I2C», инициированное мастером, когда мастер считывает 32 байта после отправки адреса ведомого.
Фоксрайдер83
альтернативная роза