I2C Sniffer

[EM2820に接続されたTVP5150](https://qiita.com/yamori813/items/7e26a57e37b2fb8bdd30)の設定を確認するためにI2CのSnifferを探してみました。

あ、Snifferというのは昔ネットワークアナライザーにSnifferという非常に有名なアプリがあって、そこからきてます。

Windows環境でドライバーをインストールしてアプリを起動したときにどのような設定が行われているか確認したいと思いました。Windows環境のUSBでのSnifferがなぜかうまく使えないのでI2CでSnifferすることにしました。（岩通のオシロのプロトコルはUSBをSnifferして解析したはずなのですが、どうやって使ったのか思い出せません）

GV-MVP/SZのドライバはVistaまでですが、32BitのWindows 7には署名ないよって怒られるけど、インストールして使えるようです。昔はEMPIAのサイトに64Bitのドライバがあったようですが、今は無くなっているようです。

I2Cの通信速度は100/400KbpsなのでSnifferはそれなりの処理速度が要求され以下のような方法が考えられます。

* 早いCPUを使う
* マイコンの機能をうまく使う
* 機能を限定する
* FPGAで専用のロジックを作成する

最初に[@toyoshimさんがLPCで作られた](https://qiita.com/toyoshim/items/52d00f155362174abff7)バイナリを試してみたのですが、一部しかログがでませんでした。

EM2820やTVP5150のピンはピッチが狭くジャンパーを張るのは難しいので8PIN SOCのEEPROMの5,6ピンとグランドの4ピンからジャンパーを張るのが良いです。

![写真（2019-08-10 10.00）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/0f46458f-5251-5067-3b83-0785e7f6b970.jpeg)


他を探してみたところ、ATtiny85を使った以下のページが見つかりました。

https://www.avrfreaks.net/projects/i2c-twi-sniffer

ATtinyにはUSIというI2Cをサポートするための仕組みがあります。この仕組みは汎用になっていてそれを使ってI2Cを実現できるようになってます。上記のコードはこの仕組みをマスターでもスレーブでもなくSnifferに使っているようです。ATMEGAにはUSIはありません。

ちょっと古いソースでしたがVersion 2のCコードをplatformioでコンパイルできるようにして、下記に置いてあります。外部クロックで作ったようですが、内部クロックの8Mでも使えるようです。8Mなので3.3V,5V両方で使えます。

外部クロックで16Mなどにしたい場合は5Vにする必要がありますが、3.3Vのターゲットに接続してもSCL,SDAは入力なので、そのままで動くとおもいます。(未確認)

https://github.com/yamori813/i2c_sniffer2

マシン再起動した時のログ

```
sA0a6AasA1a14a03np
sA0a6AasA1a14a03a49a00a2Da00a4Fa00a20a00a44a00a41a00a54a00a41a00a00a00np
sA0a7EasA1a16a03np
sA0a7EasA1a16a03a47a00a56a00a2Da00a4Da00a56a00a50a00a2Fa00a53a00a5Aa00a00a00np
sA0a7EasA1a16a03np
sA0a7EasA1a16a03a47a00a56a00a2Da00a4Da00a56a00a50a00a2Fa00a53a00a5Aa00a00a00np
sA0a6AasA1a14a03np
sA0a6AasA1a14a03a49a00a2Da00a4Fa00a20a00a44a00a41a00a54a00a41a00a00a00np
```

EM2820がEEPROM(アドレス:A0,A1)をアクセスして初期設定値を読み込んでいるようです。ストップコンディションを送ってないので、読み込みアドレスのA1へのアクセスが続いています。

I2Cのアドレスは上位7Bitがアドレスで下位1Bitが0が書き込みで1が読み込みになります。

![i2c_addr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/224f207f-4678-4680-722e-24a5f7fb5077.png)


Windowsの初期化

```
sA0a04asA1aBBa04np
sA0a20asA1a16np
sA0a14asA1a6Ea00a00a00np
sA0a1CasA1a02np
sA0a18asA1a60np
sA0a1DasA1a02np
sA0a19asA1aF4np
sA0a1EasA1a00np
sA0a1AasA1a00np
sA0a1FasA1a00np
sA0a1BasA1a00np
sA0a22asA1a01np
sA0a23asA1a02np
sA0a0BasA1a03np
sA0a28asA1aB8np
sA0a0AasA1a20np
sA0a2EasA1a00np
sA0a0AasA1a20np
sC7aB8np
sA0a0Aap
sA1a20np
sA0a0AasA1a20np
sA0a0AasA1a20np
sA0a2EasA1a00np
sC7a38np
sA0a0AasA1a20np
s87a8Fnp
sA0a32asA1a20a40a20a80np
sA0a36asA1a00np
sA0a38asA1a01np
sA0a39ap
sA1a01np
sA0a3AasA1a00np
sA0a3Bap
sA1a00np
sA0a40asA1a00np
sA0a41asA1a00np
sA0a12asA1a06np
sA0a06ap
sA1a15a05np
sA0a0AasA1a20np
sA0a7EasA1a16a03a47a00np
sA0a7EasA1a16a03a47a00a56a00a2Da00a4Da00a56a00a50a00a2Fa00a53a00a5Aa00a00a00np
```

Windowsのアプリ起動で初期化

```
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sC7a38np
sB8a0Fa02ap
sB8a27a20ap
sB8a1Aa0Cap
sB8a04aC0ap
sB8a1Ba14ap
sB8a0Da47ap
sB8a28a00ap
sB8a02ap
sB9a00np
sB8a02a00ap
sB8aD0aFFap
sB8aD1aFFap
sB8aD2aFFap
sB8aD3aFFap
sB8aD4aFFap
sB8aD5aFFap
sB8aD6aFFap
sB8aD7aFFap
sB8aD8aFFap
sB8aD9aFFap
sB8aDAaFFap
sB8aDBaFFap
sB8aDCaFFap
sB8aDDaFFap
sB8aDEaFFap
sB8aDFaFFap
sB8aE0aFFap
sB8aE1aFFap
sB8aE2aFFap
sB8aE3aFFap
sB8aE4aFFap
sB8aE5aFFap
sB8aE6aFFap
sB8aE7aFFap
sB8aE8aFFap
sB8aE9aFFap
sB8aEAaFFap
sB8aEBaFFap
sB8aECaFFap
sB8aEDaFFap
sB8aEEaFFap
sB8aEFaFFap
sB8aF0aFFap
sB8aF1aFFap
sB8aF2aFFap
sB8aF3aFFap
sB8aF4aFFap
sB8aF5aFFap
sB8aF6aFFap
sB8aF7aFFap
sB8aF8aFFap
sB8aF9aFFap
sB8aFAaFFap
sB8aFBaFFap
sB8aCFa00ap
sB8aC4a20ap
sB8aC5a01ap
sB8aC3a38ap
sB8aC3a00ap
sB8aC3a3Fap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a71ap
sB8aC3a6Eap
sB8aC3a43ap
sB8aC3a69ap
sB8aC3a7Cap
sB8aC3a08ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a39ap
sB8aC3a00ap
sB8aC3a38ap
sB8aC3a00ap
sB8aC3a3Fap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a71ap
sB8aC3a6Eap
sB8aC3a43ap
sB8aC3a69ap
sB8aC3a7Cap
sB8aC3a08ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a39ap
sB8aC3a00ap
sB8aECa09ap
sB8aEDa09ap
sB8aCDa01ap
sB8aCBa4Eap
sB8aCCa00ap
sB8a30a01ap
sB8a03a6Fap
sB8a00a02ap
sB8a0Ba00ap
sB8a88ap
sB9a11np
sB8a0Ba00ap
sB8a0Ba00ap
sB8a0Fa02ap
sB8a27a20ap
sB8a1Aa0Cap
sB8a04aC0ap
sB8a1Ba14ap
sB8a0Da47ap
sB8a28a00ap
sB8a02ap
sB9a00np
sB8a02a00ap
sB8aD0aFFap
sB8aD1aFFap
sB8aD2aFFap
sB8aD3aFFap
sB8aD4aFFap
sB8aD5aFFap
sB8aD6aFFap
sB8aD7aFFap
sB8aD8aFFap
sB8aD9aFFap
sB8aDAaFFap
sB8aDBaFFap
sB8aDCaFFap
sB8aDDaFFap
sB8aDEaFFap
sB8aDFaFFap
sB8aE0aFFap
sB8aE1aFFap
sB8aE2aFFap
sB8aE3aFFap
sB8aE4aFFap
sB8aE5aFFap
sB8aE6aFFap
sB8aE7aFFap
sB8aE8aFFap
sB8aE9aFFap
sB8aEAaFFap
sB8aEBaFFap
sB8aECaFFap
sB8aEDaFFap
sB8aEEaFFap
sB8aEFaFFap
sB8aF0aFFap
sB8aF1aFFap
sB8aF2aFFap
sB8aF3aFFap
sB8aF4aFFap
sB8aF5aFFap
sB8aF6aFFap
sB8aF7aFFap
sB8aF8aFFap
sB8aF9aFFap
sB8aFAaFFap
sB8aFBaFFap
sB8aCFa00ap
sB8aC4a20ap
sB8aC5a01ap
sB8aC3a38ap
sB8aC3a00ap
sB8aC3a3Fap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a71ap
sB8aC3a6Eap
sB8aC3a43ap
sB8aC3a69ap
sB8aC3a7Cap
sB8aC3a08ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a39ap
sB8aC3a00ap
sB8aC3a38ap
sB8aC3a00ap
sB8aC3a3Fap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a71ap
sB8aC3a6Eap
sB8aC3a43ap
sB8aC3a69ap
sB8aC3a7Cap
sB8aC3a08ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a00ap
sB8aC3a39ap
sB8aC3a00ap
sB8aECa09ap
sB8aEDa09ap
sB8aCDa01ap
sB8aCBa4Eap
sB8aCCa00ap
sB8a30a01ap
sB8a03a6Fap
sB8a00a02ap
sB8a0Ba00ap
sB8a88ap
sB9a9Enp
```

C7はチューナモジュールの読み込みで、その後TVP5150のアクセスがあります。Macから同じように処理を流してもうまく動きません。。。

USBをsnoopしてみたところ、USBでのアクセスではI2Cのアドレス最下位ビットの設定が必要なくて、読み込みの時にも偶数のアドレスでUSBにアクセスしていて、EM2820が変換しているようです。

EM2820は設定のレジスタのアドレスとI2Cのアドレスが同じパラメータになっていて、なんか不思議な設計です。