迫真の氷結晶

初投稿です。

  • HOME
  • 自己紹介
  • 作品集
  • 生活系

MacでCH341Aを使ってI2C EEPROMに読み書きしたい

2020-12-13
  • #技術系
  • #電子工作

やりたいこと

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:
front side of a CH341A

裏 / back:
back side of a CH341A

24LC512

5 pieces of 24LC512 SOP8

I2C EEPROM。パッケージのサイズはSOP8(JEITA/EIAJ SOIC. 208mil)。AliExpressで5個で96円で、送料込みで431円で買った。

1個はんだが付いてて明らかに中古なんですがそれは…(白目)

SOPからDIPにピッチを変換するアダプタ

sop8 to dip8 adapter

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/binch341prog があるか探しに行きましょう。

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を乗せる

insert a CH341A mounted on a SOP8 socket mounted on a 24LC512 to a USB receptacle of a Macbook Air

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のデータシートを読んで自力でコマンドを生成する必要がありそうです。

∩(´;ヮ;`)∩ ンヒー

[また今度成功させたい]

迫真の氷結晶 © 2021