en SPI, ¿se pueden conectar MOSI y MISO entre sí?

Estoy usando un microcontrolador de la serie 8051, y la documentación indica que si uso el modo serie 0, entonces su pin RXD puede funcionar como un pin bidireccional (tanto de entrada como de salida), mientras que TXD es estrictamente un reloj.

Tengo un IC que tiene pines MOSI, MISO y de reloj. y también uso circuitos integrados multiplexores/demultiplexores.

Quiero aprovechar el pin RXD del microcontrolador para no tener que hacer muchas rutinas de pérdida de tiempo de CPU para cada dispositivo que quiero controlar.

Entonces, ¿es aceptable conectar los pines MOSI, MISO y RXD juntos o debería haber una resistencia en alguna parte?

¿Y es seguro conectar una salida de un demultiplexor (Ejemplo: 74hc151) al pin RXD del 8051 y a una entrada de un decodificador (Ejemplo: 74HC138) o debo usar resistencias?

Si se requieren resistencias, ¿qué valores sugeriría y por qué?

Leí un par de veces la pregunta pero no entiendo, lo siento. Estoy confundido por el hecho de que hablas de RXD y TXD y luego hablas de MOSI y MISO de SPI. Supongo que está diciendo que RXD y TXD son algunos pines en el uC que se pueden usar como puertos SPI, ¿es correcto? ¿Quizás puedas proporcionar un esquema que muestre lo que quieres hacer? Independientemente de la configuración, no tiene sentido para mí por qué cortarías MOSI y MISO juntos.
Leí que en un chip 8051 (ejemplo: AT89C2051) que configurar el puerto serie en modo cero hará que TXD sea un reloj y RXD sea E/S de datos y por cada bit procesado, TXD lo registrará. La página 11 de este documento lo explica: libvolume6.xyz/medicalelectronics/btech/semester4/… , y quiero acortarlos juntos para poder recibir datos en el puerto serie del 8051 en el modo de registro de desplazamiento.
Ok, continuaré con esta idea teniendo en cuenta su enlace, pero creo que, por seguridad, buscaré resistencias de 1K.

Respuestas (1)

La respuesta es, depende".

Si su esclavo SPI establece tres estados en su pin MISO cuando no está transmitiendo, entonces no hay daño en conectar MISO y MOSI a una MCU que admita esta función. Si el esclavo SPI hace esto o no, debe especificarse en la hoja de datos del dispositivo, pero si no es así, puede averiguarlo por su cuenta:

  • dejar la línea MISO desconectada de la MCU
  • conecte la línea MISO a dos resistencias, una a +V y otra a GND
  • el valor real de las resistencias no importa. Deben tener el mismo valor, y cualquier valor entre 1k y 10k estaría bien para este experimento.
  • conecte un canal de un osciloscopio a la línea MISO y otro canal a la línea MOSI o CS#.

Ahora haga que su MCU realice una transacción SPI normal con el dispositivo, una a la que respondería el dispositivo. Lo que está buscando es el nivel de señal MISO mientras la MCU transmite al dispositivo. Debido a la red de polarización de la resistencia, la línea MISO debe estar ubicada aproximadamente a la mitad del nivel de suministro. Puede ser un poco más o menos dependiendo del dispositivo y la tolerancia de sus resistencias, pero debería ver algo que no sea +V ni GND si el dispositivo está triestableciendo su línea MISO.

Si la línea MISO está en uno de los rieles y luego comienza a alternar cuando el dispositivo responde, entonces el dispositivo no es un buen candidato para combinar las líneas MISO y MOSI. Esto se debe a que el dispositivo está impulsando activamente la línea MISO cuando no está hablando. Esto no está mal porque SPI es un sistema de comunicaciones full-duplex y cada dirección tiene su propia señal física. El dispositivo espera ser el único elemento impulsor en esa red, por lo que está haciendo lo correcto al mantener un nivel de señal.

Sin embargo, si la línea MISO se encuentra más o menos a medio camino entre los rieles y luego solo cambia a los rieles cuando envía su respuesta, entonces este dispositivo es capaz de unir sus líneas MISO y MOSI. La hoja de datos puede mencionar que se debe usar una resistencia pull-up o pull-down en la línea MISO, que es otra pista de que este es un dispositivo capaz de unir las líneas MISO y MOSI.

Ahora para abordar algo que has dicho:

Quiero aprovechar el pin RXD del microcontrolador para no tener que hacer muchas rutinas de pérdida de tiempo de CPU para cada dispositivo que quiero controlar.

Reconozco que está utilizando un 8051, pero incluso entonces es difícil creer que su MCU hará mucho mientras la transacción SPI esté activa. A menos que esté transmitiendo bloques masivos de datos, su periférico SPI es muy lento o su 8051 en particular tiene un puerto serie increíble, entonces es probable que tenga muy poco tiempo entre bytes para hacer cualquier cosa. Incluso el reloj 8051 más rápido a aproximadamente 50 MHz, que también es la frecuencia de reloj SPI máxima para la mayoría de los esclavos SPI. Incluso si su 8051 específico puede ejecutar una instrucción por reloj, no obtendrá más de 8-48 instrucciones por byte transferidas a través de SPI (suponiendo que su puerto SPI esté funcionando a 6-50 MHz). Es poco probable que ahorre mucho tiempo o energía usando el periférico.

¿Qué quieres decir con puerto serie "increíble"? uno que transmite a alta velocidad? Bueno, también podría configurar el puerto serie en modo manual donde puedo escribir un programa para alternar el bit a una velocidad súper lenta y leer el bit a velocidad lenta, pero si puedo leerlo configurándolo a través de serial (modo 0), prefiero hacer eso.
Lo que quiero decir con eso es que si tiene un periférico SPI simple, se verá interrumpido después de cada byte para que pueda enviar el siguiente byte al periférico. Sin embargo, si tiene la capacidad de especificar un búfer completo o usar DMA, estas son implementaciones periféricas SPI más "sorprendentes" que le permitirán hacer otro trabajo mientras el búfer de datos se agota por usted.