2013-10-24 114 views
0

我正在使用STM32F373微控制器,並寫了一個簡單的函數來讀取總線i2c 1(PB7 PB6)上MPU6050陀螺儀+加速器的數據。 問題是,當我嘗試讀取傳感器寄存器數據時 - 標誌I2C_ISR_TXIS總是等於RESET(未設置)。 爲什麼會發生這種情況?STM32F3 I2C讀取數據

這裏是問題的源代碼。

void i2c1_init(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 
    I2C_InitTypeDef I2C_InitStructure; 

    RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); 

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_4); 
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_4); 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; 
    GPIO_Init(GPIOB, &GPIO_InitStructure); 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 
    GPIO_Init(GPIOB, &GPIO_InitStructure); 

    I2C_DeInit(I2C1); 
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; 
    I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; 
    I2C_InitStructure.I2C_DigitalFilter = 0x00; 
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; 
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; 
    I2C_InitStructure.I2C_Timing = 0xC062121F; 

    I2C_Init(I2C1, &I2C_InitStructure); 
    I2C_Cmd(I2C1, ENABLE); 
} 

uint8_t i2c_read(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t len) 
{  
    /* Test on BUSY Flag */ 
    uint32_t timeout = I2C_TIMEOUT; 
    while(I2C_GetFlagStatus(I2C1, I2C_ISR_BUSY) != RESET) 
    { 
    if((timeout--) == 0) return 0; 
    }  
    I2C_TransferHandling(I2C1, DeviceAddr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); 


    /* !!! Wait until TXIS flag is set !!! */ 
    timeout = I2C_TIMEOUT; 
    while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET) // PROBLEM HERE!!!!!!!!!!!!!!! 
    { 
    if((timeout--) == 0) return 0;   
    } 


    .... 
    .... 
} 
+0

也許向我們展示'I2C_GetFlagStatus'的來源? –

+0

I2C_TransferHandling是外設庫的一部分嗎?從STM32F2xx版本開始,這一定是一個新的增加。 – rjp

回答

7

好的,我發現了這個問題。標誌I2C_ISR_TXIS沒有得到,因爲i2c上的設備沒有響應發送的地址。需要將設備地址轉換爲7位。

(DeviceAddr & 0x7f) << 1 
+0

這是我最不喜歡I2C的東西。微控制器外設傾向於希望設備地址位於高7位,設備的數據表傾向於在低7位中指定地址。我第一次總是弄錯了。 – rjp

+0

恭喜您解決您的問題 - 隨時接受您自己的答案,以便問題顯示已解決。 –

+0

天啊,謝謝。數據表顯示了低位地址,我甚至沒有考慮將其轉移。你從頭痛中拯救了我:D – Mewa