STM8L I2C config error
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

STM8L I2C config error



  1. #1
    invite4e8b483b

    STM8L I2C config error


    ------

    Bonjour,

    Je souhaite communiquer la donnée 0x55 d'une carte STM8L-Discovery vers une autre carte du même type afin de tester le protocole de communication I2C.
    Pour cela voici mon code :

    - Je choisis l'adresse 0x01 pour le MASTER
    - Je choisis l'adresse 0x11 pour le SLAVE

    Méthode :
    D'écrite dans les commentaires ci dessous.

    Ma question :
    Je teste la communication en me plaçant à la sortie du port SDA et SCL et je regarde à l'oscilloscope les trames passantes.
    Le problème c'est que mon code code tourne mais en sortie du port SCL(la clock), il n'y a pas de signal.
    Et même chose pour le port SDA, je choisis de communiquer la data 0x55 en hexa est donc je devrais voir sur mon oscilloscope la trame définit ainsi : 0 1 0 1 0 1 0 1 ...

    Est ce que mon code vous parait correct tout d'abord pour la comm i2c? Il y a t'il des modifications à apporter ?

    /***********************/
    Author : Meynadier Armand

    FlagStatus test=RESET;
    ErrorStatus testt=ERROR;
    int status; //chef flag pour l'i2c


    GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast); //GPIO_Mode_In_PU_No_IT
    GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Fast); //GPIO_Mode_In_PU_No_IT

    //clock synchro avec i2c1
    CLK_PeripheralClockConfig(CLK_ Peripheral_I2C1,ENABLE);


    //initialisation de la comm I2C, 1MHz, ack enable

    I2C_DeInit(I2C1);
    I2C_Init(I2C1, I2C_MAX_STANDARD_FREQ, 0x01, I2C_Mode_I2C ,I2C_DutyCycle_2,I2C_Ack_Enabl e,I2C_AcknowledgedAddress_7bit );


    //Activation de la comm du peripherique i2c
    I2C_Cmd(I2C1, ENABLE);

    while ( 1 )
    {


    //i2c comm
    // on vérifie que le port i2c est libre
    test=I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY);

    while (test==SET);

    //Envoyer la condition de depart de la comm
    I2C_GenerateSTART(I2C1, ENABLE);

    //on vérifie si le master mode est selectionné
    testt = I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT);
    while (testt==RESET);

    //adress du slave on donne la direction de la communication
    I2C_Send7bitAddress(I2C1, 0x11, I2C_Direction_Receiver );

    //on vérifie que le mode emetteur est selectionné
    testt = I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_M ODE_SELECTED);

    while (testt==RESET);


    //Envoie la donnée 55, à l'oscillo on aura 0 1 0 1 0 1 0 1 ...
    I2C_SendData(I2C1,0x55);

    //On vérifie que la donnée a été transféré
    testt = I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMIT TED);
    while (testt==RESET);

    //on stoppe la comm
    I2C_GenerateSTOP(I2C1, ENABLE);

    //on lit le registre de donné et on le stock dans un entier
    status=I2C_ReadRegister(I2C1, I2C_Register_DR);



    //on check si l'évènement a été recu
    //status=I2C_CheckEvent(I2C1,I2C _EVENT_SLAVE_BYTE_RECEIVED);
    }



    }

    /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

    -----

  2. #2
    invite4e8b483b

    Re : STM8L I2C config error

    Avez vous des éléments pour m'aider, car je me retrouve un peu bloqué actuellement ?

  3. #3
    invite71a6c60d

    Re : STM8L I2C config error

    tu as regarder le code source de ST dans la librarie qui s'appelle "I2C_DataExchange"?

  4. #4
    invite4e8b483b

    Re : STM8L I2C config error

    Je n'ai pas de librairie appelé ainsi dans mon code. Les librairies que j'utilise c'est :
    "stm8l15x_i2c.h" : là où j'ai trouvé toutes mes fonctions utilisés au dessus.

    Je ne trouve pas de code exemple sur internet et lorsque j'en trouve celui ci est faux ou incomplet.

    As tu déjà travaillé avec un stm8l discovery hulk69 ?

  5. A voir en vidéo sur Futura
  6. #5
    invite4e8b483b

    Re : STM8L I2C config error

    Je n'ai pas de librairie appelé ainsi dans mon code. Les librairies que j'utilise c'est :
    "stm8l15x_i2c.h" : là où j'ai trouvé toutes mes fonctions utilisés au dessus.

    Comment puis je obtenir cette librairie et est ce qu'elle est valable pour un stm8l ?

    Je ne trouve pas de code exemple sur internet et lorsque j'en trouve celui ci est faux ou incomplet.

    As tu déjà travaillé avec un stm8l discovery hulk69 ?

  7. #6
    invite71a6c60d

    Re : STM8L I2C config error

    ben oauis c'est mon boulot de bosser avec les STM8L


    telecharge ca et regarde dans les exemples:
    http://www.st.com/internet/com/SOFTW...periph_lib.zip


    Ne desepere pas ST offre les meilleurs example de code du marché. T'as juste a copier coller ce qu'il t'interesse...

  8. #7
    invite5637435c

    Re : STM8L I2C config error

    Citation Envoyé par hulk69 Voir le message
    Ne desepere pas ST offre les meilleurs example de code du marché. T'as juste a copier coller ce qu'il t'interesse...
    Et à comprendre un peu aussi, c'est mieux que la colle au final.

  9. #8
    invite4e8b483b

    Re : STM8L I2C config error

    Merci beaucoup pour les codes example, j'ai remarqué qu'il est très similaire au mien mais je vais tester avec les 2 cartes voir si le code fonctionne. Cependant lors de la compilation du code slave st j'ai un problème que vous avez peut être déjà rencontrer :

    je cite : ***ERROR 115 : INPAGE SEGMENT IS GREATER THAN 256 BYTES
    -SEGMENT: ?ZD0?STM8L15X_IT(STM8L15X_IT)

    ***ERROR 107 : ADDRESS SPACE OVERFLOW
    -SEGMENT: ?ZD0?STM8L15X_IT(STM8L15X_IT)

    IGNORED SEGMENT
    ?ZD0?STM8L15X_IT

    Avez vous une idée des paramètres à modifier concernant ces erreurs ?

  10. #9
    invite71a6c60d

    Re : STM8L I2C config error

    ouais ca veux dire que ya plus de place dans la memoire, mais panique pas voila 2 trucs a verifier dans les option de ton projet


    Nom : Project Settings.jpg
