Zugriff auf MCP4451 Digital Pot mit STM32 mit HAL für i2c?

Ich verwende ein STM32 NUCLEO-F042K6-Entwicklungsboard, um mit einem digitalen MCP4451-Pot zu interagieren. Ich möchte in der Lage sein, die Wischerwerte über i2c anzupassen. Ich verwende die STM32CubeIDE und die HAL-Bibliothek als Schnittstelle.

 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);
  }

Ich habe die richtige Konfiguration, aber ich erhalte immer wieder "Error Tx" auf dem seriellen Monitor. Ich habe darauf geachtet, die i2c-Leitungen mit Pull-up-Widerständen auf 3,3 V zu versorgen. Ich bin etwas ratlos, was ich tun soll.

Debuggen Sie, indem Sie sich die Bedingung ansehen. if (ret != HAL_OK) { strcpy((char*)buf, "Error Tx\r\n");Was sagt Ihnen das?
Welche Pullup-Widerstände hast du verwendet?
Möglicherweise ist Ihre Adresse aus folgendem Grund falsch: 1. Die gesetzten Bits der Adresse sind falsch?
@RonBeyer Ich habe 2,7k Widerstände verwendet
Warum hast du nicht getestet, was das Ergebnis ist? Es wird Ihnen sagen, ob das I2C-Gerät mit einem NAK oder mit einem Timeout antwortet, wenn der Bus blockiert ist. Sind Sie sicher, dass Sie die Pins A0 und A1 nach unten gezogen haben, sodass die Adresse wirklich auf 0x58 eingestellt ist? Wenn A0 und A1 schwebend sind, haben sie Pull-ups, sodass die Adresse außerhalb des Resets 0x5E wäre. Ist der Chip richtig zurückgesetzt und vom Zurücksetzen befreit, bevor er mit ihm kommuniziert?
@ManojKumar: Ich sende diesen Befehl tatsächlich an eine Reihe digitaler Töpfe mit jeweils unterschiedlichen Adressen. Da es nur zwei Adressbits gibt und die Leitung 4 Töpfe mit jeweils unterschiedlich konfigurierten Adressbits hat, sollte i2c in der Lage sein, mit mindestens einem davon zu kommunizieren.
@KingDuken Ich bin mir nicht sicher, ob ich weiß, was du meinst. Ich habe den Code auf dem Entwicklungsboard ausgeführt, und da ich "Error Tx" erhalte, hat die HAL_I2C_Master_Transmit-Funktion das HAL_OK nicht zurückgegeben. Ich gehe davon aus, dass die Kommunikation über i2C fehlgeschlagen ist
@Justme Könnten Sie näher erläutern, wie ich das Ergebnis testen soll? Ich habe den Code ausgeführt und die Meldung "Error Tx" erhalten. Die Adresspins haben interne Pullups. Ich bin mir auch nicht sicher über das Zurücksetzen oder wie das geht
@ koreamaniac101 Wenn das Ergebnis nicht HAL_OK ist, dann ist es etwas anderes. Es ist am einfachsten, einfach den I2C-HAL-Code zu öffnen und zu sehen, welche möglichen Rückgabewerte es gibt, aber höchstwahrscheinlich wird es HAL_BUSY, HAL_ERROR oder HAL_TIMEOUT geben, und für den Fehlerfall enthält die I2C-Instanz einen ErrorCode, den Sie für weitere Informationen erhalten können die Info. Es ist schwierig, etwas Genaues zu sagen, da jeder STM32 sehr unterschiedliche I2C-Peripheriegeräte und HAL-Bibliotheken dafür hat. Es lohnt sich auch zu überprüfen, ob SDA und SCL richtig herum angeschlossen sind, damit sie nicht vertauscht sind.
Debugging aus Software-Sicht: Wenn Sie die Bedingungen hinter Ihrer ifAussage verstehen, sollten Sie in der Lage sein, darauf hinzuweisen, was schief gelaufen ist. Sie können lesen, was HAL_I2C_Master_Transmitbenötigt wird, und es mit vergleichen HAL_OK. Überprüfen Sie auch in Bezug auf das, was Justme gesagt hat, Ihre Pins auf dem Slave-Gerät, um sicherzustellen, dass Ihre Adress-Pins mit dem übereinstimmen, was Ihr Code sagt. Überprüfen Sie das Datenblatt Ihres Slave-Geräts.
@Justme Danke für den Rat. Ich habe meine if-Anweisung umgeschrieben, um alle Rückgabebedingungen zu überprüfen. Die Funktion gibt HAL_ERROR zurück, und mit der Funktion HAL_I2C_GetError() konnte ich einen Fehlercode von 4 erhalten, was einem AF-Fehler (Acknowledgement Failure) entspricht. Irgendwelche Ideen, wo man von hier aus gehen kann?
Wurde der I2C initialisiert? GPIO-Ports richtig konfiguriert? Uhren für Peripheriegeräte aktiviert? Dieser Code zeigt keines dieser Dinge.
@Justme Danke für die Hilfe! In der Software habe ich alles richtig konfiguriert. Mein Vorgesetzter hat das Problem jedoch gefunden. Der Digitalpoti läuft mit 5 V, aber da die i2c-Leitung mit 3,3 V läuft, hat sie Digital High nicht richtig registriert. Da die STM32-Pins auf meinem Entwicklungsboard 5 V haben, bekam ich einen OK-Status, sobald ich alles auf 5 V lief.

Antworten (1)

Mein Vorgesetzter hat das Problem gefunden. Der Digitalpoti läuft mit 5 V, aber da die i2c-Leitung mit 3,3 V läuft, hat sie Digital High nicht richtig registriert. Da die STM32-Pins auf meinem Entwicklungsboard 5 V haben, bekam ich einen OK-Status, sobald ich alles auf 5 V lief.