El bus SPI de 4 cables tiene una ventaja de velocidad considerable sobre I²C, pero desafortunadamente, por lo que sé, no tiene una forma estándar de realizar el handshaking sin usar cables adicionales más allá de los cuatro (y cuatro cables ya son lo suficientemente molestos). .
Para un proyecto reciente en el que el esclavo era un CPLD, implementé un enfoque agradable para proporcionar el protocolo de enlace en una dirección (el esclavo puede hacer la espera del maestro) y también eliminar la necesidad de la línea / FS. Las señales son Reloj, MOSI (master-out / slave-in) y MISO (master-in slave-out).
Reloj inactivo bajo; Las salidas MISO y MOSI en el flanco ascendente del Reloj y se muestrean en el flanco descendente. Dos o más flancos ascendentes consecutivos en el cable MOSI mientras el reloj está bajo restablecerán la comunicación.
Cuando el reloj está bajo y MOSI es alto, MISO indicará si el esclavo está listo. Cuando tanto el reloj como MOSI están bajos, MISO indicará si el esclavo quiere atención.
Si bien este enfoque funciona muy bien cuando se comunica entre mi CPLD y mi controlador, sería bueno si pudiera usarse el mismo enfoque cuando se comunica entre dos microcontroladores estándar. Las características más importantes que serían necesarias para que esto funcione bien serían:
- la capacidad del controlador esclavo reajustarse al recibir alguna número (probablemente 2 o 3) de aumento bordes en MOSI mientras el reloj está inactivo;
- la habilidad del esclavo para controlar el estado de inactividad del reloj de MISO, y preferiblemente cargar valores separados para utilizar cuando MOSI es alta o cuando está bajo;
- preferiblemente, la capacidad para el maestro para controlar el estado de MOSI que saldrá cuando el reloj está inactivo entre bytes (en mi protocolo, los comandos que necesitan apretón de manos tiene el conjunto de LSB, pero eso es un poco molesto);
- para los puertos SPI almacenados en búfer, la capacidad para que el maestro espere en el línea de datos del esclavo.
¿Hay algún controlador o dispositivo esclavo común que ofrezca tales funciones, o funcione de esa manera?