Affichages : 169
Taille : 66,7 Ko
    -

  11. #10
    invite4e8b483b

    Re : STM8L I2C config error

    Merci beaucoup, pour ta rapidité dans ta réponse et ta pertinence. J'ai également trouvé dans la datasheet du compilateur que pour résoudre un problème de mémoire on pouvait simplement ajouter dans le fichier interruption la ligne suivant : #pragma defaultGC(data) qui est en zeropage par défaut.

    Un de mes problèmes suivant était présent dans mon ancien code et dans le code master i2c : Je reste bloqué après la génération du start dans la ligne suivante :
    while (NumOfBytes);
    while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)==SET);

    En résumé le bus reste occupé en début de communication après l'initialisation de l'i2c étrange non ?
    Et sinon je trouve bizard qu'il n'y ait pas de GPIO init concernant les port SDA et SCL de l'i2c ?
    Qu'en penses tu ? Merci

  12. #11
    invite4e8b483b

    Re : STM8L I2C config error

    Premièrement il n'y a pas d'initialisation des port SDA et SCL par la commande GPIOInit.

    Deuxièmement il n'y a pas d'activation du périphérique I2C par la commande I2cCmd.

    Comment le programme d'interruption est t'il appelé ? Moi à ce que j'ai compris c'est lors de l'appel I2C_GenerateSTART(I2C1, ENABLE) ?
    Et lorsque je rentre dans mon programme d'interruption je rentre dans le switch (I2C_GetLastEvent(I2C1)) et je rentre dans le case : case I2C_EVENT_MASTER_MODE_SELECT : évènement EV5 du fichier stm8l15x_it.c puis je sort du switch et je revient dans la condition : while (NumOfBytes); et comme Numofbyte n'est pas décrémenté dans le case il est normal que je reste bloqué dans cette condition là.
    Mais quand est ce que je retourne dans mon programme d'interruption pour vérifier le case de l’évènement EV6 à savoir : case I2C_EVENT_MASTER_TRANSMITTER_M ODE_SELECTED: ??
    Pour moi il serait logique que le programme d'interruption se rappel lui même jusqu'à ce que la communication soit terminé cependant je ne comprends pas le fonctionnement, il ne re-rentre jamais dans le switch et donc ne décrémente jamais NumofByte et donc reste bloqué indéfiniment car la condition while (NumOfBytes) reste toujours vrai !

    J’espère avoir été clair mais c'est pas facile à expliquer par écrit, sa devient spécifique mais pour moi le code contient des bugs et ne peut pas fonctionner ainsi ?

  13. #12
    invite71a6c60d

    Re : STM8L I2C config error

    escuse tu pourrais pas mettre tout ton code en piece jointe j'ai un mal de chien a visualiser ton probleme

  14. #13
    invite4e8b483b

    Re : STM8L I2C config error

    En fait, j'ai optimisé mon code car j'avais des problèmes avec le code fournis par st qui ne fonctionnait pas. J'ai donc repris les étapes de fonctionnement mais j'essaye maintenant de faire une communication entre un accéléromètre et la carte discovery ST8 :
    Voici le code assez simplifié pour rendre les tests plus pratique, peux tu me dire ce que tu en penses, car j'ai des problèmes de com i2c comme d'habitude :s. Comment choisir l'adresse du slave par exemple sa dépend du caractéristique du périphérique avec lequel tu communiques non ? En fait c'est le mode master receiver qui ne fonctionne pas. As tu des idées ?

    Merci beaucoup pour ton temps.

    /**
    ****************************** ****************************** ******************
    * @file main.c
    * @author Microcontroller Division
    * @version V1.2.0
    * @date 09/2010
    * @brief Main program body
    ****************************** ****************************** ******************
    * @copy
    *
    * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
    * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
    * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
    * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
    * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
    * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
    *
    * <h2><center>&copy; COPYRIGHT 2010 STMicroelectronics</center></h2>
    */

    /* Includes ------------------------------------------------------------------*/
    #include "stm8l15x.h"
    #include "stm8l_discovery_lcd.h"
    #include "discover_board.h"
    #include "icc_measure.h"
    #include "discover_functions.h"
    #include "stdio.h"
    #include "stm8l15x_tim3.h"
    #include "max7219.h"
    #include "stm8l15x_i2c.h"

    /* Set in interrupt handler for indicate that user button is pressed */
    extern bool KeyPressed;
    int compte=0;
    uint8_t state_machine;
    uint8_t donnee=0x00;
    int temp=0;
    ErrorStatus temp1;


    /**
    * @brief main entry point.
    * @par Parameters None
    * @retval void None
    * @par Required preconditions: None
    */

    int main(void)
    {

    /* Init I/O ports */

    GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Fast);
    /*SDA pin init*/
    GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);


    /*Initialisation I2C*/
    CLK_PeripheralClockConfig(CLK_ Peripheral_I2C1, ENABLE);

    CLK_SYSCLKDivConfig(CLK_SYSCLK Div_1);

    I2C_Cmd(I2C1, ENABLE);
    I2C_Init(I2C1, I2C_MAX_STANDARD_FREQ, 0xA0, I2C_Mode_I2C ,I2C_DutyCycle_2,I2C_Ack_Enabl e,I2C_AcknowledgedAddress_7bit ); //100 KHz
    //I2C_AcknowledgeConfig(I2C1,ENA BLE);
    //I2C_ITConfig(I2C_TypeDef* I2Cx, I2C_IT_TypeDef I2C_IT, FunctionalState NewState)
    //enableInterrupts();

    while (1)
    {
    //////---------------------------- Mode MASTER TRANSMITTER ---------------------///////////
    /*I2C_GenerateSTART(I2C1, ENABLE);//start communication from master
    while(!I2C_CheckEvent(I2C1,I2C _EVENT_MASTER_MODE_SELECT));// check master mode (start bit ok?)


    I2C_Send7bitAddress(I2C1, 0x18 , I2C_Direction_Transmitter);


    //while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR));///!!!!\\\\ PROBLEME ENVOI de ADRESSE ESCLAVE


    while(I2C_CheckEvent(I2C1,I2C_ EVENT_MASTER_TRANSMITTER_MODE_ SELECTED)==ERROR);//Check acquittement

    while(temp!=10000000)
    {
    I2C_SendData(I2C1, 0x55);
    temp++;
    }

    while(!I2C_CheckEvent(I2C1,I2C _EVENT_MASTER_BYTE_TRANSMITTED ));//check BYTE transmittion

    I2C_GenerateSTOP(I2C1,ENABLE);// stop communication from master*/

    //////---------------------------- Mode MASTER Receiver ---------------------///////////

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

    I2C_GenerateSTART(I2C1, ENABLE);

    while(!I2C_CheckEvent(I2C1,I2C _EVENT_MASTER_MODE_SELECT));// check master mode (start bit ok?)

    I2C_Send7bitAddress(I2C1, 0x31 , I2C_Direction_Receiver);
    while(!I2C_CheckEvent(I2C1,I2C _EVENT_MASTER_RECEIVER_MODE_SE LECTED));//Check transmitter mode of MASTER

    while(!I2C_CheckEvent(I2C1,I2C _EVENT_MASTER_BYTE_RECEIVED));//check data received from slave
    donnee = I2C_ReceiveData(I2C1);//get the data

    I2C_GenerateSTOP(I2C1,ENABLE);
    }
    return 0;
    }
    /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/

  15. #14
    invite4e8b483b

    Re : STM8L I2C config error

    Bonjour,

    J'ai pu avancer dans mes tests(comm MASTER->SLAVE(Accéléromètre LIS3DH)) et lors de l'envoie, la condition de start est respecté et la trame est envoyé. Le seul problème c'est la condition qui vérifie que la trame a bien été transmise et recu par le slave. C'est à dire le bit ACK(d'aquittement) qui pose problème. A tu des idées concernant ce sujet ?

    Merci pour ton précieux temps,

  16. #15
    invite0dc67c1e

    Re : STM8L I2C config error

    Salut
    Pour les interruptions, suis ce qui suit
    J'ai ce lien, tu peux telecharger dans la partie FirmWare : Developping and Debugging ....
    Dans le fichier zip, tu as STM8L-Discovery/Project/Discover/src/stm8l15x_it.c
    Ce fichier est le fichier à inclure pour tes interruptions.
    A toi de remplir la partie : INTERRUPT_HANDLER(I2C1_IRQHand ler,29)

    N'hesites pas si tu as d'autres questions concernant cela...
    Bon courage!!

Discussions similaires

  1. Compatibilité I2C & I2C Fast Mode
    Par invite98ee67b3 dans le forum Électronique
    Réponses: 3
    Dernier message: 20/06/2012, 14h48
  2. simulink error
    Par invitefbd123a4 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 15/04/2008, 16h38
  3. Config BUS I2C Pic18F252
    Par invited952a9a0 dans le forum Électronique
    Réponses: 2
    Dernier message: 08/04/2007, 10h15
  4. Error safe
    Par inviteddcb258a dans le forum Internet - Réseau - Sécurité générale
    Réponses: 7
    Dernier message: 15/05/2006, 18h48
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...