Le delai peut ne pas etre le meme pour la lecture et l'ecriture? intuitivement si ca devait varier je parierais que c l'ecriture qui demanderait un delai plus long......hors l'ecriture marche nikel.....
Le delai peut ne pas etre le meme pour la lecture et l'ecriture? intuitivement si ca devait varier je parierais que c l'ecriture qui demanderait un delai plus long......hors l'ecriture marche nikel.....
Exact, donc on pourrait en déduire qu'il sagit d'une erreur de protocol...
En conservant le même délai que pour l'écriture, met au point la lecture...
Ca marche pas je commence a craaaquer......Envoyé par Sub0
![]()
post ton code et le protocol que tu as récupéré...
Si tu attend que je potasse, j'ai pas trop le temps en réalité,
alors donne-moi toutes les infos nécessaires pour l'analyse si tu veux...
Je t'avais envoyé mon code je crois par mp...non? l'ecriture est bonne juste la lecture marche pas..pourtant je suis scrupuleusement le protocole du datasheet.....Envoyé par Sub0
Donc ton code actuel...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 ubyte IO_ubI2C_Read_Bytes(char Canal,ubyte chip_address, ubyte data_address) { ubyte ACK=0; ubyte data=0; unsigned int i; while (ACK == 0) { ACK = 1; IO_vI2C_Start(Canal); ACK &= IO_ubI2C_Write(Canal,(chip_address & 0xFE)); ACK &= IO_ubI2C_Write(Canal,data_address); IO_vI2C_Stop(Canal); IO_vI2C_Start(Canal); ACK &= IO_ubI2C_Write(Canal,(chip_address | 0x01)); data = IO_ubI2C_Read(Canal); IO_vI2C_Ack0(Canal); IO_vI2C_Stop(Canal); } return data; }Et le protocol du datasheet...
Code : Sélectionner tout - Visualiser dans une fenêtre à part data== IO_ubI2C_Read_Bytes(I2C_ARME_LC,160,1);
Bon, ton code correspond à quel tableaux ci-dessus?
Tu as choisi le 8-2 j'ai l'impression, non?
Je n'ai pas compris à quoi correspond "canal"...
"& 0xFE" sert à quoi?
Tu as un stop à la place de l'accusé, c'est pas la même chose.
le NOACK est important aussi, il est différent de l'ACK...
Lit le datasheet sur ce point.
à+
salut,
oui mon code corespond a la figure 8-2.
Canal corespond a un numero d'I2C, parcequ'il y a un autre composant sur un autre I2C que je programme aussi.....ne tiens pas compte du canal....
0xFE permet de rentrer un seul parametre lors de l'appel de la fonction...
"& 0xFE" permet de mettre un 0 au bit R/W pour l'ecriture et " | 0x01" met un "1" au bit R/W......
Le NoACK corespond a Ack0()...
La fonction de lecture devrait avoir cet ordre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Start; Write(160); Ack; Write(address); Ack; Start; Write(161); Ack; data=Read; NoAck; Stop;
Quelle est la difference entre Ack et Ack0?Envoyé par Sub0
C bien moi qui recoit l'ACK , je dois pas acquitter, c le recepteur qui acquitte sauf pour le NoAck ou la c moi qui ne doity pas acquitter en mettant SDA_OUT a 1 pendant un clock? non?
Déjà, le fait que tu utilises un stop avant le start...
Un start suffit, et le stop n'est pas nécessaire. Ensuite:
le NOACK est important aussi, il est différent de l'ACK...
Lit le datasheet sur ce point.
Attention, si tu adresses plusieurs composants I²C sur le même bus, il faut peut-être l'adresser à chaque commande!
Autrement dit XXX dans l'octet de commande correspond peut-être à n° du composant... faut lire le datasheet, à+
g 2 bus I2C........le pb ne se pause pas....Envoyé par Sub0
Envoyé par Sub0
LE stop g essaye de le rajouter parce que ca ne marchait pas.
Le NoACK je t donné le code, il est pas juste?
Ben enlève-le maintenant. Il faut suivre le protocol à la lettre!LE stop g essaye de le rajouter parce que ca ne marchait pas.
J'en sais trop rien...Le NoACK je t donné le code, il est pas juste?
Il faudrait que je compare avec le code d'un de mes projets...
Mais à mon avis, ton code doit-être juste.
Essaye de faire des modifs au hasard au pire! Bon courage, à+
Envoyé par Sub0
Write(address) = write(0) : je lui demande qu'il m'envoie le mot a l'adresse 00 on est d'accord?
bonjour, Je reprend la programmation de mon eeprom apres 2mois d'abstinence, et je n'arrive toujours pas a regler mes problemes....Sub0 es tu encore la?
Merci
Salut!
Oui, je suis toujours là! J'ai trouvé du travail (webmaster), donc je suis moins dispo forcément...
Bref, je croyais que ton problème était résolu depuis l'temps... Que se passe-t-il?
Bah en fait je relis mon code que j'ai pas touche depuis 2 mois, et je comprends pas pourquoi j'arrive a ecrire dans cette eeprom mais je n'arrive pas a la lire.......un simple micro qui a 2 entrees sorties (SCL et SDA) reliées directement par bus i2c a l'eeprom.....dans la datasheet de l'eeprom y'a 3 modes de lecture, auaun ne fonctionne.....l'eeprom acquitte correctement les octets que je lui envoie mais apparement je n'arrive pas a recuperer ce qu'elle m'envoie enfin si elle me l'envoie bien.....
Slt! Je vois 2 possibilités d'erreur:
- Soit ton eprom n'est pas en mode lecture
- Soit ton prog aquite mal la lecture en série
L'aquitement n'est peut-être pas le même en lecture qu'en écriture.
Il faut se référer à la méthode proposée dans le datasheet...
Les fonctions de bases comme la reception et l'émission d'une donnée à l'eprom doivent être fonctionnelles.
On peut tester ces fonctions avec une lecture / écriture binaire de l'eprom.
Rappel:
DataOut (du pc vers l'eprom)
DataIn(de l'eprom vers le pc)
Pour l'écriture de l'eprom, seul l'envoi de données du pc vers l'eprom est nécessaire (DataOut).
Par contre, pour lire une donnée, l'eprom doit pouvoir envoyer la donnée vers le pc via DataIn.
Sur le bus I²C, DataIn a la même ligne que DataOut, mais le pc possède une adresse différente de celle de DataOut pour y accéder.
- programmer l'eprom en mode "envoi des données",
- programmer l'adresse à lire,
- cadencer l'emission de l'eprom avec la ligne CLock et lire DataIn au front montant ou descendant (voir datasheet).
- au même moment, le pc doit attendre la reception de donnée venant de DataIn,
- puis aquiter pour valider l'octet lu...
Partager