Bonjour,
J'utilise MPLAB ICD2 v7.30 et mcc18 comme compilateur
Des PIC 18F4580
Résistances pull up : 2kohm.
J'avais des 10k, mais pour avoir plus de chances, j'ai baissé.
Le but de mon projet est de faire une interface entre 2 bus CAN.
J'ai donc :
BUS CAN1 <--> PIC1 <--> BUS I2C <--> PIC2 <--> BUS CAN2
Mon BUS CAN, il fonctionne très bien depuis des années, mais l'I2C... j'ai du mal, et ça dure longtemps.
Merci donc pour votre aide.
Pour débuter, je voudrais que le maitre envoi une donnée à l'esclave.
Ce serait déjà un bon début.
Après, je voudrais que sur it timer, il dise soit :
-"voici un message CAN pour toi : "id, taille, data[4]"
Soit :
-"combien de messages CAN as tu à me donner ?" et "donne le(s) moi si tu en as"
Donc, pour commencer :
L'adresse d'esclave est 2.
La vitesse est très lente pour avoir un max de chance que ça fonctionne.
PS désolé, les tabulations ne tombent plus juste avec le copié collé.
Code du maitre :
main()
it timer()Code:SSPADD = 249;//20kHz à 40MHz OpenI2C(MASTER,SLEW_OFF); // Setup MSSP for master I2C
J'envoie en boucle à l'adresse "2" les données "4" et "6"
Code:IdleI2C(); // ensure module is idle SSPCON2bits.SEN = 1; // initiate bus start condition while(SSPCON2bits.SEN); // wait until start condition is over SSPBUF = 2; //adresse de l'esclave (2 pour écrire, 3 pour lire) while( SSPSTATbits.BF ); // wait until write cycle is complete IdleI2C(); SSPCON2bits.RSEN = 1; // initiate bus restart condition while ( SSPCON2bits.RSEN ); // wait until re-start condition is over SSPBUF = 4; //donnée à envoyer while( SSPSTATbits.BF ); // wait until write cycle is complete IdleI2C(); SSPCON2bits.RSEN = 1; // initiate bus restart condition while ( SSPCON2bits.RSEN ); // wait until re-start condition is over SSPBUF = 6; //une autre donnée à envoyer while( SSPSTATbits.BF ); // wait until write cycle is complete IdleI2C(); SSPCON2bits.PEN = 1; // initiate bus stop condition while ( SSPCON2bits.PEN ); // wait until stop condition is over
Code de l'esclave :
main()
it ()Code:SSPADD = 2; //adresse de l'esclave --> paire pour écrire(2), impaire pour lire (3) OpenI2C(SLAVE_7,SLEW_OFF); // Setup MSSP for slave I2C PIE1bits.SSPIE =1; // Master Synchronous Serial Port Interrupt Enable bit
Donc voila, comme il y a toujours "2" dans le buffer de reception de l'esclave, soit son adresse, j'ai essayé ça pour que le maitre puisse recharger le buffer :Code:if( PIR1bits.SSPIF) //it Master Synchronous Serial Port Interrupt Flag bit { //1 = The transmission/reception is complete (must be cleared in software) //0 = Waiting to transmit/receive donnees_it[0] = 26; donnees_it[1] = SSPBUF; ecriremessageCAN(46,&donnees_it[0],2,DONNEE);--> cette fonction envoie sur le bus CAN la valeur du buffer de reception SSPBUF (les "26" et "46" ne sont que des identifiants) --> ici, j'ai bien le "2" envoyé par le maitre dans SSPBUF --> j'ai essayé de mettre PIR1bits.SSPIF à 0 ici, mais ça ne donne rien de mieux... SSPCON2bits.ACKDT = 0; // set acknowledge bit state for ACK, je suis prêt à recevoir la prochaine donnée... SSPCON2bits.ACKEN = 1; // initiate bus acknowledge sequence --> à mon avis, le problème vient d'ici, il me manque le "truc" pour passer à la donnée suivante temporisation20Microsecondes();temporisation5Microsecondes(); donnees_it[0] = 26; donnees_it[1] = SSPBUF; ecriremessageCAN(46,&donnees_it[0],2,DONNEE); --> j'ai toujours le "2", alors que je devrais avoir le "4" que le maitre a envoyé... SSPCON2bits.ACKDT = 0; // set acknowledge bit state for ACK, je suis prêt à recevoir la prochaine donnée... SSPCON2bits.ACKEN = 1; // initiate bus acknowledge sequence temporisation20Microsecondes();temporisation5Microsecondes(); donnees_it[0] = 26; donnees_it[1] = SSPBUF; ecriremessageCAN(46,&donnees_it[0],2,DONNEE); --> pareil j'ai toujours le "2", alors que je devrais avoir le "6" que le maitre a envoyé... SSPCON2bits.ACKDT = 0; // set acknowledge bit state for ACK, je suis prêt à recevoir la prochaine donnée... SSPCON2bits.ACKEN = 1; // initiate bus acknowledge sequence temporisation20Microsecondes();temporisation5Microsecondes(); donnees_it[0] = 27;//debug donnees_it[1] = j++; ecriremessageCAN(46,&donnees_it[0],2,DONNEE); --> j'ai bien de temps en temps j="0" "1" "2" "3" etc... --> ca me permets de compter ne nombre de messages reçus --> mais la donné reçue est toujours le même "2" PIR1bits.SSPIF = 0; // on ré-autorise l'interruption }
SSPSTATbits.BF = 0;//SSPBUF doit être lu afin de remettre BF à 0.
Mais ca ne change rien.
Avec ce code, l'esclave reçoit
"2" "2" "2" "0" au lieu de "2" "4" "6" "0"
"2" "2" "2" "1" au lieu de "2" "4" "6" "1"
"2" "2" "2" "2" au lieu de "2" "4" "6" "2"
"2" "2" "2" "3" au lieu de "2" "4" "6" "3"
"2" "2" "2" "4" au lieu de "2" "4" "6" "4"
"2" "2" "2" "5" au lieu de "2" "4" "6" "5"
"2" "2" "2" "6" au lieu de "2" "4" "6" "6"
etc...
Donc merci pour votre aide !
-----