Comment STM32 I2C correctement initialize?
-
25-10-2019 - |
Question
Je veux obtenir des données de l'accéléromètre ADXL345, mais il semble que je me connecte de manière incorrecte, il.
Scl-PC6 (avec résistance 10k)
SDA PC7 (avec résistance de 10k)
SDO GND
CS - CCV
GND - GND
3.3v - CCV
Voici mon code à initialiser:
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);
}
Dans un exemple, j'ai vu
GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);
GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);
Mais je n'ai pas cette API disponible.
S'il vous plaît aidez-moi. J'ai essayé beaucoup de solutions et a également essayé de se connecter via SPI, mais sans succès :( S'il vous plaît aide I2C.
La solution
Scl-PC6 (avec résistance 10k)
SDA PC7 (avec résistance de 10k)
SCL et SDA doivent être connectés directement. Vous devez utiliser des résistances pull-up comme sur ce schéma: http://en.wikipedia.org /wiki/File:I2C.svg
Votre code d'initialisation semble correct, peut-être le câblage du matériel est erroné?
Autres conseils
Je sais que c'est un ancien poste mais il est intéressant de souligner. Vous ne devriez pas utiliser des drapeaux pour configurer le APB bus AHB. Vérifiez les programmeurs RM0008 manuel (en supposant que vous utilisez un dispositif de STM32F10x) pour les réglages appropriés.
J'ai eu le même problème que vous. La condition de démarrage a été généré, mais le bit I2Cx_SR1.SB ne soit pas défini. Je pensais que je devais activer la fonction alternative I2C, mais je devais désactiver la goupille toutes les autres fonctions aussi. Dans mon cas, il était en conflit avec la fonction UART3 I2C.
par une personne qui prétend avoir obtenu I2C travailler ici Il y a des exemples de code et notes app pour le STM32:
http://www.stm32challenge.com/node/143
Peut-être essayer d'obtenir quelque chose de connu comme un travail EEPROM série avant d'essayer l'accéléromètre inconnu. Une fois que vous êtes sûr la fin du microcontrôleur fonctionne, vous pouvez connecter l'accéléromètre et de voir ce que vous obtenez.