STM32 i2c通信障害リセット方法

最近、STM32 F10Xを調査して、同社のAVR MCUプロジェクトをSTM32に移行する準備をしていました。STM32 i2cパーツを調査するとき、i2cスレーブから切断した後、i2cスレーブの読み取り/書き込みには、STM32側のi2c_read / write関数での処理が必要です。

i2c読み取りおよび書き込みタイムアウトの直後に、次のコードが追加されました。

I2C_AcknowledgeConfig(I2C1、DISABLE);        
/ *!<STOP条件を送信* / 
I2C_GenerateSTOP(I2C1、ENABLE);

 次に、i2cスレーブを接続してi2c読み取り/書き込みを実行し、次の2つの位置でスタックしていることがわかりました。

I2C_GetFlagStatus(I2C1、I2C_FLAG_BUSY)

 または

I2C_CheckEvent(I2C1、I2C_EVENT_MASTER_MODE_SELECT)

 つまり、i2cスレーブが再度接続された後、ビジー信号または開始信号が送信された後、i2cバスは応答せず、このソリューションは機能しません。

 

stm32f10x_i2c.cライブラリを参照すると、void I2C_DeInit(I2C_TypeDef * I2Cx)の関数が見つかりました。i2cの読み取りと書き込みのタイムアウトの後に、次を追加します。

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);	
}

 

おすすめ

転載: www.cnblogs.com/wanglouxiaozi/p/12714965.html