3 микроконтроллера Atmega 16 соеденяются между собой. Назовем условно - первый, второй и третий. Второй микроконтроллер собирает информацию и передает её для вывода 3 микроконтроллеру по SPI. "Командует парадом" первый микроконтроллер. Первый и второй микроконтроллер соеденены 4 проводами, второй микроконтроллер должен получать команду от первого диаграммой нулей и единиц. Пока первый и второй микроконтроллер между собой не соеденены (выставляя плюсы и минусы "перемычками") передача по SPI второго к третему идет нормально. Как только подключаю первый микроконтроллер данные от SPI непонятным образом искажаются. Пробовал соеденять первый и второй через оптроны и через механическое реле (чтобы понять причину), результат тот же. Не могу понять почему искажаются данные по SPI от второго к третему при подключении первого, хотя при подаче просто плюсов и минусов без первого микроконтроллера все работает нормально. Заранее спасибо за возможную помощь.
Может быть, потому что если первый МК командует парадом - он тогда master наверное, генерить clk, дергать CS и все такое - его прерогатива, а 2 и 3 это уже не смогут? Если 2 и 3 - slave, то напрямую они не смогут и придется сперва закинуть пакет в первого, при том по его инициативе. А тот перешлет правильному адресату, опять же по своей инициативе. Это если пользоваться spi в его первозданном виде.
Можно попробовать сделать некое подобие multimaster но spi изначально подразумевает 1 мастера на шине и это потребует неких нестандартных извращений.
Если spi 4 провода - проблема в том что TX и RX разнесены, master своим TX отправляет всем slave'ам данные на их RX, а они принимают. Ответ наоборот, TX slave'а отправляет данные на RX master'а. А вот если это будут 2 slave-а - у них соединены между собой TX и TX, RX и RX и они ничего передать не смогут. Если это 3-проводной SPI где TX и RX соединены - вот там можно попробовать. Тогда в холостом режиме шины все должны быть в slave, а когда кто-то хочет передать - становится master'ом, начинает генерить клок, а остальные принимают соответственно. При этом придется сделать какую-то адресацию.
...и на самом деле это несколько проще в I2C сделать, пожалуй.
