El escáner I2C no funciona correctamente

2

En primer lugar, consulte mi otra pregunta AQUÍ como está relacionado (cualquier ayuda con eso es muy apreciada también).

Si leyó mi otra pregunta, sabrá que estoy intentando establecer una interfaz con un sensor magnético IC, el MLX90393 , en el Sparkfun Breakout Board .

He tenido problemas para leer los datos y confío en que el problema está en el código, no en el hardware. La razón de esto, es cuando uso el ARDUINO EJEMPLO CÓDIGO en GitHub, con el Arduino IDE (aún usando el hardware STM32 Nucleo), todo funciona y puedo leer los datos del sensor. Sin embargo, cuando intenté convertir ese código a mbed, recibí un error y no puedo extraer los datos.

Ahora he decidido ver qué pasaría al intentar hacer un escaneo para encontrar la dirección. Previoulsy, al realizar una exploración I2C en el IDE mbed, recibí un ACK de cada dirección. El código que utilicé fue AQUÍ . Cuando ejecuto este código, esta es la respuesta que obtuve:

Tengaencuentaqueagreguéun\nadicionaldespuésde"Dispositivo I2C encontrado en ..." para que no se desplace por la pantalla. Tenga en cuenta que lo he intentado con el Error == 0 y 1. Cuando uso el Error == 0 para mbed, aparece "No se encontraron dispositivos"

Esto es casi una copia exacta del escáner Arduino I2C, que se puede encontrar AQUÍ . Mirando a través de los 2, básicamente son exactamente iguales, y no puedo encontrar la diferencia entre ellos (tenga en cuenta que esta es la primera vez que trabajo con I2C). Cuando ejecuto este código en el mismo hardware pero a través del IDE de Arduino, esto es lo que obtengo:

¿Alguien tiene alguna idea de por qué sucede esto? ¿Cuál es la diferencia entre hacer esto con el IDE de Arduino y el mbed? Espero que resolver este problema pueda ayudar a resolver el problema con mi otra pregunta, pero esto es realmente frustrante. He intentado cambiar los pullups I2C a diferentes valores y eso tampoco tuvo ningún efecto.

    
pregunta Curious

1 respuesta

2

Trabajando con el OP, este problema ha sido resuelto.

Versión corta:

  • Desoldar STM32F303K8 Nucleo-32 (NUCLEO-F303K8) en los puentes de soldadura SB16 y SB18 cuando se usan las funciones Mbed I2C.
  • Utilice la llamada "extendida" de 4 parámetros Mbed i2c.write() con la placa Nucleo-32 STM32F303K8.

Versión larga:

Como mencioné en los comentarios (de acuerdo con Chris Knudsen ), necesitamos observar las señales. A partir de mis propias experiencias a lo largo de los años, a veces puede ser importante comenzar con un 'alcance', ya que puede mostrar detalles importantes sobre la forma y los niveles de voltaje de las formas de onda de la señal, que no se pueden ver con una analizador lógico. Luego, una vez que se hayan verificado las formas de onda analógicas, continúe con el uso de un analizador lógico.

Utilizando Arduino IDE y las bibliotecas para la placa Núcleo STM32F303K8, y ejecutando el escáner I2C solo para la dirección I2C 0x1 (que no existía en el bus), vimos esta imagen de actividad I2C válida (amarillo = SDA, azul = SCL):

Sinembargo,seejecutaun escáner I2C para Mbed , configurado para En la placa Nucleo STM32F303K8, vimos esto en el bus I2C:

EstomuestraqueSDAestáatascadoaaproximadamente2V,locualnoesválido,esdecir,noestádentrodelrangopermitidoparalalógica0(típicamente<0.2Vdd)olalógica1(típicamente>0.8Vdd).Esteesunsíntomaclásicodedospinesdesalidaqueconducenlamismaseñalendireccionesopuestas.

Mirandoel STM32F303K8 Guía del usuario de Nucleo (UM1956) vemos que en realidad conecta los pines SCL y SDA a otros pines, para algunos tipo de compatibilidad con la funcionalidad de entrada analógica Arduino Nano.

(EdiciónanteriordelaTabla8enSTM32F303K8 Nucleo Guía del usuario (UM1956) )

(Extractoesquemáticodelapágina33en STM32F303K8 Núcleo del usuario (UM1956) )

Eso significa que si el código de inicialización de Mbed no configuró los pines PA5 y PA6 como entradas sin resistencias pull-up / down, entonces a través de esos puentes de soldadura, los pines PA5 y PA6 podrían afectar las señales I2C que usan los pines PB6 y PB7 .

Al soldar estos dos puentes de soldadura, las señales de I2C se pueden ver correctamente, con el código del escáner Mbed I2C:

Durantelainvestigación,encontramos esta publicación sobre el uso del Placa STM32F303K8 Nucleo-32 (NUCLEO-F303K8) con Mbed, que decía:

  

Parece que este dispositivo no admite el método i2c.write (int data). i2c.write (dirección int, datos const char *, longitud int); funciona.

Cambiando de el escáner original de Mbed I2C (adaptado del Escáner Arduino I2C estándar) que utilizó la secuencia:

i2c.start();
error = i2c.write(address << 1);
i2c.stop();

a un escáner I2C Mbed diferente usando esta versión diferente de la función i2c.write() llamada en su lugar:

returnCode = i2c.write((address << 1),&outByte,1,0);

entonces este escáner Mbed I2C diferente funcionó correctamente.

Esta sería un área para una investigación más profunda del código fuente de Mbed y el comportamiento detallado de I2C usando un analizador lógico, sin embargo, nos quedamos sin tiempo. Al documentar el proceso hasta el momento y lo que se encontró que funciona, espero que esto sea útil como punto de partida para cualquier otra persona que quiera continuar con la investigación.

    
respondido por el SamGibson

Lea otras preguntas en las etiquetas

Comentarios Recientes

en CPU: 17/08/2017 11: 33: 28.512 - Tema: 1 -> ¿Algún tipo de fuente de calor que haya informado? Alguien debe informar el punto de acceso que puede estar dentro de la propia aguja, tal vez calafatear si es un problema. 17/08/2017 11: 33: 28.517 - Tema: 1 -> También hay un collar térmico en la estación del asaltante (hwm). Ver controlador ps4. No hay nada para venderlo por defecto ... veré si encuentro algo más. 17/08/2017 11: 33: 28.556 - Subproceso: 1 -> Cargue la imagen EyeHC en el cargador de texturas pero... Lees verder