[Programmation] Liaison I2C entre deux PIC (Maître -Esclace)
Répondre à la discussion
Affichage des résultats 1 à 1 sur 1

Liaison I2C entre deux PIC (Maître -Esclace)



  1. #1
    clocloo

    Liaison I2C entre deux PIC (Maître -Esclace)


    ------

    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()
    Code:
    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:
    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:
    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 ()
    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
    }
    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 !

    -----
    Dernière modification par Antoane ; 02/05/2016 à 11h01. Motif: Déterrage -> Création d'une nouvelle discussion

Discussions similaires

  1. Liaison série entre deux µC via IR
    Par fdamien12 dans le forum Électronique
    Réponses: 5
    Dernier message: 06/09/2011, 18h09
  2. Transaction I2C entre deux pics 18f4550 (maître-esclave)
    Par lynal1 dans le forum Électronique
    Réponses: 9
    Dernier message: 12/04/2011, 14h17
  3. [PIC18 - Liaison SPI] - Envoi données Maitre > Esclave / Esclave vers Maitre
    Par jorg1n dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 12/01/2011, 16h45
  4. Liaison I2C entre deux PIC (Maître -Esclace)
    Par invite0c16129b dans le forum Électronique
    Réponses: 3
    Dernier message: 14/04/2010, 16h38
Découvrez nos comparatifs produits sur l'informatique et les technologies.