¿Se pueden implementar SPI e I2C usando pines GPIO?

¿ Se pueden implementar SPI e I2C usando pines GPIO digitales ? Es decir, ¿se pueden emular los pines SDAy SCKde I2C y los pines MISO, MOSI, SCKy SSde SPI configurando los pines GPIO como entrada y salida en consecuencia?

Por ejemplo, en el caso de un Arduino/Atmega328p, se han dedicado ciertos pines para uso de SPI e I2C. ¿Pueden los otros pines GPIO digitales realizar la misma función? 1 ¿Hay algo fundamentalmente diferente en su comportamiento? ¿Quizás un registro interno o algo para recopilar los datos seriales entrantes?

ingrese la descripción de la imagen aquí

En el diagrama, se puede ver que los pines SPI se comparten con los pines GPIO digitales. Dentro de la matriz Atmega328p, ¿los dos elementos/submódulos distintos con algo así como un búfer determinan cuál impulsará el pin? O son la misma cosa...

1 Para la SCKemulación, suponga que de alguna manera puede pasar el pulso del reloj a un pin GPIO configurado en modo de salida.

Nota: El Arduino es solo un ejemplo. Estoy preguntando en un sentido general.

Muchas veces he tenido que implementar SPI e I2C en el software (obviamente, el hardware también tiene que ser compatible) en MCU que no incluían un periférico SPI o un periférico I2C. (Una MCU de 30 centavos es más barata que una MCU de $5, entonces, ¿qué más puede hacer en esos casos?) Pero si ya tiene un periférico SPI/I2C en su MCU (o más), probablemente debería asignar el uso de pines en consecuencia. Algunas MCU incluyen barras cruzadas para que pueda asignar casi cualquier función periférica a casi cualquier pin de E/S. Pero ese no es el caso común. Por lo tanto, es posible que se quede atascado con las tareas. Pero sí, el software puede hacerlo lentamente.

Respuestas (3)

A veces, puede modificar estas interfaces, pero requerirá más recursos y es posible que no funcione en todos los casos. Por ejemplo, el maestro SPI puede ser fácilmente golpeado por bits, pero el esclavo SPI a 10MHz es probablemente imposible en un micro lento, e incluso a velocidades mucho más bajas, es probable que tenga que bloquear las interrupciones.

Los pines especificados están conectados a un hardware dedicado en el interior, lo que lo hace más fácil de usar y, en general, funcionará mejor, más rápido y utilizará menos recursos. Por ejemplo, puede estar haciendo otra cosa mientras el bus está enviando o recibiendo datos.

Lea la hoja de datos de MCU para ver qué pines se usan y si hay alternativas disponibles.

Sí, estos protocolos se pueden modificar con bits, con dos advertencias: 1) I2C (o protocolos de "dos hilos" similares) tiene que usar pines GPIO de drenaje abierto para admitir la expansión del reloj, ACK y detectar otros conflictos que el protocolo está diseñado alrededor. I2C también 2) Su MCU debe funcionar lo suficientemente rápido como para soportar las velocidades. Como menciona Sphero, un maestro SPI se realiza fácilmente en software ("bit banged"); como el micro tiene el control total del cronometraje, marca el ritmo de todas las transacciones. Bit-bang a un esclavo significa que el software debe estar listo a tiempo para el reloj entrante. Para implementar completamente I2C, el maestro también necesita monitorear la línea SCL por períodos de tiempo variables para permitir que el esclavo reconozca las transacciones.

Sí, no hay problema.

No ocupa mucho espacio de código.

Dado que a menudo usa I2C de forma bloqueada, es decir, está esperando que el byte termine de todos modos, en realidad no hay sobrecarga de tiempo.

Atmel ha tenido un hardware I2C verdaderamente abismal, y de todos modos ha sido necesario atacar bits para que funcione correctamente.

También puede compartir pines, por lo que varios buses pueden tener un pin SCL compartido y SDA separados

Lo que es muy difícil de hacer es crear un esclavo I2C de propósito general en el software. Esto requiere hardware.

Los pines I2C dedicados a menudo tienen un umbral de entrada diferente para coincidir con el estándar I2c. Debe considerar el tipo de entrada (TTL vs CMOS vs Schmitt) para su trabajo. Para un bus largo, fuera de la placa, los pines dedicados con niveles de schmitt I2C pueden brindar una mejor inmunidad al ruido.

SPI generalmente se ejecuta más rápido y es probable que el ataque de bits sea más lento. Además, la operación del hardware de los chips es simple, limpia y funciona correctamente: no tiene que trabajar con errores o una lógica mal pensada (a diferencia del hardware I2C). Pero si necesita más pines SPI, entonces el ataque de bits está bien. (Usar un interruptor analógico barato para multiplexar el pin también es una opción)