По сути, у меня есть два микроконтроллера, которые мне нужны для связи друг с другом.
Оба контроллера отправляют и получают данные.
Основная идея, которая у меня есть:
I2C, SPI - то, что я думаю, что мы не можем использовать эти протоколы в этом случае. Потому что оба являются протоколами на основе master-slave. Таким образом, если один контроллер настроен как ведущий, а другой как подчиненный, то в этом случае, если подчиненный UC хочет передать данные, он не может инициировать передачу, а также не может генерировать часы.
UART - я думаю, это должно работать, поскольку оно асинхронно. Так что никто не обязан быть рабом или господином.
Мой вопрос в том, верны ли сделанные выше предположения? Если нет , то поправьте меня.
Ваши предположения верны, да. SPI и I2C обычно являются ведущими/ведомыми протоколами, хотя есть способы «согнуть» их, чтобы они могли работать в любом случае.
Но для простоты да, UART наверное самый простой и толковый.
Если это для вашей собственной настройки, то единственное, что имеет значение, это согласованность. Вы контролируете все, так что это зависит от вас. Вы можете использовать стандартный протокол, создать свой собственный или изменить его в соответствии с вашими потребностями . Если у вас уже есть такая шина, как I2C или SPI, вы можете продолжать ее использовать.
Тем не менее, хотя I2C и SPI являются протоколами master-slave, это можно легко обойти с помощью вывода прерывания/сигнала. Если ведомое устройство хочет поговорить с ведущим, оно переключает вывод прерывания, и ведущее устройство инициирует сеанс I2C/SPI. Или опрос.
Что касается генерации часов, если у вас нет особой потребности в том, чтобы оба микроконтроллера делали это, зачем беспокоиться? Вам нужно запустить один на другой скорости? Заранее выберите тактовую частоту и придерживайтесь ее в своей реализации.
Устройства на шине I²C не имеют предопределенных ролей ведущего и ведомого: устройство является ведущим, если оно в настоящее время контролирует транзакцию с ведомым или активно пытается это сделать. Устройство является ведомым, если оно имеет адрес ведомого и либо обменивается данными с ведущим устройством, либо прослушивает ведущие устройства. Другие устройства на шине просто неактивны.
I²C поддерживает несколько ведущих и несколько ведомых устройств. Если у вас есть несколько устройств, которые должны иметь возможность отправлять или получать данные по желанию, вы назначаете подчиненный адрес каждому из них и программируете их на роль ведущего, когда им нужно передавать или запрашивать данные.
Если присутствует несколько мастеров, мастера меняются: Перед началом транзакции мастера ждут завершения текущей транзакции, если таковая имеется. Если несколько мастеров начинают транзакцию одновременно, первый из них заметит, что шина не находится в том состоянии, в котором он хочет отступить (это называется арбитражем).
Короче говоря, то, что вы хотите, определенно возможно с I²C. Тем не менее, реализация I²C немного утомительна и, вероятно, излишняя для всего двух микроконтроллеров, пытающихся общаться друг с другом. Я бы выбрал UART в вашем случае, благодаря его простоте и гибкости.
КиранФ