¿Se puede implementar SPI e I2C utilizando pines GPIO?

0

¿Se pueden implementar SPI e I2C utilizando pines GPIO digitales ? Es decir. ¿se pueden emular los pines SDA y SCK de I2C y los pines MISO , MOSI , SCK y SS de SPI al configurar los pines GPIO como entrada y salida en consecuencia?

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

En el diagrama, se puede ver que los pines SPI se comparten con pines GPIO digitales. Dentro de la matriz Atmega328p, ¿hay dos elementos / submódulos distintos con algo parecido a un búfer que determina qué impulsará el pin? ¿O son lo mismo ...

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

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

    
pregunta Jet Blue

3 respuestas

4

A veces, puede golpear estas interfaces pero esto requerirá más recursos y es posible que no funcione en todos los casos. Por ejemplo, el maestro SPI puede ser fácilmente modificado 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 al hardware dedicado en su interior, lo que facilita su uso y, en general, funcionará mejor, más rápido y utilizará menos recursos. Por ejemplo, puede estar fuera 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.

    
respondido por el Spehro Pefhany
2

Sí, estos protocolos pueden ser modificados, con dos advertencias: 1) I2C (o protocolos "de dos hilos" similares) tiene que usar pines GPIO de drenaje abierto para soportar el estiramiento del reloj, los ACK y detectar otros conflictos en los que el protocolo está diseñado. I2C también 2) Su MCU debe estar funcionando lo suficientemente rápido 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 de la sincronización, marca el ritmo de todas las transacciones. Para golpear un bit a un esclavo significa que el software debe estar listo a tiempo para el reloj entrante. Para implementar completamente I2C, el maestro también debe monitorear la línea SCL durante períodos de tiempo variables para permitir que el esclavo reconozca las transacciones.

    
respondido por el spuck
1

Sí, no hay problema.

No ocupa mucho espacio de código.

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

Atmel ha tenido algo de hardware I2C realmente abismal, y de todos modos, a veces ha sido necesario el bit bashing.

También puede compartir el pin, 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 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, al descender, los pines dedicados con niveles de I2C schmitt pueden proporcionar una mejor inmunidad al ruido.

SPI generalmente se ejecuta más rápido y es probable que el bit bash sea más lento. Además, el funcionamiento del hardware de los chips es simple, limpio y funciona correctamente; no tiene que solucionar los errores o la lógica mal pensada (a diferencia del hardware I2C). Pero si necesita más pines SPI, entonces es bueno moler los bits. (usar un interruptor analógico barato para mux the pin también es una opción)

    
respondido por el Henry Crun

Lea otras preguntas en las etiquetas