Wie initialisieren Sie I2C STM32 richtig?
-
25-10-2019 - |
Frage
Ich möchte Daten vom ADXL345 Accelerometer abrufen, scheint es aber fälschlicherweise verbinde.
SCL-PC6 (mit 10k Widerstand)
SDA-PC7 (mit 10K-Widerstand)
Sdo- gnd
CS - VCC
GND - GND
3,3 V - VCC
Hier ist mein Code zur Initalisierung:
void I2CG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// I2CG clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE);
RCC_AHBPeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE);
// GPIOB clock enable
// I2CG SCL and SDA configuration
GPIO_InitStructure.GPIO_Pin = SCL|SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Enable I2CG reset state
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2CG, ENABLE);
// Release I2CG from reset state
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2CG, DISABLE);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
I2C_InitStructure.I2C_OwnAddress1 = 1;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
I2C_Init(I2CG, &I2C_InitStructure);
I2C_Cmd(I2CG, ENABLE);
I2C_AcknowledgeConfig(I2CG, ENABLE);
}
In einem Beispiel habe ich gesehen
GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);
GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);
Aber ich habe diese API nicht zur Verfügung.
Bitte hilf mir. Ich habe viele Lösungen ausprobiert und versucht, mich über SPI zu verbinden, aber kein Erfolg :( Bitte helfen Sie mit I2C.
Lösung
SCL-PC6 (mit 10k Widerstand)
SDA-PC7 (mit 10K-Widerstand)
SCL und SDA sollten direkt angeschlossen werden. Sie sollten Pull-up-Widerstände wie bei diesem Schema verwenden: http://en.wikipedia.org/wiki/file:i2c.svg
Ihr Initialisierungscode sieht in Ordnung aus, also ist Hardwarekabel falsch?
Andere Tipps
Mir ist klar, dass dies ein alter Beitrag ist, aber es lohnt sich, darauf hinzuweisen. Sie sollten keine APB -Flags verwenden, um den AHB -Bus zu konfigurieren. Überprüfen Sie das Programmiererhandbuch RM0008 (vorausgesetzt, Sie verwenden ein STM32F10X -Gerät) für die entsprechenden Einstellungen.
Ich hatte das gleiche Problem wie du. Die Startbedingung wurde generiert, aber das i2cx_sr1.sb -Bit wird nicht eingestellt. Ich dachte, ich musste die alternative I2C -Funktion aktivieren, aber ich musste auch alle anderen Funktionen im PIN deaktivieren. In meinem Fall war es UART3 -Funktion, die mit I2C widerspricht.
Es gibt Beispielcode- und App -Notizen für den STM32 von jemandem, der behauptet, I2C hier zum Laufen zu bringen:
http://www.stm32Challenge.com/node/143
Vielleicht versuchen Sie, etwas bekannt zu machen, wie ein serielles EEPROM funktioniert, bevor Sie den unbekannten Beschleunigungsmesser ausprobieren. Sobald Sie sicher sind, dass das Mikrocontroller -Ende funktioniert, können Sie den Beschleunigungsmesser anschließen und sehen, was Sie erhalten.