I2C-slave-Empfänger auf stm32f4
Ich versuche zu implementieren, die eine i2c-slave-receiver interrupt service routine auf einem stm32f4.
Hier ist mein smart Stück code.
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);
}
}
Den interrupt aufgerufen wird, und I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED Fall eingegeben wird.
Die SCL low ist jetzt. Das Referenz-Handbuch sagt, wenn ich klar die Adresse, die Flagge, geht die Uhr weiter, und Daten werden gesendet (Seite 579 - Slave-Empfänger). Meiner Meinung nach ist der interrupt wird immer dann aufgerufen, wenn keine Daten eintreffen und der nächste Zustand wird I2C_EVENT_SLAVE_BYTE_RECEIVED.
Ich nicht finden können, jedes Beispiel von stm oder über google. Kann jemand mir helfen, oder zeigen Sie mir ein Beispiel.
InformationsquelleAutor Jonny Schubert | 2012-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
jetzt funktioniert es. Mein problem war, dass ich nicht in der Lage zurücksetzen ADDR-und die STOPF-register mit dem angegebenen Befehle aus dem Referenz-Handbuch. Aber wenn Sie es in einer Schleife, es funktioniert gut für mich. Hier meine arbeiten Interrupt-Routine.
InformationsquelleAutor Jonny Schubert
Die hardware tut clock-stretching, um sicherzustellen, dass der slave hält mit dem master. Der slave zuerst wartet man eine Adresse übereinstimmen. Dann kommen Sie zu unterbrechen, während SCL ist gering gehalten. Dies ermöglicht es slave zu bieten grundsätzlich flow control an den master. Der master erkennt, dass SCL wird niedrig gehalten, die von slave und wird es warten, bis es freigegeben werden, bevor der master sendet keine Daten mehr. So dass Sie nicht bekommen, zusätzliche interrupts auf Daten erhalten, weil der Meister nicht senden keine Daten mehr, bis Sie ließ SCL gehen hoch. Lesen Sie über das clock-stretching hier http://en.wikipedia.org/wiki/I%C2%B2C
Ich denke, ich bin verwirrt über das, was deine eigentliche Frage ist.
InformationsquelleAutor TJD