Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur resistance de pull-up pour de l'I2C

    15 août 2020 à 15:01:02


    Bonjour,


    Je souhaite m'entraîner à coder les parties bas niveaux sur de l'I2C sur un STM32F407.


    J'ai un STM32F407 et je veux communiquer avec une RTC DS3231.


    Je voudrais si possible ne pas utiliser de pull-up externe dans mon circuit (un peu contraignant sur carte).


    En regardant la documentation constructeur de mon micro, j'ai remarqué que les pull up internes varient entre 30kOhms et 50kOhms.


    Sur la documentation constructeur du DS3231, il est noté que les résistances de pull-up : Rpu doivent être égales à Tr/Cb.

    Rpu=Tr/Cb

    :

    - Tr : Rise Time of Both SDA and SCL Signals (20ns à 300ns)

    - Cb : Capacitive Load for Each Bus Line (XXX à 400pF)


    En faisant le calcul, je vois que si on part du principe que Cb est tout le temps égal à 400pF, mes Rpu sont censées varier entre 50Ohms et 750Ohms. du coup vis-à-vis des pull-up de la datasheet du STM32F407, ça me fait un peu mal au cul !


    Vu que je ne sais absolument pas la valeur du Cb dans mon cas qui je suppose dépend complètement du circuit, et que je n'ai pas d'oscilloscope pour m'aider en cas de problème. Je voudrais savoir comment faire en sorte que avec une résistance de 50kOhms, j'ai une communication fonctionnels électriquement entre le STM et le DS3231.

    En faisant le calcul inverse, Tr=Rpu*Cb = 50 000 * 400E-12 = 20µs. Du coup je ne respecte même plus la datasheet du DS3231 qui au minimum est censé avoir 20ns de temps de monté.

    Pour le moment, je n'ai pas testé de communication sur le bus. J'essaie déjà de savoir si la communication est faisable. Le but étant de tester mon code (qui risque fortement de ne pas marcher du premier coup).

    Alors mes questions :

    1. Avez vous été déjà confronté à ce genre de problème et quelles solutions peuvent être utilisées sur ce genre de problèmes ?

    2. Est-ce que je me prends trop la tête, et que juste en essayant de réduire la vitesse de mon bus un peu (par exemple passer de 100kHz à supposons 50kHz) cela passerait très bien ?


    Merci d'avance et bonne journée !

    -
    Edité par heryz 15 août 2020 à 15:27:32

    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2020 à 22:21:54

      Bonsoir,

      les valeurs de Pull-up sont bien détaillées dans https://fr.wikipedia.org/wiki/I2C

      • Partager sur Facebook
      • Partager sur Twitter
        15 août 2020 à 22:41:53

        Bonsoir.

        Au final j'ai testé mon bus I2C dans l'après midi.

        Bien que la valeur des pull-up utilisées soit beaucoup trop grande par rapport à ce qui est indiqué dans les datasheets du DS3231, du STM2 et ce qui est noté sur ton article de wikipedia, j'ai quand même réussi à maintenir une communication fonctionnelle avec la RTC sans avoir a réduire la vitesse de la SCL.

        Mon but était simplement d'être capable de communiquer sur un bus I2C et pas forcément de faire le circuit le plus fiable possible.

        Merci pour ta réponse !

        • Partager sur Facebook
        • Partager sur Twitter
          19 août 2020 à 11:08:34

          Le Cb dépend de ce que tu branches sur ton bus I2C.

          Dans ton cas, il s'agit de la capacité d'entrée d'une pin de ton STM plus la capacité d'entrée du DS3231.

          La doc du STM indique 5pF tandis que la doc du DS3231 indique 10pF typique, ce qui fait 15pF au total.

          A noter qu'il s'agit d'une valeur typique et non d'un max donc il faudrait prendre un peu de sécurité pour compenser la disparité des composants.

          Si tes pistes SCL/SDA sont longues, il faudrait aussi en tenir compte dans le calcul mais si la distance est courte, ce sera négligeable.

          Au final, ça reste bien plus faible que les 400pF maxi supportable par les chip donc ça explique pourquoi tu peux te permettre de mettre une résistance plus élevée que la classique 2.2k préconisée.

          Mais avoir 50k de pull up pour un bus à 100kHz, ça me parait très ambitieux, tu risques d'avoir de nombreuses erreur de communication.

          Je te conseille vivement de réduire drastiquement la vitesse.

          Vu que tu prends une résistance 20x supérieur à la classique 2.2k préconisée, il paraitrait logique de diviser par 20 la fréquence pour compenser, soit un bus à 5kHz au lieux de 100kHz.

          -
          Edité par lorrio 19 août 2020 à 11:09:59

          • Partager sur Facebook
          • Partager sur Twitter

          Question sur resistance de pull-up pour de l'I2C

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown