STM32F303K8 I2C
開発環境
評価ボード | Nucleo STM32F303K8 |
IDE | System Workbench for STM32 (SW4STM32) |
Library | Hal Library |
OS | windows 10 pro |
I2Cを使ってみました。使ってみただけ。マスターでジャイロの値を読みに行きました。
CubeMXの設定
I2Cの設定
Configuration→I2C1→Parameter Settings
Timing configuration
Rise Time(ns): 1000
Fall Time(ns): 300
Slave Features
Primary Address Length selection: 7-bit
この状態でgenerateします。ここで一つ注意点があって、Nucleoのボードでは
PB6: I2C1_SCL→Arduino D5
PB7: I2C1_SDA→Arduino D6
となっていますが、ジャンパSB16・SB18の設定で
PB6: I2C1_SCL→Arduino A4
PB7: I2C1_SDA→Arduino A5
となっているので接続には少し注意です。
SW4STM32の設定
例によって、semihostingの設定を入れています。
ユーザー変数の設定
/* USER CODE BEGIN 1 */ initialise_monitor_handles(); uint8_t rxBuffer[6] = {0}; uint8_t txBuffer = 0; /* USER CODE END 1 */
I2Cの開始
/* USER CODE BEGIN 2 */ HAL_I2C_Init(&hi2c1); txBuffer = 0x71; HAL_I2C_Mem_Write(&hi2c1, (uint16_t)0x3C, 0x00, 1, &txBuffer, 1, 1000); txBuffer = 0xA0; HAL_I2C_Mem_Write(&hi2c1, (uint16_t)0x3C, 0x01, 1, &txBuffer, 1, 1000); txBuffer = 0x00; HAL_I2C_Mem_Write(&hi2c1, (uint16_t)0x3C, 0x02, 1, &txBuffer, 1, 1000); HAL_Delay(6); /* USER CODE END 2 */
while文の中
/* USER CODE BEGIN 3 */ /* while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)0x68<<1, &txBuffer, 1, 1000) != HAL_OK) ; while(HAL_I2C_Master_Receive(&hi2c1, (uint16_t)0x68<<1, &rxBuffer, 1, 1000) != HAL_OK) ; */ HAL_I2C_Mem_Read(&hi2c1, (uint16_t)0x3D, 0x06, I2C_MEMADD_SIZE_8BIT, (uint8_t *)rxBuffer, 6, 1000); txBuffer = 0x03; HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)0x3C, &txBuffer, 1, 1000); HAL_Delay(67); } /* USER CODE END 3 */
としました。今回は、HoneywellのHMC5883Lでやってみました。
初めはMPU9250でやっていたのですが、ちゃんとアドレス送っていることをオシロでも確認したのですが、なぜかACKが帰ってこなくてなにか間違えたかと思って、こっちに交換したら両方変わらずで困っています・・・。
MPU9250で試してみたとき、アドレスが0x68とR/Wと0をあわせた0xD0を送信できているのですが、ACKは帰ってきません。困りました。
似たような感じで、
R/W込の0x3Cを送信できているのですが、どうもうまくいっていません。もうすこし戦ってみたいと思います。
20170822の記事