CCWO

挫けそうになるブログ

STM32F303K8 I2C

開発環境

評価ボード Nucleo STM32F303K8
IDE System Workbench for STM32 (SW4STM32)
Library Hal Library
OS windows 10 pro

I2Cを使ってみました。使ってみただけ。マスターでジャイロの値を読みに行きました。

CubeMXの設定

f:id:CCWO:20170822114717p:plain

I2Cの設定

Configuration→I2C1→Parameter Settings
f:id:CCWO:20170822114851p:plain
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の設定で
f:id:CCWO:20170822115219p:plain
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は帰ってきません。困りました。
f:id:CCWO:20170822115637j:plain
似たような感じで、
f:id:CCWO:20170822115844j:plain
R/W込の0x3Cを送信できているのですが、どうもうまくいっていません。もうすこし戦ってみたいと思います。