Je suis très nouveau dans l'utilisation de CUBE et HAL_libraries de STM. J'utilise un microcontrôleur STM32F0 avec 32 broches. Le schéma pour I2C est correct. J'ai donc besoin d'un peu d'aide ici.
J'ai un capteur capacitif ( FDC1004 ) qui utilise la communication I2C. Je dois écrire ces registres pour lire les données.
Comment pourrais-je envoyer correctement le maître de formulaire de demande START à l'esclave (l'adresse de l'esclave est A0)?
Comment définir le pointeur sur le registre 0x0C?
- La fiche technique voit (Registre 0x0C: bit [7: 4]) à 1.) Je ne sais pas, comment faire? Et enfin comment lire à partir du même registre?
- De plus, je dois attendre le champ DONE_x (Registre 0x0C: bits [3: 0]) avant de le lire?
Mais je ne sais pas si je m'adresse aux bons registres! Parce que je ne récupère aucune donnée du capteur!
Voici mon code:
int I2Ccomm ()
{
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
HAL_Delay(50);
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register
return ReadREG[1];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
la source
la source
Réponses:
Commençons par la
HAL_I2C_Master_Transmit()
fonction. Si vous vérifiez sa déclaration:Problème mineur avec le 2ème paramètre, l'adresse du périphérique esclave. L'adresse du périphérique esclave est que
b1010000
si nous la complétons au format 8 bits, elle le sera0xA0
, comme vous l'avez dit. Maintenant, lorsqueHAL_I2C_Master_Transmit()
vous passez cela, vous n'avez pas à définir le bit R / W manuellement, HAL le fera pour vous. Ainsi, lorsque vous appelezHAL_I2C_Master_Transmit()
le bit R / W transmis sera automatiquement 0 indiquant l'opération d'écriture et lorsque vous appelezHAL_I2C_Master_Receive()
le bit R / W transmis sera automatiquement 1 indiquant l'opération d'écriture . Vous avez mélangé les valeurs R / W mais je pense que c'est un peu pour la fonction, donc ce n'est pas une erreur réelle dans votre code.Le 3ème paramètre (
uint8_t *pData
) est un pointeur vers un tampon qui contient les données à envoyer . Maintenant, dans votre appel, le troisième paramètre est0x0C
celui de vos données réelles, l'adresse du registre. Le problème est qu'il sera interprété comme un pointeur (par leHAL_I2C_Master_Transmit()
) vers un emplacement mémoire, où des données non définies peuvent être trouvées.Le 4ème paramètre est la taille du tampon , le nombre d'octets à envoyer. Si vous souhaitez envoyer un seul octet, ce paramètre doit être 1 et non 10.
Écrire des registres
Voici le schéma correspondant de la fiche technique.
Ainsi , après l' envoi de l'adresse esclave au bus, trois autres octets doivent être transmis: registre de pointeur , octet MSB , LSB octet . Une implémentation générale avec l'écriture HAL de registres 16 bits:
Exemple avec vos valeurs:
write_register(0x0C, 0x0054);
Alternativement, la fonction d'écriture de registre définie par HAL peut également être utilisée, qui a des paramètres supplémentaires pour transmettre l'adresse de registre et la taille d'adresse.
Maintenant, la
HAL_I2C_Master_Receive()
fonction est presque la même que l'autre.La seule différence est que le troisième paramètre est un pointeur vers le tampon où les données reçues seront stockées. C'est
0x02
dans votre code et je ne sais pas quel était votre but, mais il sera interprété comme un pointeur (malheureusement vers un emplacement mémoire aléatoire).Lire les registres
Exemple:
Il existe également une fonction de lecture de registre définie par HAL, qui a.
Lisez la section 8.5 Programmation de la fiche technique pour plus de détails.
la source