Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #15 on: November 23, 2012, 08:33:22 pm » |
J'ai indiquer dans le premier poste que je travaillais en 8 bit, Sinon dans ton code ne donne pas plus de résultat, et tu a inverser l'état des broche cs vu que ses du wire 3, J'ai découvert qu'il y avais une autre appelle a faire lors de wire Write Operation: Enable device via chip select high Send write enable op code ****************************** Disable device via chip select low Enable device via chip select high Send write op code with address Send data byte/word Write cycle begins Disable device via chip select low
La ligne que j'ai indiquer fait référence a EWEN |1|00|11XXXXX|11XXXX| Write enable must precede all | programming modes dans le datasheet Sinon grand merci a B@tto car tu ma fais découvrir l'utilisation de Bitwise Operators, Je vais continuer de m'acharner pour faire fonctionner cette eeprom.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #16 on: November 23, 2012, 09:28:41 pm » |
j'ai travailler sur la base de ton code, voici se que j'ai obtenu void Read(int adresse)//lecture { long Command=0b110<<7; Command|=adresse; Serial.print(" "); Serial.println(Command,BIN); digitalWrite(cs,HIGH); delay(10); SPI.transfer(Command); data=SPI.transfer(0); digitalWrite(cs,LOW); }
void Write(int adresse,int donnees)//écriture { long Command=0b010<<8; Command|=adresse; Serial.print(Command,BIN); Serial.print(" "); digitalWrite(cs,HIGH); delay(10); SPI.transfer(Command); SPI.transfer(donnees); digitalWrite(cs,LOW); } j'ai donc ceci qui s'affiche 1000110010 1100110010 247 247 247 ...
théoriquement il devrais m'envoyer 100 comme valeur, donc si quelqu'un a une explication ?
|
|
|
|
|
Logged
|
|
|
|
|
Ales
Offline
Edison Member
Karma: 7
Posts: 1668
Do or DIY
|
 |
« Reply #17 on: November 24, 2012, 06:14:38 am » |
A mon avis ça vient de la le problème SPI.transfer(Command); SPI.transfer(donnees);
imagine du envoi la donnée 2 : ça va faire 10 au lieu de 00000010 Il faut faire comme je l'avais fait, décaler command et ajouter données et envoyer le tout
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #18 on: November 24, 2012, 08:33:16 am » |
J'ai refait le code mais cette fois si en rajoutent Ewen qui est a mettre selon la documentation et toujours aucun changement. void Write(int adresse,int donnees)//écriture { long Ewen = 0b0011000000;
long Command=0b010<<8; Command|=adresse; Command<<=8; Command|=donnees; Serial.print(Command,BIN); Serial.print(" "); digitalWrite(cs,HIGH); delay(10); SPI.transfer(Ewen); SPI.transfer(0x01); digitalWrite(cs,LOW); digitalWrite(cs,HIGH); delay(10); SPI.transfer(Command); digitalWrite(cs,LOW); }
Voici ce que j'ai dans la console. 100011000101100100 1100110001 247 247 247 ...
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 12
Posts: 1803
There is an Arduino for that
|
 |
« Reply #19 on: November 24, 2012, 09:06:08 am » |
Une lecture attentive de la doc de l'EEPROM et de la doc de la librairie SPI montre que les deux ne peuvent pas coucher ensemble. L'EEPROM attend des paramètres sur 10bits en entrée alors que la méthode transfer() de la librairie SPI manipule des octets Il va falloir que tu écrives ta propre librairie pour supporter ta mémoire. C'est pas super compliqué mais par contre tu ne pourras pas utiliser le SPI matériel. Du coup cela te permets de connecter la mémoire sur n'importe quelle IO. En fait, il faut bien voir, que le SPI n'est pas du tout standardisé comme l'I²C ou le RS232 par exemple. Et du coup chaque fabricant l'implémente comme il l'entend. Utiliser le SPI c'est un peu partir à l'aventure. Alors laisse s'exprimer l'explorateur qui dort en toi.....
|
|
|
|
« Last Edit: November 24, 2012, 09:15:36 am by fdufnews »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #20 on: November 25, 2012, 03:21:51 am » |
Pour ce qui est d'une lecture attentive de la doc de l'eeprom, je n'arrête pas de la lire je la connais par cœur pratiquement, Pour ce qui est du spi, Je savais déjà que d'un matériel a l'autre sa variait, mais j'ai lu aussi que l'arduino n'étais pas limitée a 8 bit pour le protocole spi, Donc avant de prendre ce dernier poste pour argent contant j'espère que j'aurais confirmation ou pas dans les prochain poste.
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 12
Posts: 1803
There is an Arduino for that
|
 |
