I2C esclave récepteur sur stm32f4
J'essaie de mettre en œuvre un i2c esclave récepteur routine de service d'interruption sur un stm32f4.
Voici mon smart morceau de 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);
}
}
L'interruption est appelé et I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED cas est entré.
Le SCL est faible maintenant. Le manuel de référence dit que si je effacer l'adresse du pavillon de l'horloge continuera et les données seront envoyées à la Page 579 - Esclave récepteur). À mon avis, l'interruption devient toujours appelé si des données arrivent et suivant l'état sera I2C_EVENT_SLAVE_BYTE_RECEIVED.
Je ne peux pas trouver n'importe quel exemple de la stm ou par l'intermédiaire de google. Quelqu'un peut-il m'aider ou me montrer un exemple.
OriginalL'auteur Jonny Schubert | 2012-03-26
Vous devez vous connecter pour publier un commentaire.
maintenant ça fonctionne. Mon problème était que je n'étais pas en mesure de réinitialiser l'ADDR et la STOPF registre avec les commandes de manuel de référence. Mais si le faire dans une boucle, il fonctionne très bien pour moi. Voici mon travail de Routine d'Interruption.
OriginalL'auteur Jonny Schubert
Le matériel est de faire de l'horloge s'étirer pour s'assurer que l'esclave est de suivre le maître. L'esclave premier attend à obtenir une adresse de correspondance. Ensuite, vous obtenez interrompre alors que SCL est tenu faible. Cela permet à l'esclave pour l'essentiel à fournir contrôle de flux pour le maître. Le maître détecte que SCL est détenu en bas par des esclaves et il va attendre qu'il soit sorti avant de maître envoie plus de données. Afin de ne pas obtenir interruptions supplémentaires sur les données reçues parce que le maître de ne pas envoyer plus de données jusqu'à ce que vous laissez-SCL aller haut. Vous pouvez lire sur l'horloge de l'étirement ici http://en.wikipedia.org/wiki/I%C2%B2C
Je suppose que je suis confus au sujet de ce que votre question réelle est.
OriginalL'auteur TJD