最近、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); }