Wie man richtig initialisieren, I2C stm32?
Möchte ich, um Daten vom ADXL345 accelerometer,aber es scheint, dass ich falsch anschließen.
SCL - PC6(mit 10k Widerstand)
SDA - PC7(mit 10k Widerstand)
SDO - GND
CS - VCC
GND - GND
3.3 v - VCC
Hier ist mein code, um initalize:
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, das ich sah,
GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);
GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);
Aber ich habe nicht diese API zur Verfügung.
Bitte helfen Sie mir. Ich habe versucht, viele Lösungen und auch versucht, eine Verbindung über SPI, aber kein Erfolg 🙁
Bitte helfen Sie mit I2C.
InformationsquelleAutor SevenDays | 2011-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
SCL und SDA sollten direkt angeschlossen werden. Sie sollten verwenden Sie pull-up-widerstände wie auf diesem Schema: http://en.wikipedia.org/wiki/File:I2C.svg
Dein code für die Initialisierung sieht ok, also vielleicht die hardware-Verkabelung ist falsch?
Welche Fehler könnten Sie das konkretisieren? Manchmal benutze ich es so toll wäre es zu wissen, seine Probleme 😉
Sie müssen die shift-Adresse um eins nach Links.Beispiel:
while(!I2C_CheckEvent(I2CG, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2CG, DEV_ADDR<< 1, I2C_Direction_Receiver);
Oh, dieser. Ich vergaß es, aber ich bin mir ziemlich sicher, dass ich darauf gestoßen zu werden.
InformationsquelleAutor Yax
Merke ich, dies ist eine alte post, aber es ist einen Hinweis Wert. Sie sollten nicht mit APB-flags zu konfigurieren, den AHB-bus. Überprüfen Sie das programmers manual RM0008 (vorausgesetzt, Sie sind mit einem stm32f10x-Gerät) für die entsprechenden Einstellungen.
InformationsquelleAutor Junkers
Ich hatte das gleiche problem wie du. Die start-Bedingung generiert wurde, aber der I2Cx_SR1.SB bit nicht gesetzt.
Ich dachte, ich hätte zum aktivieren des I2C-alternate-Funktion, aber das musste ich deaktivieren Sie alle anderen Funktionen, die in der pin zu.
In meinem Fall war es UART3 Funktion in Konflikt mit I2C.
InformationsquelleAutor emersonblima
Gibt es Beispiel-code und app-Hinweise für den STM32 von jemandem, der behauptet zu haben, bekommen I2C, hier zu arbeiten:
http://www.stm32challenge.com/node/143
Vielleicht versuchen, etwas zu bekommen, bekannt wie ein serielles EEPROM funktioniert, bevor Sie versuchen, das unbekannte Beschleunigungssensor. Sobald Sie sicher sind, dass der mikrocontroller Ende funktioniert, schließen Sie den Beschleunigungsmesser und sehen, was Sie bekommen.
InformationsquelleAutor Steve C