STM32 i2c通訊失敗復位方法


最近在調研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);	
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM