今回はI2Cデバイスのアドレスを検索して、
一覧を表示するデバイスサーチについて紹介します。
環境はこれまで同様、
・STM32F303K8
+SW4STM32(System Workbench for STM32)
+STM32CubeMX(HAL ライブラリ、F3 ver. 1.60)
です。
raspberryPIやArduinoなどでは
I2Cデバイスサーチのコードが公開されており、
I2Cデバイスのアドレス確認や正常動作の確認に使えるので
非常に便利です。
ただ、STM32のHALライブラリで書かれたものがなかったので、
作成してみました。
void I2C_Dev_Search(){
uint8_t FindNum=0;
uint8_t FindDev[128];
printf("*** I2C Device Search Start! ***\n\r");
for(int i=0; i<0xff;i=i+2){
uint8_t res=HAL_I2C_Master_Transmit(&hi2c1, i,(uint8_t*)0x00,0,50);
if(res==HAL_OK){
FindDev[FindNum]=i;
FindNum++;
printf("[0x%X] \t",i);
}
else{
printf("0x%X \t",i);
}
if((i+2)%10==0)printf("\n");
HAL_Delay(1);
}
printf("\nDevice Found: %d \n",FindNum);
for(int i=0; i<FindNum; i++){
printf("Device No. %d Address: 0x%X (0x%X)\n",i+1,FindDev[i],FindDev[i]>>1);
}
printf("*** I2C Device Search Finished! ***\n\r");
HAL_Delay(100);
}
uint8_t FindNum=0;
uint8_t FindDev[128];
printf("*** I2C Device Search Start! ***\n\r");
for(int i=0; i<0xff;i=i+2){
uint8_t res=HAL_I2C_Master_Transmit(&hi2c1, i,(uint8_t*)0x00,0,50);
if(res==HAL_OK){
FindDev[FindNum]=i;
FindNum++;
printf("[0x%X] \t",i);
}
else{
printf("0x%X \t",i);
}
if((i+2)%10==0)printf("\n");
HAL_Delay(1);
}
printf("\nDevice Found: %d \n",FindNum);
for(int i=0; i<FindNum; i++){
printf("Device No. %d Address: 0x%X (0x%X)\n",i+1,FindDev[i],FindDev[i]>>1);
}
printf("*** I2C Device Search Finished! ***\n\r");
HAL_Delay(100);
}
上記の関数をmain関数内で実行するとデバイス名が一覧で表示されます。
上記では加速度、ジャイロセンサが一体の
MPU6050を接続した際のアドレスが表示されています。
0xD0がHALライブラリで使用するアドレスとなります。
データシートでは読込書込みビットを除いた0x68が
アドレスとして説明されています。
Githubにプロジェクトファイル含めてアップしました。