Ich bin sehr neu in der Verwendung von CUBE und HAL_libraries von STM. Ich verwende einen STM32F0-Mikrocontroller mit 32 Pins. Das Schema für I2C ist korrekt. Also brauche ich hier ein bisschen Hilfe.
Ich habe einen kapazitiven Sensor ( FDC1004 ), der I2C-Kommunikation verwendet. Ich muss diese Register schreiben, um die Daten zu lesen.
Wie kann ich das START-Anforderungsformular Master korrekt an den Slave senden (Slave-Adresse ist A0)?
Wie setze ich den Zeiger auf das 0x0C-Register?
- Datenblatt sieht (Register 0x0C: Bit [7: 4]) bis 1.) Ich weiß nicht, wie das geht? Und schließlich, wie man aus demselben Register liest?
- Außerdem muss ich das Feld DONE_x (Register 0x0C: Bits [3: 0]) warten, bevor ich es lese?
Aber ich weiß nicht, ob ich die richtigen Register anspreche! Weil ich keine Daten vom Sensor zurück bekomme!
Hier ist mein Code:
int I2Ccomm ()
{
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
HAL_Delay(50);
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register
return ReadREG[1];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
quelle
quelle
Antworten:
Beginnen wir mit der
HAL_I2C_Master_Transmit()
Funktion. Wenn Sie die Erklärung überprüfen:Kleines Problem mit dem 2. Parameter, der Slave-Geräteadresse. Die Adresse des Slave-Geräts lautet,
b1010000
wenn wir sie im 8-Bit-Format vervollständigen0xA0
, genau so, wie Sie es gesagt haben. WennHAL_I2C_Master_Transmit()
Sie dies jetzt an Sie übergeben, müssen Sie das R / W-Bit nicht manuell setzen, HAL erledigt dies für Sie. Wenn Sie alsoHAL_I2C_Master_Transmit()
das übertragene R / W-Bit aufrufen, ist dies automatisch 0, was eine Schreiboperation anzeigt, und wenn SieHAL_I2C_Master_Receive()
das übertragene R / W-Bit aufrufen, ist es automatisch 1, was eine Schreiboperation anzeigt . Sie haben die R / W-Werte gemischt, aber ich denke, die Funktion ist mir egal, es handelt sich also nicht um einen tatsächlichen Fehler in Ihrem Code.Der 3. Parameter (
uint8_t *pData
) ist ein Zeiger auf einen Puffer, der die zu sendenden Daten enthält . In Ihrem Aufruf ist der dritte Parameter,0x0C
der Ihre tatsächlichen Daten sind, die Registeradresse. Das Problem ist, dass es als Zeiger (von derHAL_I2C_Master_Transmit()
) auf einen Speicherort interpretiert wird , an dem einige undefinierte Daten gefunden werden können.Der 4. Parameter ist die Größe des Puffers , die Anzahl der zu sendenden Bytes. Wenn Sie ein einzelnes Byte senden möchten, sollte dieser Parameter 1 und nicht 10 sein.
Wenn Sie mit am besten, das Datenblatt des Slave-Geräts abzurufen und die Dokumentation der Schreib- und Lesevorgänge nachzuschlagen.I2C
Register schreiben
Hier ist das entsprechende Diagramm aus dem Datenblatt.
Nach dem Senden der Slave-Adresse an den Bus sollten drei weitere Bytes übertragen werden: Registerzeiger , MSB-Byte , LSB-Byte . Eine allgemeine Implementierung mit HAL-16-Bit-Registern:
Beispiel mit Ihren Werten:
write_register(0x0C, 0x0054);
Alternativ kann auch eine HAL-definierte Registerschreibfunktion verwendet werden, die zusätzliche Parameter zum Übergeben der Registeradresse und der Adressgröße enthält.
Jetzt ist die
HAL_I2C_Master_Receive()
Funktion fast dieselbe wie die andere.Der einzige Unterschied besteht darin, dass der 3. Parameter ein Zeiger auf den Puffer ist, in dem die empfangenen Daten gespeichert werden. Es befindet sich
0x02
in Ihrem Code und ich weiß nicht, was Ihr Zweck damit war, aber es wird als Zeiger interpretiert (leider auf einen zufälligen Speicherort).Register lesen
Um ein Register zu lesen, muss es mit einer Schreiboperation durch Senden des entsprechenden Registerzeigers ausgewählt werden (Beachten Sie, dass Sie, wenn Sie dieses Register direkt vor dem Lesen geschrieben haben, seine Adresse nicht erneut an den Zeiger senden müssen registrieren, wie Sie es bereits beim Schreiben eingestellt haben). Lesen Sie dann mit einer Leseoperation die 16-Bit-Daten zurück.I2C I2C
Beispiel:
Es gibt auch eine HAL-definierte Registerlesefunktion, die hat.
Lesen Sie durch 8.5 Programmierung Abschnitt des Datenblatt für weitere Details.
quelle