Arm 如何正确初始化I2C stm32?

Arm 如何正确初始化I2C stm32?,arm,accelerometer,i2c,stm32,gpio,Arm,Accelerometer,I2c,Stm32,Gpio,我想从ADXL345加速计获取数据,但似乎连接错误 SCL-PC6(带10k电阻器) SDA-PC7(带10k电阻器) SDO-GND CS-VCC GND-GND 3.3v-VCC 以下是我要初始化的代码: void I2CG_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; RCC_AHBPeriphClockCmd(RCC_APB2Perip

我想从ADXL345加速计获取数据,但似乎连接错误

SCL-PC6(带10k电阻器)

SDA-PC7(带10k电阻器)

SDO-GND

CS-VCC

GND-GND

3.3v-VCC

以下是我要初始化的代码:

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);
}
在一个例子中,我看到

GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);

GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);
但是我没有这个API

请帮帮我。我尝试了许多解决方案,也尝试通过SPI连接,但没有成功:(
请帮助了解I2C。

有一些声称在这里使用I2C的人提供了STM32的示例代码和应用说明:

在你尝试未知的加速计之前,也许试着让串行EEPROM工作。一旦你确定微控制器端工作,你可以连接加速计,看看你得到了什么

SCL-PC6(带10k电阻器)

SDA-PC7(带10k电阻器)

SCL和SDA应直接连接。您应使用本方案中的上拉电阻器:


您的初始化代码看起来正常,因此可能是硬件接线错误?

我遇到了与您相同的问题。已生成启动条件,但未设置I2Cx_SR1.SB位。 我认为我必须启用I2C备用功能,但我也必须禁用引脚中的所有其他功能。
在我的例子中,这是UART3函数与I2C冲突。

我意识到这是一篇旧文章,但值得指出。你不应该使用APB标志来配置AHB总线。检查程序员手册RM0008(假设你使用的是stm32f10x设备)以获得适当的设置。

谢谢,但这不是我需要的。不,我无法通过“当”(!I2C_CheckEvent(I2CG,I2C_EVENT(I2CG,I2C_EVENT(I2C_MASTER,I2C_MODE(I2CG,I2C_EVENT(I2C_MASTER,I2C_MODE,I2C_MODE(I2CG,I2C_EVENT(I2C_EVENT,I2C_MASTER,IU MODE(I2C选择))时)I2C_Send7bitAddress(I2CG,DEV_ADDROh,这个。我忘了,但我很确定我也遇到过。