« Reply #21 on: November 25, 2012, 04:52:27 am » |
Donc avant de prendre ce dernier poste pour argent contant j'espère que j'aurais confirmation ou pas dans les prochain poste. La bonne démarche c'est d'ouvrir la doc de l'atmega, pas d'attendre que quelqu'un le fasse pour toi. Mais bon un extrait: 8-bit Microcontroller with 4/8/16/32K Bytes In-System Programmable Flash ATmega48PA, ATmega88PA, ATmega168PA, ATmega328P chapitre 18. SPI – Serial Peripheral InterfaceWhen configured as a Master, the SPI interface has no automatic control of the SS line. This must be handled by user software before communication can start. When this is done, writing a byte to the SPI Data Register starts the SPI clock generator, and the hardware shifts the eight bits into the Slave. After shifting one byte, the SPI clock generator stops, setting the end of Transmission Flag (SPIF). If the SPI Interrupt Enable bit (SPIE) in the SPCR Register is set, an interrupt is requested. The Master may continue to shift the next byte by writing it into SPDR, or signal the end of packet by pulling high the Slave Select, SS line. The last incoming byte will be kept in the Buffer Register for later use.
Jusqu'à preuve du contraire la doc Atmel ne parle que de byte. Libre à toi de croire ce que tu veux. Si tu veux, tu peux aller voir les illustration de la doc. Les registres font 8 bits et il n'y a pas d'option pour changer ça.
|
|
|
|
« Last Edit: November 25, 2012, 04:57:24 am by fdufnews »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #22 on: November 25, 2012, 05:48:37 am » |
Si je comprend bien alors on ne peu envoyer que des packet de 8 bit donc un octet, La documentation ATMega ne mets pas venu a l'esprit car je pensais que c'était la libraire SPI faite pour le projet Arduino qui gérais le protocole,
Si je comprend bien la situation dans la quelle je suis si je veux utiliser c'est eeprom de marque Atmel je vais devoirs émuler mon propre signal SPI,
Sa métone quand même car le Microcontroleur et les eeproms sont tout deux produite par Atmel, et pourtant si peu de compatibilité .
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
God Member
Karma: 2
Posts: 905
|
 |
« Reply #23 on: November 25, 2012, 06:00:56 am » |
Bonjour Sa métone quand même car le Microcontroleur et les eeproms sont tout deux produite par Atmel, et pourtant si peu de compatibilité Les 93C46 sont des composants anciens qui se vendent encore pour la maintenance. Atmel produit son '93C46' en 'seconde source' de Microchip qui l'a introduit (avant 1995) comme EEPROM au bus Microwire, lequel bus est un SPI simplifé 'maison' de Microchip.... Demander aux micros actuels la rétro-compatibilité avec les puces (plus ou moins SPI) d'il y 20 ans est sans toute excessif ! Pas étonnant donc qu'il soit nécessaire de faire du 'sur mesure' Certains (AVR mais pas Arduino) s'y sont déjà frottés avec semble t-il , finalement, succès : http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=93203&postdays=0&postorder=asc&start=20&sid=41c2fc377e0f3fe678cdc9233759f51f
|
|
|
|
« Last Edit: November 25, 2012, 06:44:38 am by al1fch »
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 12
Posts: 1803
There is an Arduino for that
|
 |
