¿Acceso al potenciómetro digital MCP4451 con STM32 mediante HAL para i2c?

Estoy usando una placa de desarrollo STM32 NUCLEO-F042K6 para interactuar con un potenciómetro digital MCP4451. Quiero poder ajustar los valores del limpiaparabrisas a través de i2c. Estoy usando STM32CubeIDE y la biblioteca HAL para interactuar.

 static const uint8_t POT_ADDRESS = 0x58;
 static const uint8_t INCREMENT = 0x94;

  while (1) {
  buf[0] = INCREMENT;
  ret = HAL_I2C_Master_Transmit(&hi2c1, POT_ADDRESS, buf, 2, HAL_MAX_DELAY);
  if (ret != HAL_OK) {
      strcpy((char*)buf, "Error Tx\r\n");
  } else {
      strcpy((char*)buf, "YEET\r\n");
  }

  HAL_UART_Transmit(&huart2, buf, strlen((char*)buf), HAL_MAX_DELAY);

  HAL_Delay(200);
  }

Tengo la configuración correcta, pero sigo recibiendo "Error Tx" en el monitor serial. Me aseguré de alimentar las líneas i2c con resistencias pull-up a 3.3V. Estoy un poco perdido en cuanto a qué hacer.

Depure mirando la condición if (ret != HAL_OK) { strcpy((char*)buf, "Error Tx\r\n");¿Qué le dice eso?
¿Qué valor de resistencias pull-up usaste?
Potencialmente, su dirección es incorrecta por la siguiente razón: 1. ¿Los bits establecidos para la dirección son incorrectos?
@RonBeyer Usé resistencias de 2.7k
¿Por qué no probaste cuál es el resultado? Le dirá si el dispositivo I2C responde con un NAK o con un tiempo de espera si el bus está atascado. ¿Está seguro de que configuró los pines A0 y A1 hacia abajo para que la dirección realmente esté configurada en 0x58? Si A0 y A1 son flotantes, tienen pull-ups, por lo que fuera del reinicio, la dirección sería 0x5E. ¿El chip se restableció correctamente y se liberó del restablecimiento antes de comunicarse con él?
@ManojKumar: En realidad estoy enviando este comando a una línea de potenciómetros digitales, cada uno con direcciones diferentes. Dado que solo hay dos bits de dirección y la línea tiene 4 potenciómetros, cada uno con diferentes bits de dirección configurados, i2c debería poder comunicarse con al menos uno de ellos.
@KingDuken No estoy seguro de saber a qué te refieres. Ejecuté el código en la placa de desarrollo y, dado que recibo "Error Tx", la función HAL_I2C_Master_Transmit no devolvió HAL_OK. Supongo que esto significa que la comunicación a través de i2C falló
@Justme ¿Podría dar más detalles sobre cómo debo probar el resultado? Ejecuté el código y recibí el mensaje "Error Tx". Los pines de dirección tienen pullups internos. Además, no estoy seguro sobre el reinicio o cómo hacerlo.
@ koreamaniac101 Si el resultado no es HAL_OK, entonces es otra cosa. Será más fácil simplemente abrir el código HAL de I2C y ver qué posibles valores de retorno hay, pero lo más probable es que haya HAL_BUSY, HAL_ERROR o HAL_TIMEOUT, y en caso de error, la instancia de I2C contiene un código de error que puede obtener para obtener más información. información Es difícil decir algo específico, ya que cada STM32 tiene periféricos I2C y bibliotecas HAL muy diferentes. También vale la pena verificar que SDA y SCL estén conectados correctamente, para que no se intercambien.
Depuración desde el punto de vista del software, si comprende las condiciones detrás de su ifdeclaración, debería poder señalar qué salió mal. Puede leer lo que HAL_I2C_Master_Transmitnecesita y compararlo con HAL_OK. También con respecto a lo que dijo Justme, verifique sus pines en el dispositivo esclavo para verificar que los pines de su dirección coincidan con lo que dice su código. Revise la hoja de datos de su dispositivo esclavo.
@Justme Gracias por el consejo. Reescribí mi declaración if para verificar todas las condiciones de devolución. La función devuelve HAL_ERROR y, al usar la función HAL_I2C_GetError(), pude obtener un código de error de 4, que corresponde a un error de AF (fallo de reconocimiento). ¿Alguna idea de adónde ir desde aquí?
¿Se ha inicializado el I2C? ¿Puertos GPIO configurados correctamente? ¿Relojes habilitados para periféricos? Ese código no muestra ninguna de estas cosas.
@Justme ¡Gracias por la ayuda! Configuré todo correctamente en el software. Sin embargo, mi supervisor encontró el problema. El potenciómetro digital funciona con 5 V, pero como la línea i2c funciona con 3,3 V, no estaba registrando el nivel alto digital correctamente. Dado que los pines STM32 en mi placa de desarrollo son de 5 V, tan pronto como ejecuté todo en 5 V, obtuve un estado correcto.

Respuestas (1)

Mi supervisor encontró el problema. El potenciómetro digital funciona con 5 V, pero como la línea i2c funciona con 3,3 V, no estaba registrando el nivel alto digital correctamente. Dado que los pines STM32 en mi placa de desarrollo son de 5 V, tan pronto como ejecuté todo en 5 V, obtuve un estado correcto.