SPI: MOSI no baja LOW para el dispositivo receptor

0

Espero que esta pregunta no sea una repetición de otras en este intercambio de pila con respecto a SPI. He estado buscando durante al menos una hora y no he encontrado el mismo problema / respuesta.

SCENARIO

Mis amigos y yo intentamos que un codificador giratorio y OLED funcionen juntos utilizando nuestro propio tablero personal. En este momento, solo queremos que la posición en el codificador se muestre en el OLED.

Un codificador rotatorio de posición absoluta está conectado a una placa de desarrollo que utiliza el chip ATmega2560 . El 2560 está hablando con el codificador con estos ajustes SPI:

  • Modo maestro (Modo SPI 3)
    • Fase : 1
    • Polaridad : 1
  • SPI Prescaler en f_OSC / 128 (Frecuencia actual de la CPU = 16MHz)

OLED: Adafruit SSD1306, 1.3 "128x64

Codificador: posición absoluta iC-MU - Hoja de datos del codificador de posición iC-MU

Tengo el programa actual configurado para leer uno de los registros EEPROM internos del codificador cada segundo. Aunque todavía no estoy seguro de abordar la EEPROM con precisión, el problema que me gustaría abordar es diferente.

PROBLEM

No recibí una respuesta del codificador, así que conecté un osciloscopio y comprobé las cuatro líneas SPI, como se ve a continuación. Por alguna razón, la línea MOSI nunca cae por debajo de ~ 3.50V. El dispositivo receptor todavía consideraría esto como una señal ALTA.

He intentado acceder a las conexiones OLED SPI desde que la pantalla en sí funciona con SPI. No pasó nada nuevo. He comprobado que todavía tengo una placa que funciona, reconectando constantemente el OLED y desconectando el codificador. La junta definitivamente sigue funcionando.

¿Cuál podría ser el problema con el SPI? ¿Hay un nombre específico para este problema?

    
pregunta S. Chang

2 respuestas

3
  

¿Cuál podría ser el problema con el SPI?

El seguimiento del alcance sugiere que hay otro controlador en la señal MOSI, además de la MCU.

Eso es malo, ya que MOSI normalmente usa un controlador push-pull y múltiples controladores push-pull entrarán en conflicto si intentan conducir a diferentes niveles lógicos al mismo tiempo. Como resultado, tiende a ver un voltaje "escalonado" como el que se ve en su rastreo de alcance MOSI, cuando los diferentes controladores en conflicto cambian los niveles lógicos que cada uno está controlando. (En el peor de los casos, varios controladores de la misma señal pueden dañarse permanentemente, si superan su corriente máxima de fuente / sumidero permitida a través del controlador contrario).

No es tan simple como que MOSI se acorte a Gnd, ya que no lo veríamos llegar a ~ 5V, ni tampoco a ~ 5V, ya que la señal es de 0 V al comienzo de la traza. Parece que hay una resistencia baja (por ejemplo, ¿el controlador de salida de otro dispositivo? ¿Una resistencia de valor bajo?) Que lo empuja hacia arriba. (Ver abajo).

  

¿Hay un nombre específico para este problema?

Conflicto entre varios controladores en la misma señal. Su próximo paso es averiguar qué más está impulsando esa señal y por qué.

Busqué en la hoja de datos del codificador. Vale la pena señalar que no tiene una interfaz SPI fija. Tiene una interfaz serial programable , que puede ser SPI pero también puede estar en otros modos. Verificaría su programación de (y conexiones a) el codificador, para ver si que está en un modo en el que it está impulsando el pin, que cree que es MOSI en SPI modo.

Observe cómo la señal MOSI comienza a 0V y va a ese nivel de ~ 3.5V cuando se activa -CS (bajo). A continuación, agregué una línea blanca vertical en la traza de su alcance, para mostrar que MOSI aumenta a ~ 3.5V al mismo tiempo a medida que se apaga -CS, antes del primer pulso de reloj en SCK:

Esa correlación es un gran indicio de que usted está habilitando el controlador conflictivo en la señal MOSI, cuando maneja bajo -CS. Suponiendo que la señal -CS solo va al codificador, eso vuelve a hacer que el codificador sea el principal sospechoso.

    
respondido por el SamGibson
2

suspiro. Encontré el problema. Cuando conectamos el tablero personalizado, se intercambiaron las líneas MOSI y MISO. Caso cerrado. >. < El codificador ahora funciona como debería, al igual que la placa personalizada. Creo que la advertencia fue definitivamente que la línea MOSI estaba tratando de mantenerse en HI cuando intenté colocarla en BAJA.

Espero que eso aclare muchas preguntas.

    
respondido por el S. Chang

Lea otras preguntas en las etiquetas