CS это простой GPIO, нет необходимости их выделять в командах SPI. SPI обмен преобразовать в I2C-подобный достаточно просто, достаточно писать рез-т обмена в буфер.
Вообще самый простой протокол:
< S 20 01 S 21 01 P > 70 < S 60 FF 01 02 03 S 61 03 P > 01 02 03
А может все-таки признать, что внутренние устройства МК, устройства поключенные к SPI и I2C-устройства - разные вещи, управляются по-разному, и не стоит все их пихать в одну кучу?
Пока такой команды нет, но добавить не сложно. Выбор канала тоже можно сделать, там сейчас заглушки вместо реальной работы с I2C, чтоб отлаживать на пк.
Добавлено спустя 5 минут 50 секунд: Я только сомневаюсь в выводе i2c запростов. сейчас используется вариант из userial (только без I в начале) но из него нельзя определить какая операция проводилась (чтение/запись) Думаю заменить Ack адреса на R/W в ответе.
А интерфейс программный пока не прописывал которому должен удовлетворять как модуль работы с реальным i2c из под этого протокола, так и модуль контроллера? Чтобы удовлетворяющий этому интерфейсу программный функционал можно было быстро и просто скомпилировать как в i2c-SLAVE-контроллер, так и в Шлюз-контроллер.
Этот модуль реализует только шлюз usart-to-i2c. Обработка локальных запросов — задача другого модуля, и поскольку вызов его аналогичен запросу и2с то и изменять для слейва не потребуется.
Если я всё правильно понял, то там нечестный КА - например если читаем "С", то не выходим из обработки пока не получим еще 2 символа - так? А это завешивает основную программу или нет?