mbed OS 6.0(baremetal)でRDA5807(FMラジオIC)を叩く

Table of Contents

概要

https://qiita.com/dabodabo/items/f8b52413849291a2d462
秋月で取り扱いが始まったFMラジオモジュールRDA5807は、作例こそあるもののいまいち情報が足りてないようだ。
https://akizukidenshi.com/catalog/g/gM-17245/

今回はMbed環境下で挙動を確認してみた。

実装

arduino版の下調べ

https://qiita.com/dabodabo/items/f8b52413849291a2d462
この記事を参考に、Mbed環境への移植を試みた。
mbed OSは随分進化したらしく、長らく放置されていた2系は6系に統合され、Mbed StudioもClangレベルのエラーは出るがビルドから書き込みまでひとしきりしてくれる。
問題はこの秋月ラジオモジュール、データシートが謎の中国語で基板についてしか情報がなく、チップの刻印から検索してRDA5807HSというマイナーチェンジ版?みたいなICのデータシートにようやくたどり着けた。
https://aitendo3.sakura.ne.jp/aitendo_data/product_img/audio/fm-module/RDA5807HS%20datasheet_v1.2.pdf

i2c通信ができない

データシートの書き方が非常にわかりにくい上に、上記arduino版記事を読むとわかるがレジスタ単位のアクセス方法がなんと記述されていない。
公式ではdevice address=0b0010000[r/w]に対し、register\:0x02から順に読んでいくとあるが、この方法だと末尾まで全部のデータを一括で読み出すらしい。
そこでデータシートには無いdevice address=0b0010001[r/w]に対し、読み出したいregister addrを書く→2バイト読み書きという挙動をさせる事でランダムアクセスができるというのだ。

何だこのデータシート!?

実際にやってみた

I2C i2c(CHIP_SDA, CHIP_SCL);
#define I2C_ADDRESS (0x0011<<1)

// readでもwriteでもまずこれでレジスタのアドレスを指定する
void set_register(char register_addr) {
  i2c.write(I2C_ADDRESS, &register_addr, 1, true);
}

void write(char addr, short data) {
  // 書き込み時はレジスタのアドレス→データ上位8ビット→下位8ビットの順で送る
  // スタートビット→レジスタのアドレス書く2バイト読みor書き→ストップビットと送るので、
  // 勝手にスタート/ストップをかけるi2c.write(addr, data, len)は使用不可
  char buf[2] = {(char)(data >> 8), (char)(data & 0xff)};
  set_register(addr);
  i2c.write(data >> 8);
  i2c.write(data & 0xff);
  i2c.stop();
}

short read(char addr) {
  char buf[2]={};
  // 読み出す場合はアドレス指定後に一気読みすればOK
  set_register(addr);
  i2c.read(I2C_ADDRESS, buf, 2);
  return buf[0]<<8 | buf[1];
}

ポイントは読み書きの際のi2c通信において、スタート/ストップビットを意識した実装にする事だ。
i2cは規格上データ線にデバイスアドレスを送るので、mbedのアドレス指定writeを使うとシーケンシャルにデータが送れず書き込みで失敗する。
ちなみに秋月で売っているRDA5807Hは明らかにデータシートとデフォルトのレジスタ値が違う。もう何が正しいのかわからんので気にするだけ無駄だな!

カテゴリー: IT, 電子工作 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です