8 - I2C (Inter Integrated Circuit) : Différence entre versions
(→I2C (Inter Integrated Circuit)) |
(→I2C (Inter Integrated Circuit)) |
||
(5 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
== I2C (Inter Integrated Circuit) == | == I2C (Inter Integrated Circuit) == | ||
− | Le bus I²C (Inter Integrated Circuit) fait partie des bus série : 3 fils pour faire tout passer. | + | 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. | 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 | + | 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 == | ||
[[Fichier:Stm32CubeMX_I2CandUART.png]] | [[Fichier:Stm32CubeMX_I2CandUART.png]] | ||
Ligne 16 : | Ligne 16 : | ||
[[Fichier:Stm32CubeMX I2CConfiguration2.png]] | [[Fichier:Stm32CubeMX I2CConfiguration2.png]] | ||
+ | |||
+ | == Code du périphérique I2C == | ||
+ | |||
+ | <syntaxhighlight lang="cpp" enclose="div"> | ||
+ | |||
+ | 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 */ | ||
+ | |||
+ | |||
+ | </syntaxhighlight> |
Version actuelle en date du 27 avril 2018 à 13:08
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
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 */