最近在調研STM32 F10X,准備把公司AVR的MCU項目遷移到STM32上。在調研STM32 i2c這一部分時,在與i2c slave硬件連接斷開后,這時再去讀/寫 i2c slave需要STM32這邊的i2c_read/write函數做一些處理。
剛開始在i2c讀寫timeout后,添加了如下代碼:
I2C_AcknowledgeConfig(I2C1, DISABLE); /*!< Send STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE);
再把i2c slave連接起來,進行i2c read/write時,發現一直卡在下面兩個位置:
I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)
或者
I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)
也就是說i2c slave再連接起來后,i2c總線會一直busy或者start信號發出后沒有反應,此方案行不通。
在瀏覽stm32f10x_i2c.c庫時,看到了有void I2C_DeInit(I2C_TypeDef* I2Cx)函數,在i2c讀寫timeout后,添加:
I2C_DeInit(I2C1); I2c_Configuration();
問題就解決了。
I2c_Configuration()函數如下:
void I2c_Configuration(void) { I2C_InitTypeDef I2C_InitStructure; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); }