STM32 MCP3425 via I2C

 SPIからOLEDに文字を出す際は、先人が作ってくださっている関数をダウンロードしてきて使っていた。世界で有名どころならそれでよいが、つかうICのデータシートを紐解いてI2Cで設定する。

対象:MCP3425。Arduinoから超有名なADCで大量に情報は得られる。

まず、上の方で、

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

#define MCP3425_address  (0x68 << 1)

次に

/* USER CODE END PTD */

  /* USER CODE BEGIN 2 */

  uint8_t MCP3425_ConfREG=0b10011000; //16bit 15sps PGA x1

  uint16_t adcdata;

  float Vref_cp3425=2.048;

  float Vmcp3425=0;

  HAL_I2C_Master_Transmit(&hi2c1,(uint16_t) MCP3425_address, &MCP3425_ConfREG, 1, 100);

 /* USER CODE END 2 */

とmainの前で、設定をし

ADCの値を取得したところで

HAL_I2C_Master_Receive(&hi2c1, (uint16_t)MCP3425_address, &MCP3425_buffer, 2, 100);

adcdata=(MCP3425_buffer[0]) <<8 | MCP3425_buffer[1];

Vmcp3425=adcdata*Vref_cp3425/32767.0;

で取り出せる。

【解説】

Address byte

MCP3425のアドレスは、秋月から購入すると、0x68。
2進数で01101000。アドレスバイトは、最後がR/W(ICから見て受信か送信か)を選択するビットが入って1バイト。Arduinoとかこの点、ユーザが知らなくてもちゃんと処理してくれるが、HALのI2Cライブラリーはこの点をやってくれない。つまり0x68を送ると、R/Wのビットお構いなく送る。なので
#define MCP3425_address  (0x68 << 1)
と1ビット分シフトさせて11010000としてあげる必要がある。
(ちょっとしたバグのように思われる)

R/WがLOWだと、引き続きICから見て書き込み状態になってConfiguration Byteを受信してくれる。

MCP3425_ConfREG=0b10011000を渡しているが、これはデータシートに記載があるので詳細は割愛。

R/WがHIGHで、ICは送信しMPU側で受信(マスター側で受信)。
この時、R/Wはさすがに、いちいちこちら側でHIGHにしてあげなくても、HALのライブラリーで自動にやってくれる。
HAL_I2C_Master_Receive(&hi2c1, (uint16_t)MCP3425_address, &MCP3425_buffer, 2, 100);
でuint8_tのMCP3425_buffer、2つの配列に16ビット分を格納してくれる。

adcdata=(MCP3425_buffer[0]) <<8 | MCP3425_buffer[1];

の部分でuint16_tに並び替えて完了。




コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest

HS101 STM32の自作お手軽オシロスコープ