私はstm32f4でi2cスレーブレシーバ割り込みサービスルーチンを実装しようとしています。 ここに私のスマートなコードがあります。stm32f4のI2Cスレーブレシーバ
void I2C2_EV_IRQHandler()
{
switch (I2C_GetLastEvent(I2C2))
{
//The address sent by the master matches the own address of the peripheral
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
//The slave stretches SCL low until ADDR is
//cleared and DR filled with the data to be sent
I2C_ClearFlag(I2C2,I2C_FLAG_ADDR);
break;
//The application is expecting a data byte to be received
case I2C_EVENT_SLAVE_BYTE_RECEIVED:
I2C_ReceiveData(I2C2);
break;
//The application is expecting the end of the communication
//Make sure that both ADDR and STOPF flags are cleared
//if both are found set.
case I2C_EVENT_SLAVE_STOP_DETECTED:
if(I2C_GetFlagStatus(I2C2,I2C_FLAG_ADDR) == SET)
I2C_ClearFlag(I2C2,I2C_FLAG_ADDR);
if(I2C_GetFlagStatus(I2C2,I2C_FLAG_STOPF) == SET)
I2C_ClearFlag(I2C2,I2C_FLAG_STOPF);
}
}
割り込みが呼び出されI2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED場合が入力されるとなります。 SCLが低いです。リファレンスマニュアルには、アドレスフラグをクリアすると、クロックが継続され、データが送信されます(579ページ - スレーブ受信機)。私の意見では、データが到着し、次の状態がI2C_EVENT_SLAVE_BYTE_RECEIVEDになると、割り込みは常に呼び出されます。
stmまたはgoogleから例が見つかりません。誰かが私を助けたり、私に例を示すことができます。
上記のコードの1つのエラーは、いずれの場合も肯定応答がありません。私の場合、マスターと通信する他のスレーブもあります。だから私のスレーブを初期化した後、バスで聴く。私は私のコミュニケーションの一部ではないストップビットを受け取ります。だから私はストップビットを削除することができません。また、私が思ったほどADDRフラグをリセットするのは簡単ではありません。 –