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 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()
Code : Tout sélectionner
SSPADD = 249;//20kHz à 40MHz
OpenI2C(MASTER,SLEW_OFF); // Setup MSSP for master I2C
it timer()
J'envoie en boucle à l'adresse "2" les données "4" et "6"
Code : Tout sélectionner
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()
Code : Tout sélectionner
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 it ()
it I2c()
Code : Tout sélectionner
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" dans SSPBUF, 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
}
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 :
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 !



