Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#61 Message par Stefox » sam. 26 juil. 2025 05:15

Salut !

Je reprend la carte tout à l'heure, je termine ma nuit de boulot :lol: Je vois que je me suis planté dans le SSPAD, je l'ai modifié pour je ne sais plus quelle raison et j'ai oublié de le re-changer, je serai, si je ne me trompe pas, a 210Khz.... Je vais le remettre a 39 pour récupérer mes 100khz et te dirai quoi :wink: Je re-vérifierai aussi ce que je viens de te dire car je ne suis pas au top du top fin de nuit de boulot :lol:

Ah oui le "ça marche" je voulais dire "d'accord", je suis un grand adepte de cette expression :roll: Je vais tâcher de faire plus attention :?

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#62 Message par satinas » sam. 26 juil. 2025 06:00

Mets le SMP à 0 à tout hasard, et supprime les I2C2_Idle().
La mise au point on la fait étape par étape, donc un break qui se ballade derrière chaque appel de fonction I2C et l'afficheur doit faire défiler le compteur suivi de 1 puis 2,3,4,5. Et si ça coince on ne va pas plus loin.
Vérifie aussi qu'avec le break en fin de while et sans DS1307, l'afficheur s'arrête bien à 1.
Et moi je suis adepte de la lecture en diagonale :-)

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#63 Message par satinas » sam. 26 juil. 2025 11:17

La suite. Dans ce que tu racontais, on voyait bien que tes résultats étaient aléatoires. J'ai donc essayé d'approfondir avec la carte précitée.
Dans certains cas que je n'ai pas vraiment réussi à déterminer, le DS1307 se met en carafe et l'I2C ne répond plus. Même une mise hors tension ne suffit pas, je dois retirer le module DS1307 de son support et le remettre. Je crois que tu as aussi fait ce genre de chose.

Je pensais que c'est parce qu'on envoyait la commande adr_chip+R sans avoir au préalable envoyé l'adresse du registre à lire, mais par la suite il semble que cela ait marché. Le composant a un pointeur de registre qui est incrémenté à chaque écriture ou lecture, donc si tu lis juste après avoir écrit, la lecture se fera sur le registre suivant. Il vaut donc mieux ne pas s'embêter et écrire d'abord l'adresse du registre, un restart, et on lit le registre. Ne pas interrompre après la commande adr+R, il aime pas ça, il faut lire dans la foulée et envoyer un NAK après le dernier octet lu.

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#64 Message par Stefox » sam. 26 juil. 2025 14:55

J'ai mis SMP à 39 puis a 0.

J'ai supprimé tout les idle();

Au niveau des break, il m'affiche 3 si le code est comme ceci
aze.jpg

Si j'enlève un autre break, le rideau tombe ^^

Sur le LCD, quand j'ai quelque chose qui s'affiche, je ne vais jamais au dela de 3 (Avec la led qui clignote, ...)

Au lieu de mon stop start au milieu tu mettrais donc la fonction restart que j'ai c'est ça ? J'ai fait ceci, mais rideau aussi comme quand je faisais stop, start.
aze.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#65 Message par satinas » sam. 26 juil. 2025 15:07

Relis mon dernier message, ça partait en carafe car on envoie une commande read sans spécifier ce qu'on lit. Par la suite cela a marché mais je ne sais pas pourquoi. Il n'est pas dit que l'on peut faire un restart derrière une écriture de registre.

Peut être avec un start et un read direct, mais tu es censé te faire une fonction bool RtcReadReg(adr, &data) donc il faudra bien envoyer l'adresse du registre avant de lire, pourquoi tu veux t'en passer ?

Les essais de lire ou écrire plusieurs octets à la file n'ont pas été concluants. Dans ma bibliothèque je n'en lis/écris qu'un seul à la fois (pour la RTC, pour les eeproms pas de problème).

Code : Tout sélectionner

         I2C2_Start();
         value = 1;
         if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2) break;
         value = 2;
         if (I2C2_WriteData(0x00) != 2) break;
         second = dec2bcd(45);
         value = 3;
         if (I2C2_WriteData(second) != 2) break;
         I2C2_Stop();

         I2C2_Start();
         value = 4;
         if (I2C2_WriteAddr(SLAVE_1_ADRESS) != 2) break;
         value = 5;
         if (I2C2_WriteData(0x00) != 2) break;
         I2C2_Restart();
         value = 6;
         if (I2C2_ReadAddr(SLAVE_1_ADRESS) != 2) break;
         value = 7;
         dataRead = I2C2_ReadData(0);
         secRead = bcd2dec(dataRead);
         break;

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#66 Message par Stefox » sam. 26 juil. 2025 15:54

La fonction de lecture de registre, c'est pas justement ma fonction ReadAddr et ReadData ? ^^ J'ai dois donc faire un ReadAddr qui appel l'esclave (Pas très important si je fais un restart je crois) puis ReadAddr qui appel le registre 0x00 puis je fais un read data qui lit le registre

Par contre, j'ai peut être pas bien compris hein mais je lui précise déjà le registre ? Après le restart, j'envoie l'adresse de l'esclave et je lis. Le pointeur interne du DS1307 ayant été positionné juste avant lors de l'écriture, il n'a normalement pas bougé ? Ou alors il y a un truc que je n'ai pas compris

Et je ne lis aussi qu'un octet non ? Je lis que les secondes, j'envoie qu'un seul registre à la fois et je n'y inscrit qu'une seule valeur à la fois

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#67 Message par satinas » sam. 26 juil. 2025 16:01

Tu as positionné une adresse de registre ensuite tu as écrit dedans, ce qui a incrémenté cette adresse, donc si tu lis derrière tu n'auras pas le contenu du registre que tu as écrit.
L'auto-incrémentation du pointeur de registre c'est ce qui permet justement de lire ou écrire plusieurs octets à la file. Voir datasheet.
Modifié en dernier par satinas le sam. 26 juil. 2025 16:06, modifié 1 fois.

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#68 Message par Stefox » sam. 26 juil. 2025 16:06

Ok donc si je résume

Start
WriteAddr (Esclave)
WriteAddr (Registre)
WriteData (Donnée)

Restart

ReadAddr (Esclave)
ReadAddr (Registre)
ReadData (Donnée)

Stop

Tu penses que cela pourrait être à cause de ce souci que la communication plante et reste dans le while de la fonction ?

Fonctions I2C
satinas
Expert
Expert
Messages : 1487
Enregistré en : novembre 2015

#69 Message par satinas » sam. 26 juil. 2025 16:10

Ton résumé ne correspond pas à mon programme ci-dessus, je te rappelle que ce sont tes fonctions.
Tu auras une fonction d'écriture de registre, et une fonction de lecture de registre, cela t'étonne ?
Regarde mon fichier ds1307.c, celui-là il est simple, les autres sont plus ardus.

Fonctions I2C
Stefox
Débutant
Débutant
Messages : 63
Enregistré en : juillet 2025

#70 Message par Stefox » sam. 26 juil. 2025 16:20

Oui, donc je dois suivre le programme que tu m'as joint

Non, cela ne m'étonne pas, j'écris les secondes dans le registre

Puis je lis le registre, c'est normal pour moi


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités