using both i2c interfaces on stm32f104c8t6
Posted: Tue Sep 20, 2022 5:10 pm
Good morning/evening to everyone. to those that will spare time to read this, you already have my thanks.
As a little exprerienced beginner in programmed electronics, I have the following problem :
I need to read in real time the data from 4 different accelerometers (MPU6050 as they are collecting dust in the drawer). The MPU6050 alreay contains a pin to select between 2 adressses (0x68 by default and 0x69 if ad0 is pulled up to vcc), but as I need to dialog with 4 I will need that my MCU communicates with 2 separate i2c buses as a master to collect the data (not to mention my need to ad an SPI communication to ad data-logging on an SD card).
I personally have 3 different type microcontrollers boards on hand :
-(4 in total) genuine arduino unos, but it seems that interfacing two i2c buses isn't possible
- a STM32F104C8T6 based blue pill board (a cheap chinese one, I bought it out of curiosity of the abilities of the board), that seems to feature 2 separate buses but I don't find how to use them separately
- a STM32F405 based genuine pyboard (runs micropython) : I know that it would work on it as I already used it when interfacing a single mpu6050 last year, but I don't really like python programming, using putty for interface doesn't give much help when debugging
My question is : how can I set up both i2c interfaces on the STM32F104C8T6 using the arduino ide to interact with two separate couples of accelerometers, and can I set the bus frequency to increase data rate ?
I wouldn't like to use an i2c multiplexer as it will ad complexity in the circuit and slow down the communication, my goal is to acheive the fastest data rate for the 4 accelerometers to decrease integration errors.
little note : I don't use librairies (out of the base for i2c communication) and instead directly write in the setting registers and read from the data registers of the MPU(s), as such I really know what's going on, and it's easier to purposefully set-up a sensor that way, and decrese program size.
Thanks a lot to those who will spare some time to read this and help me for this specific issue.
(french translation)
Bonjour/bonsoir à tous. A ceux qui prendrons du temps pour lire ceci, vous avez ,mes remerciements.
En tant que débutant dégrossi en électronique programmée, j'ai le problème suivant :
J'ai besoin de lire les données en temps réel de 4 accéléromètres (MPU6050 en l'occurrence vu que je les avait dans le tiroir). Les MPU6050 possèdent une broche pour choisir parmi deux adresses i2c (0x68 par défaut et 0x69 si la broche ad0 et tirée au vcc), mais vu que j'ai besoin de dialoguer avec 4 capteurs, je vais avoir besoin de deux bus I2C séparés, en tant que maître, pour récupérer les données (sans parler de la nécessité d'une communication SPI pour l'enregistrement des données sur carte SD).
Je dispose de trois type de cartes à microcontrôleur :
-(4) arduino unos officielles, mais il semble qu'interfacer 2 bus i2c est impossible
- une carte blue pill, basée sur le STM32F104C8T6 (une chinoise, je 'avais achetée par curiosité), il semblerait qu'elle comporte deux bus i2c séparés mais je trouve pas comment les configurer séparément.
- une pyboard officielle, basée sur STM32F405, tournant sous micropython : je sais qu'elle ferait l'affaire, vu que j'ai déjà réussi à dialoguer avec une MPU6050 l'année dernière, mais je n'aime pas vraiment la programmation sous micropython, l'interface de putty n'aide pas beaucoup pour le débuggage.
Ma question est : Comment pourrais-je activer les deucx bus I2C du STM32F104C8T6 via l'IDE d'arduino pour ialoguer avec les deux couples d'accéléromètres, et est-il possible de fixer la fréquence du bus pour augmenter le débit de données ?
Je voudrais éviter l'utilisation d'un multiplexeur i2c, pour limiter la complexité du circuit et éviter de ralentir la communication : atteindre la communication la plus rapide est nécessaire pour limiter les erreurs d'intégration).
Un granbd merci à tous ceux qui prendrons de leur temps pour lire ceci et m'aiderons dans mon projet.
PS j'évite l'utilisation de bibliothèques, en-dehors du nécessaire pour la communication i2c, j'écris directement dans les registres de configuration et lis dans ceux de données des MPU, je sais ainsi ce qui se passe, je peux ajuster les réglages des capteurs, et je limite la taille du programme.
As a little exprerienced beginner in programmed electronics, I have the following problem :
I need to read in real time the data from 4 different accelerometers (MPU6050 as they are collecting dust in the drawer). The MPU6050 alreay contains a pin to select between 2 adressses (0x68 by default and 0x69 if ad0 is pulled up to vcc), but as I need to dialog with 4 I will need that my MCU communicates with 2 separate i2c buses as a master to collect the data (not to mention my need to ad an SPI communication to ad data-logging on an SD card).
I personally have 3 different type microcontrollers boards on hand :
-(4 in total) genuine arduino unos, but it seems that interfacing two i2c buses isn't possible
- a STM32F104C8T6 based blue pill board (a cheap chinese one, I bought it out of curiosity of the abilities of the board), that seems to feature 2 separate buses but I don't find how to use them separately
- a STM32F405 based genuine pyboard (runs micropython) : I know that it would work on it as I already used it when interfacing a single mpu6050 last year, but I don't really like python programming, using putty for interface doesn't give much help when debugging
My question is : how can I set up both i2c interfaces on the STM32F104C8T6 using the arduino ide to interact with two separate couples of accelerometers, and can I set the bus frequency to increase data rate ?
I wouldn't like to use an i2c multiplexer as it will ad complexity in the circuit and slow down the communication, my goal is to acheive the fastest data rate for the 4 accelerometers to decrease integration errors.
little note : I don't use librairies (out of the base for i2c communication) and instead directly write in the setting registers and read from the data registers of the MPU(s), as such I really know what's going on, and it's easier to purposefully set-up a sensor that way, and decrese program size.
Thanks a lot to those who will spare some time to read this and help me for this specific issue.
(french translation)
Bonjour/bonsoir à tous. A ceux qui prendrons du temps pour lire ceci, vous avez ,mes remerciements.
En tant que débutant dégrossi en électronique programmée, j'ai le problème suivant :
J'ai besoin de lire les données en temps réel de 4 accéléromètres (MPU6050 en l'occurrence vu que je les avait dans le tiroir). Les MPU6050 possèdent une broche pour choisir parmi deux adresses i2c (0x68 par défaut et 0x69 si la broche ad0 et tirée au vcc), mais vu que j'ai besoin de dialoguer avec 4 capteurs, je vais avoir besoin de deux bus I2C séparés, en tant que maître, pour récupérer les données (sans parler de la nécessité d'une communication SPI pour l'enregistrement des données sur carte SD).
Je dispose de trois type de cartes à microcontrôleur :
-(4) arduino unos officielles, mais il semble qu'interfacer 2 bus i2c est impossible
- une carte blue pill, basée sur le STM32F104C8T6 (une chinoise, je 'avais achetée par curiosité), il semblerait qu'elle comporte deux bus i2c séparés mais je trouve pas comment les configurer séparément.
- une pyboard officielle, basée sur STM32F405, tournant sous micropython : je sais qu'elle ferait l'affaire, vu que j'ai déjà réussi à dialoguer avec une MPU6050 l'année dernière, mais je n'aime pas vraiment la programmation sous micropython, l'interface de putty n'aide pas beaucoup pour le débuggage.
Ma question est : Comment pourrais-je activer les deucx bus I2C du STM32F104C8T6 via l'IDE d'arduino pour ialoguer avec les deux couples d'accéléromètres, et est-il possible de fixer la fréquence du bus pour augmenter le débit de données ?
Je voudrais éviter l'utilisation d'un multiplexeur i2c, pour limiter la complexité du circuit et éviter de ralentir la communication : atteindre la communication la plus rapide est nécessaire pour limiter les erreurs d'intégration).
Un granbd merci à tous ceux qui prendrons de leur temps pour lire ceci et m'aiderons dans mon projet.
PS j'évite l'utilisation de bibliothèques, en-dehors du nécessaire pour la communication i2c, j'écris directement dans les registres de configuration et lis dans ceux de données des MPU, je sais ainsi ce qui se passe, je peux ajuster les réglages des capteurs, et je limite la taille du programme.