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 ---
- 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 ---
Modérateur : Jérémy
Fonctions I2C
Salut !
Je reprend la carte tout à l'heure, je termine ma nuit de boulot
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
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
Ah oui le "ça marche" je voulais dire "d'accord", je suis un grand adepte de cette expression
Je vais tâcher de faire plus attention 
Je reprend la carte tout à l'heure, je termine ma nuit de boulot
Ah oui le "ça marche" je voulais dire "d'accord", je suis un grand adepte de cette expression
Fonctions I2C
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
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
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.
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
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
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.
J'ai supprimé tout les idle();
Au niveau des break, il m'affiche 3 si le code est comme ceci
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.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Fonctions I2C
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).
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
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
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
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.
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
Fonctions I2C
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités


