2011-11-29 135 views
3

我想从ADXL345加速计中获取数据,但似乎我错误地连接了它。如何正确初始化I2C stm32?

SCL-PC6(用10k电阻器)

SDA-PC7(用10k电阻器)

SDO-的位置GND

CS - VCC

GND - GND

3.3 v - VCC

这里是我的代码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); 
} 

在一个例子中,我看到

GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG); 

GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG); 

但是我没有这个API可用。

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

回答

1

SCL-PC6(用10k电阻器)

SDA-PC7(用10k电阻器)

SCL和SDA应直接连接。你应该使用这种方案的上拉电阻:http://en.wikipedia.org/wiki/File:I2C.svg

你的初始化代码看起来不错,所以也许硬件接线错了?

+0

是的。我发现STD periph库包含错误。 – SevenDays

+0

什么错误,你能更具体吗?有时我使用它,所以知道它的问题会很好;) – Yax

+3

您需要将地址向左移一位。例如: 'while(!I2C_CheckEvent(I2CG,I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2CG,DEV_ADDR << 1,I2C_Direction_Receiver);' – SevenDays

0

有被人谁声称,他们已经得到了I2C这里工作的示例代码和应用笔记的STM32:

http://www.stm32challenge.com/node/143

也许尝试得到的东西称为像串行EEPROM您尝试未知的加速度前的工作。一旦确定微控制器结束工作可以连接加速度计,看看你会得到什么。

+0

谢谢,但这不是我需要的。 (!I2C_CheckEvent(I2CG,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));“我不能过去” – SevenDays

1

我和你有同样的问题。生成了启动条件,但I2Cx_SR1.SB位未设置。 我认为我必须启用I2C复用功能,但我必须禁用引脚中的所有其他功能。 在我的情况下,UART3功能与I2C相冲突。

1

我意识到这是一个旧帖子,但值得指出。您不应该使用APB标志来配置AHB总线。检查程序员手册RM0008(假设您使用的是stm32f10x设备)进行适当的设置。