MacでCH341Aを使ってI2C EEPROMに読み書きしたい
やりたいこと
Macbook AirのUSB経由で 24LC512 に読み書きを行う
結果
今回はできませんでした!
敗因
- I2Cに対応していると思っていたソフトがSPIにしか対応していなかった
- I2Cに対応している方のソフトは64kbitにしか対応していなかった(512kbitで使うには自分で何とかする必要がある)
- あとなんかlibusbが不穏なエラーを表示してくる(無知)
環境・ハードウェア
Macbook Air (2014), Mac OS Big Sur
Xcode とかコンパイラ・ツールチェイン的なものが一応入っている。
CH341A
EEPROMプログラマー(書き込み器)。
AliExpress で本体 US $1.95、送料込みで301円で買った。
表 / front:
裏 / back:
24LC512
I2C EEPROM。パッケージのサイズはSOP8(JEITA/EIAJ SOIC. 208mil)。AliExpressで5個で96円で、送料込みで431円で買った。
1個はんだが付いてて明らかに中古なんですがそれは…(白目)
SOPからDIPにピッチを変換するアダプタ
AliExpressで150mil、200mil、300mil の3個セットを763円で購入。使うのは200milのもの。
やる
なんか見つけた→ https://github.com/boseji/CH341-Store
CH341A のための役立つドキュメント・ソフトウェア集のリポジトリらしい。
CH341a Programmer Application の few Open-source projects のうちの1つとして紹介されてるこれ使うゾ https://github.com/setarcos/ch341prog
追記: READMEに「I2Cしか対応してないプログラマーを参考に自分のを作ったぜ」って書いてあったのでてっきりI2CとSPI両対応なのかと思ったら、どうもソースコードを読むとI2Cに対応してるように見えないんすよね。以下は無駄骨だったってことかいな🙄
とりあえずパッケージをダウンロードする。
% git clone git@github.com:setarcos/ch341prog.git
もちろん cd
でディレクトリ ch341prog
に移動する。
インストール方法がわからん
READMEにインストール方法が書いてないので Makefile を読んでみると、 make install
を実行すると実行ファイル ch341prog
を /usr/local/bin/
にインストールするようになってるみたい。
不安なら make --dry-run
make
を実行するときに何が起こるか分からない場合は --dry-run
オプションを付けて実行すると、 make
の仮実行が行われて、Makefile内のどのルールが適用されて何のコマンドが実行されるかが事前に分かる(実際にコマンドが実行されることはない)。
ch341prog % make --dry-run install
gcc -std=gnu99 -Wall ch341a.c main.c -o ch341prog -lusb-1.0
install ch341prog /usr/local/bin
install -m 0664 99-ch341a-prog.rules /etc/udev/rules.d/99-ch341a-prog.rules
予想通り、 ch341prog
をソースファイルからコンパイルして、それを /usr/local/bin
以下にインストールするようになっている。
ただし、 99-ch341a-prog.rules
の /etc/udev/rules.d/99-ch341a-prog-rules
以下へのインストールについては、これはMacには関係のないことなので、単にディレクトリ /etc/udev
が存在しなくて失敗するはず。
コンパイル&インストール
じゃあ make install
しましょう。
ch341prog % make install
gcc -std=gnu99 -Wall ch341a.c main.c -o ch341prog -lusb-1.0
install ch341prog /usr/local/bin
install -m 0664 99-ch341a-prog.rules /etc/udev/rules.d/99-ch341a-prog.rules
install: /etc/udev/rules.d/99-ch341a-prog.rules: No such file or directory
make: *** [install] Error 71
うん、 /etc/udev
はないです。
/usr/local/bin
に ch341prog
があるか探しに行きましょう。
ch341prog % ls /usr/local/bin/ch341prog
/usr/local/bin/ch341prog
あったぜ。
ch341prog を実行する
CH341Aを挿し込まず実行してみる
CH341A を挿し込まない状態で ch341prog
を実行してみる。
ch341prog % /usr/local/bin/ch341prog
Usage:
-h, --help display this message
-i, --info read the chip ID info
-e, --erase erase the entire chip
-v, --verbose print verbose info
-l, --length <bytes> manually set length
-w, --write <filename> write chip with data from filename
-o, --offset <bytes> write data starting from specific offset
-r, --read <filename> read chip and save data to filename
-t, --turbo increase the i2c bus speed (-tt to use much faster speed)
-d, --double double the spi bus speed
とりえあえず実行はできた。
じゃあ --info
オプションを付けて chip ID を読むようにしてみましょう。 CH341A を挿し込んでいないのでデバイスが見つからず怒られるはず。
ch341prog % /usr/local/bin/ch341prog --info
Couldn't open device [1a86:5512].
それでよし。
素のCH341Aを挿し込んで、info オプションを実行
EEPROMを乗せていない CH341A をMacに挿し込んで先程と同じように --info
オプションを実行してみる。
ch341prog % /usr/local/bin/ch341prog --info
libusb: info [darwin_claim_interface] no interface found; setting configuration: 1
Device reported its revision [4.03]
Chip not found or missed in ch341a. Check connection
うん、先ほどと結果が変わって、 ch341prog
が CH341A デバイス自体を見つけることはできた。
挿したCH341AにEEPROMを乗せる
SOP8 to DIP8 アダプタに 24LC512 を装着して、それを CH341A に乗せて、 --info
を実行してみる。何か読めるだろうか。
ch341prog % /usr/local/bin/ch341prog --info
Device reported its revision [4.03]
Chip not found or missed in ch341a. Check connection
オォン! Chip not found なんで?
I2C未対応やんけ!!
ch341progくん、SPIにしか対応していないことが判明。
逆に、ch341progくんの親、ch341eepromtool先輩はI2Cのみをサポートしていることが判明。
しかしch341eepromtool先輩、64kbitのI2C EEPROMにしか対応していない!
ch341eepromtool先輩のソースコードを見てみると、USB経由でCH341Aに送る、24C64専用のコマンドのバイナリが文字列リテラルとして定義されているみたい。
CH341Aのデータシートを読んで自力でコマンドを生成する必要がありそうです。
∩(´;ヮ;`)∩ ンヒー
[また今度成功させたい]
ほかの記事
- サウンドロップ風おもちゃを自作する記事のパート2。ATtiny85用のプログラムを作成する方法と、Raspberry Piを使ってそれを書き込む方法を解説。
- 防犯ブザーを改造してサウンドロップ風のオリジナルおもちゃを自作する方法を解説する連載のパート1。今回はRaspberry PiでEEPROMに音声を書き込みます。
- デフォルトゲートウェイには、同一セグメント内の/直接接続された/リンク上の ホストのIPアドレスを設定します。そのIPアドレスからそのホストのMACアドレスを調べられることが条件です。
- ふと、Let's Encryptじゃない認証局の証明書でhttps通信したいなと思ったので、Buypassという認証局を試してみました。でも珍しい証明書を使うということはつまり・・・
- ニコニコ動画の埋め込みにscriptを使うとうまくいかない場合は、それが埋め込もうとするiframeを直接埋め込んで使うといいよという話。