2017-10-11 9 views
1

J'ai lu tout à fait quelques tutoriels et des guides détaillés sur i2c, mais ce qu'il est pas clair pour moi est la suivante:I2C Lire et I2C comportement Ecrire des registres et aucune réponse de l'appareil

Supposons que vous devez lire un registre dois-je "écrire" sur l'i2c les 7 premiers bits en tant qu'adresse esclave, 1 bit avec R/W puis l'adresse reg (en tant que données) puis émettre une "lecture" pour écouter pour les octets

h_i2c *i2c_dev = i2c_drv_open(I2C1_PORT, SLAVE_ADDRESS); 
write_data[0] = 0x21; 
write_len = i2c_drv_write(i2c_h, write_data, 1); 
if (write_len != 1) 
    printf("error write_len is %d", write_len); 

uint8_t read_data[5]; 
read_len = i2c_drv_read(i2c_h, read_data, 5); 
if (read_len != 5) 
    wmprintf("error read_len is %d", read_len); 

ou

Dois-je émettre uniquement une lecture à une adresse qui est la "combinaison" de l'esclave et du registre que je veux lire?

De plus, la propriété "auto-incremental" signifie que tant que je donne le contrôle SDA à l'esclave, il continuera à envoyer des données?

EDIT1:

citant le pdf:

Le ENS210 est un dispositif esclave I²C avec une adresse d'esclave fixe de 0x43. Cela signifie que le premier octet après une condition de démarrage est 1000 011x, où x indique la direction des données, donc 0x86 (1000 0110) pour écriture et 0x87 (1000 0111) pour lecture.

est ici la sortie

https://imgur.com/a/8G8UR

Sur le front montant que je vois 1 0 0 0 0 1 1 0 1

Le dernier signifie nACK.

Mes idées sont:

  1. capteur est mort
  2. La résistance est mauvais, le capteur ne peut pas tirer vers le bas la ligne SDA
  3. La fréquence est à 125KHz est-il normal?

PS: sonde SCL a donc question la qualité du signal est mieux de ce que vous voyez ici

Cordialement,

+1

La feuille de données de l'appareil auquel vous tentez de parler devrait afficher des diagrammes de forme d'onde de transaction complète, qui le rendent clair. Je dirais que c'est l'ancien. – unwind

+0

Tous les périphériques I2C que j'ai vus fonctionnent comme votre exemple, avec une opération d'écriture puis une opération d'écriture, et si vous lisez 5 octets, vous lisez l'adresse 0x21 à 0x25. – JMA

+0

@JMA mis à jour le premier article – Luigi

Répondre

0

Cela dépend du périphérique I2C. La plupart des choses que j'ai vues vous permettent d'écrire d'abord le pointeur d'adresse, puis d'effectuer une lecture:

[DÉMARRER] -> [ADDR (W)] -> [REG] -> [RESTART] -> [ADDR (R)] -> [DATABYTES] -> [STOP]

La plupart des périphériques que j'ai vus commencent à lire les données du registre spécifié et incrémentent automatiquement le pointeur d'adresse pour chaque octet de données reçu par le maître. Chaque octet de données lu sera séquentiel en mémoire. Ce n'est pas toujours le cas cependant. De nombreux appareils vous permettent de désactiver l'auto-incrémentation du registre si vous le souhaitez.

Certains périphériques que j'ai vus fonctionnent un peu différemment en ce qui concerne les commandes de registre de lecture.Certains périphériques ne vous permettent pas de définir le registre pour lire TOUT et vous devez faire une lecture séquentielle pour obtenir les données que vous voulez. Un périphérique I2C doit avoir cette information sur la façon dont il attend des commandes de lecture/écriture dans la feuille de données avec les diagrammes de forme d'onde.

+0

ENS210 est l'appareil i2c je regarde – Luigi