8 - I2C (Inter Integrated Circuit)

De Wiki L.A.B
Révision de 27 avril 2018 à 13:08 par SinGuy (discussion | contributions) (I2C (Inter Integrated Circuit))

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

I2C (Inter Integrated Circuit)

Le bus I²C (Inter Integrated Circuit) fait partie des bus série : 3 fils pour faire tout passer. Il permet de faire communiquer entre eux des composants électroniques très divers grâce à seulement trois fils : un signal de données (SDA), un signal d'horloge (SCL), et un signal de référence électrique (masse).

Il s'agit d'une liaison en mode série, ce qui signifie que la vitesse de transfert sera plus faible qu'avec un bus de type parallèle. Le bus I²C permet cependant des échanges à la vitesse de 100 kbits par seconde. Certes, la vitesse de transfert du bus I²C n'est pas fulgurante, mais dans bien des cas, la vitesse n'est pas l'élément prédominant.

L'utilisation d'un bus I²C permet de transmettre des données en série entre les circuits intégrés d'une même carte, ce qui réduit la complexité des circuits imprimés à réaliser. Par exemple, pour connecter une EEPROM ou une RAM à un microcontrôleur classique, il faut relier entre eux les bits de données et les bits d'adresses des différents composants, et, en plus, il faut bien souvent ajouter une logique de sélection. Avec des composants prévus pour se connecter au bus I²C, il suffit de les relier par deux pistes seulement. Si, par la suite, on souhaite ajouter des composants sur le circuit, le nombre de pistes à ajouter sera vraiment plus réduit (essayez d'ajouter une EEPROM sur un circuit existant pour voir).

Configuration du périphérique USART et I2C dans STM32CubeMX

Stm32CubeMX I2CandUART.png

Stm32CubeMX USART2Configuration.png

Stm32CubeMX I2CConfiguration.png

Stm32CubeMX I2CConfiguration2.png

Code du périphérique I2C

  uint8_t Data[ 4 ];
  printf( "Hello World \n ");

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
//   if ( HAL_I2C_Slave_Receive( &hi2c1, Data, sizeof( Data ), 60000 ) == HAL_OK )
//    printf( "Data received: 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", Data[ 0 ] , Data[ 1 ] , Data[ 2 ] , Data[ 3 ] );
//   else
//    printf( "Error on HAL_I2C_Slave_Receive \n ");
//   uint8_t Temp = Data[ 0 ];
//   Data[ 0 ] = Data[ 3 ];
//   Data[ 3 ] = Temp;
//   Temp = Data[ 1 ];
//   Data[ 1 ] = Data[ 2 ];
//   Data[ 2 ] = Temp;
//   if ( HAL_I2C_Slave_Transmit( &hi2c1, Data, sizeof( Data ), 60000 ) == HAL_OK )
//    printf( "Data sent: 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", Data[ 0 ] , Data[ 1 ] , Data[ 2 ] , Data[ 3 ] );
//   else
//    printf( "Error on HAL_I2C_Slave_Transmit \n ");

   Data[ 0 ] = 0x11;
   Data[ 1 ] = 0x22;
   Data[ 2 ] = 0x33;
   Data[ 3 ] = 0x44;
   if ( HAL_I2C_Master_Transmit( &hi2c1, 0x08, Data, sizeof( Data ), 10000 ) == HAL_OK )
    printf( "Data sent: 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", Data[ 0 ] , Data[ 1 ] , Data[ 2 ] , Data[ 3 ] );
   else
    printf( "Error on HAL_I2C_Master_Transmit \n ");

   if ( HAL_I2C_Master_Receive( &hi2c1, 0x09, Data, sizeof( Data ), 10000 ) == HAL_OK )
    printf( "Data received: 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", Data[ 0 ] , Data[ 1 ] , Data[ 2 ] , Data[ 3 ] );
   else
    printf( "Error on HAL_I2C_Master_Receive \n ");

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */