2011-11-29 109 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設備)進行適當的設置。