8 - I2C (Inter Integrated Circuit) : Différence entre versions

De Wiki L.A.B
Aller à : navigation, rechercher
(I2C (Inter Integrated Circuit))
(Configuration du périphérique USART et I2C dans STM32CubeMX)
Ligne 16 : Ligne 16 :
  
 
[[Fichier:Stm32CubeMX I2CConfiguration2.png]]
 
[[Fichier:Stm32CubeMX I2CConfiguration2.png]]
 +
 +
== Code du périphérique I2C ==
 +
 +
uint8_t Data[ 4 ];
 +
 +
//  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 ");

Version du 23 mars 2018 à 16:39

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 réduire 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 ];

// 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 ");