« Reply #24 on: November 25, 2012, 06:39:58 am » |
je vais devoirs émuler mon propre signal SPI, Je te suggères de partir de wiring_shift.c qui se trouve dans les fichiers sources de l'arduino, hardware/arduino/cores/arduino. La librairie fonctionne avec des uint8_t (des byte) et peut facilement être adaptée. Il faut modifier shiftOut pour avoir en entrée un unsigned int en ne décalant que 10 bits évidemment. Pour la lecture il faut reprendre la fonctionne shiftIn et lui faire lire un bit supplémentaire que l'on rejette car il y a un 0 bidon en début de cycle de lecture de cette mémoire. Edit : J'oubliais, il faut renommer les fonctions sinon il va y avoir un conflit avec la librairie originale.
|
|
|
|
« Last Edit: November 25, 2012, 06:41:32 am by fdufnews »
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #25 on: November 25, 2012, 08:06:15 am » |
Oui je vais partir de la modification de shiftin et out, Le problème c'est que je ne sais pas ou ses deux fonctions sont appeler, donc je vais plutôt faire une copie de l'ide et le modifier directement.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #26 on: November 25, 2012, 08:36:19 am » |
voici les modification que j'ai faite la compilation fonctionne, mais j'ai exactement le même résultat que j'avais avant . unsigned int shiftIn(unsigned int dataPin, unsigned int clockPin, unsigned int bitOrder) { unsigned int value = 0; uint8_t i;
for (i = 0; i < 10; ++i) { digitalWrite(clockPin, HIGH); if (bitOrder == LSBFIRST) value |= digitalRead(dataPin) << i; else value |= digitalRead(dataPin) << (9 - i); digitalWrite(clockPin, LOW); } return value; }
void shiftOut(unsigned int dataPin, unsigned int clockPin, unsigned int bitOrder, unsigned int val) { uint8_t i;
for (i = 0; i < 10; i++) { if (bitOrder == LSBFIRST) digitalWrite(dataPin, !!(val & (1 << i))); else digitalWrite(dataPin, !!(val & (1 << (7 - i)))); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); } }
Je commence a perdre espoirs a l'idée de pouvoir utiliser cet eeprom.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 218
|
 |
« Reply #27 on: November 25, 2012, 08:53:20 am » |
Salut, Je n'ai pas de quoi tester, mais une petite recherche chez l'ami Google donne quelques résultats, dont celui-ci. ++
|
|
|
|
|
Logged
|
|
|
|
|
France
Offline
Edison Member
Karma: 12
Posts: 1803
There is an Arduino for that
|
 |
« Reply #28 on: November 25, 2012, 10:00:08 am » |
voici les modification que j'ai faite la compilation fonctionne, mais j'ai exactement le même résultat que j'avais avant .
Sans le bout de programme qui appelle ces fonctions on ne peut pas trop t'aider.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 104
|
 |
« Reply #29 on: November 25, 2012, 11:29:09 am » |
Ce lien est très intéressent, par contre le code a été coder pour quoi ? car l'ide de l'Arduino indique des erreurs a la compilation. #include <avr/io.h> Pour quelle architecture de développement a été fais ce programme ? Sinon pour répondre au dernier poste je ne sais pas ou sont faite les appelles de ses fonction je sais juste que elle est déclarée dans wiring.h et quelle sont utiliser pour la libraire spi mais a par sa j'ai rien trouver, j'ai juste suivi le conseille d'adapter le type de variable et la nombre de bit envoyer pour ses deux fonctions. wiring.h void shiftOut(unsigned int dataPin, unsigned int clockPin, unsigned int bitOrder, unsigned int val); unsigned int shiftIn(unsigned int dataPin, unsigned int clockPin, unsigned int bitOrder);
|
|
|
|
« Last Edit: November 25, 2012, 11:31:15 am by lacolombenoir »
|
Logged
|
|
|
|
|
|