PCA9306の中身と動作

# PCA9306って？ 
[PCA9306](https://www.nxp.jp/products/interfaces/ic-spi-i3c-interface-devices/voltage-level-translators/dual-bidirectional-ic-bus-and-smbus-voltage-level-translator:PCA9306)はI²Cバスの信号電圧変換によく使われるデバイスです．その中身と動作は[アプリケーション・ノート:AN11127](https://www.nxp.com/docs/en/application-note/AN11127.pdf)に詳しく書かれています．このアプリケーションノートで大体の動きはわかるのですが，より理解を深めるために簡単なシミュレーションを行ってみました．
この記事は，そのPCA9306がどのように動作するかを[LTSpice](https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html)を使って観察してみたものです． 

シミュレーション用のファイル一式は[こちら](https://github.com/teddokano/pca9306_sim)．

# I²Cバスの電圧変換 
[I²C（アイ・スクエアド・シー）バス](https://www.nxp.com/docs/en/user-guide/UM10204.pdf)はその名前(I²C = Inter IC)の通りICデバイス間での通信に使われる2線式のシリアル通信仕様の名前です． 
データとクロックの2つの信号線だけで双方向の通信を行えるため，多くのマイコン/プロセッサとその周辺デバイスで使われています．近年では**マイコン/プロセッサ電源の低電圧化によりデバイス間を接続する場合に電圧変換が必要になる場合が増えています**． 

I²Cで使われるデータとクロックの信号は**双方向のオープンドレイン信号**であるため，**標準ロジックのバッファなどを使ってそれを行うことができません**．単純なバッファを双方向に互いに接続しただけでは，片方の信号がLOWになると反対側の信号をLOWに駆動し，そのLOW信号を受けてこちら側に向いたバッファもLOWを出力します．そうするとオープン・ドレインである信号はHIGHに戻ることができません．この回路はいわゆる**デッドロック状態**に陥ってしまいます．  
![スクリーンショット 2023-05-15 3.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/dbaf3f76-0fea-2844-1917-91edcee360ac.png)
*図1:標準ロジック・バッファによるデッドロック状態の発生*


このような問題を回避するために，双方向オープンドレイン信号を扱える専用の電圧変換器が用意されています． 

双方向オープンドレイン信号の電圧変換はいくつかの実現方法があります．[I²Cの古い仕様書](https://inst.eecs.berkeley.edu//~cs150/fa13/resources/I2C_BUS_SPECIFICATION_3.pdf)には単純なMOSトランジスタを用いて変換する方法が紹介されています（18.1節）． 
この他にも信号変化を検出して出力を切り替える方法など，様々な方法を採用した製品があります．

ここでは長く**I²C専用の信号電圧変換器**として供給されている**PCA9306**がどのように動作するのかを見てみます． 

# PCA9306 
PCA9306は，単純な内部構造で双方向オープンドレイン信号の電圧変換を行うデバイスです． 
一方の側(A側)に1.0V〜3.6V，反対側(B側)に1.8V〜5.5Vの範囲の電圧の信号を扱うことができ，B側-A側の電圧差が1V以上ある時にはA側のプルアップを省略できる利点があります． 

下の図2は前出の[アプリケーション・ノート:AN11127](https://www.nxp.com/docs/en/application-note/AN11127.pdf)からの抜粋です．この図ではPCA9306と同様の内部構造を持つNVT2xxxを例にしているため，変換を行う信号がN本用意されています．PCA9306では変換する信号は2本だけなのでA1⇄B1，A2⇄B2のチャンネルが用意されています．
またPCA9306の`VREF1`，`VREF2`ピンが，この図ではそれぞれ`VREFA`，`VREFB`となっています．この記事でも以降は`VREFA`，`VREFB`の名称を使うので読み換えてください．

B側の各信号は1kΩでプルアップされていますが，Vcc(B)-Vcc(A) = 3.3V-1.2V = 2.1Vの電圧差があるため，A側のプルアップは省略されています． 
![internal_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/828211e5-8c86-cc27-7faa-2d7fc3c18a42.png)
*図2:NVT20XXシリーズの内部回路*

この図から，NVT20xxシリーズには内部にはチャンネル数+1個のMOSトランジスタが内蔵されていることがわかります． 

さて，ではここから，このトランジスタがどのように動くのかをシミュレーションを通して見ていきます． 

# シミュレーション 
回路のシミュレーションには[LTSpice](https://www.analog.com/en/design-center/design-tools-and-calculators/ltspice-simulator.html)を使います．LTSpiceはアナログ・デバイセズ社が無償で提供しているアナログ回路シミュレータです．ここで使った[ファイルを公開している](https://github.com/teddokano/pca9306_sim)ので，実際に自分自身でも試してみることができます．  

LTSpiceの使い方についてはここでは説明しません．多くの参考になる資料がネット上にも提供されているので，これらを参照ください．  

## 内部構成 
PCA9306の内部構成は先の説で述べた通りです．デバイスの中にチャンネル数分のトランジスタに加えもう一個のトランジスタが入っています．各シャンネルを接続するトランジスタを「パス・トランジスタ」（下図の赤枠），もう一個のを「リファレンス・トランジスタ」（同青枠）と呼んでいます．
![trs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/1001ec15-c81a-e91b-3249-69af4039521f.png)
*図3:内部構成 - パス・トランジスタとリファレンス・トランジスタ*　


まずはパス・トランジスタの動作から見ていきましょう． 

## パス・トランジスタ
パス・トランジスタはドレイン側(B側)が1kΩを介してVcc(B)に，ゲートがENピンに接続されています． 
このような状態でパス・トランジスタがどのように動作するのかを見てみます．
A1〜Anまでのすべてのチャンネルを見てみる必要はないので1個だけで回路を作ってみます． 

LTSpiceにはこの回路図にあるようなバックゲート付きのトランジスタのモデルもあるのですが，パラメータの設定などが面倒なので適当なスレショルド電圧を持つNMOSトランジスタを代わりに使います． 

以下の図(図4)のような回路（シミュレーション・モデル）（[pca9306_pass_transistor.asc](https://github.com/teddokano/pca9306_sim/blob/main/pca9306_pass_transistor.asc)）を作ってみました．
![pca9306_pass_transistor.asc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/7cd49ed0-e6b7-9f15-0570-f094630b97e3.png)
*図4:パス・トランジスタのシミュレーション・モデル*

- 電源`VCCB`で5Vを供給しています
- `VCCB(5V)`は，`R2(1kΩ)`を介してパス・トランジスタ(`M1`)のドレイン側`Bn`に接続．実際の回路ではこの`Bn`が`R2`によってプルアップされている状態になります
- パス・トランジスタのソース側Anは，低電圧側のI²C信号線となります．シミュレーションを行う都合上，ここに何も接続しないわけにはいかないので，仮に`R3(1000kΩ)`に接続しています．実回路では入力状態にあるデバイスのピンに接続している場合には，もっと高い抵抗値が繋がれているものと考えて構いません
- VCCAの電圧を変化させてパス・トランジスタのゲート電圧を変えてみます
- 下のグラフがその結果です．`VCCA(緑🟢)`を約1Vから5Vまで変化させた時の`An(赤🟥)`の変化です．`Bn(青🟦)`は1kΩで`VCCB`に接続されており，5Vで一定しています．

![スクリーンショット 2023-08-15 5.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/e0d857f1-f71d-0ca6-676a-f63e7f9ca220.png)
*図5:パス・トランジスタのシミュレーション結果*

![スクリーンショット 2024-01-07 14.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/e802d4ae-dbf8-cae1-988f-4ea6df1ee38e.png)
*図6:シミュレーション結果と回路*

- この結果を見ると赤の線は，一定電圧差を保って緑の電圧変化に対応していることがわかります
- この電圧差はパス・トランジスタのゲート・ソース間電圧(Vgs)で一定です
- この結果から，この回路は[ソースフォロワ回路](https://detail-infomation.com/amplifier-common-drain-feature/)になっていることがわかります
- ソースフォロワ回路はドレイン側が電源に直結で書かれている例が一般的ですが，この回路の場合R2(1kΩ)とR3(1000kΩ)の比が大きいので「R2は充分小さい」と考えることができます

このように『パス・トランジスタのA側の電圧はゲート電圧（チップの`EN`ピン）よりVgs分だけ低い電圧が出る』ということになります．

`VCCA(緑🟢)`にサイン波を入れてみると，一定電圧差で同様の波形が`An(赤🟥)`に現れます．ソースフォロワ回路の挙動が確認できます．
![スクリーンショット 2023-08-15 6.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/876e0aa8-74ef-b596-8a71-a8efe288e17e.png)
*図7:ソースフォロワ回路の挙動:VCCA(緑🟢)のサイン波が一定電圧差An(赤🟥)に現れる*


## リファレンス・トランジスタ
では，チップに搭載されたもうひとつのトランジスタ：リファレンス・トランジスタはどのように動くのでしょうか？
もうひとつのシミュレーション・モデル（[pca9306_static_behavior.asc](https://github.com/teddokano/pca9306_sim/blob/main/pca9306_static_behavior.asc)）で実験してみます．
![pca9306_static_behavior.asc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/5d564169-b92e-5712-0a50-c054412cf9a9.png)
*図8:リファレンス・トランジスタを含めたシミュレーション・モデル*　

- パス・トランジスタの実験モデルにリファレンス・トランジスタ:`M5`を追加しました
- リファレンス・トランジスタ:`M5`の各ピンは，先述の内部構成で説明した図3のように接続しています
    - ドレインは`VREFB`ピン，ゲートは`EN`ピンとした
    - `VREFB`と`EN`をショートして`R1(200kΩ)`を介して`VCCB(5V)`に接続
    - ソースは`VREFA`ピンとして`VCCA`に接続
- この結果は下のグラフのとおり．`VCCA(緑)`を約1Vから5Vまで変化させた時の`EN(シアン)`と`An(赤)`の変化です


![スクリーンショット 2023-08-15 5.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/db83f066-5513-d98e-657f-01a3258aedf6.png)
*図9:リファレンス・トランジスタを含めたシミュレーション結果*　

![スクリーンショット 2024-01-07 14.13.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/e59f2b38-4d50-bca2-22f7-e34d6edf30d2.png)
*図10:シミュレーション結果と回路*

- まず`EN(シアン🩵)`の電圧に注目します
    - `VREFA`🟢（VCCAに直結）の電圧を上げていくと，一定の電圧差を保って`EN`🩵の電圧も上昇していきます
    - この「一定の電圧差」は先ほどの実験で見た「Vgs」電圧で，`M5` で発生しているものです　
    - `M5`のドレインとゲートはショートされているためダイオードとなっています　
    - つまり`M5`のVgs電圧はダイオードの順方向電圧となっているということです
    - このリファレンス・トランジスタで作られたダイオードの順方向電圧分が`VCCA`に足されて`EN`ピン（`VREFB`も同様）の電圧となって現れます
    - ちなみに.. `VREFA`が4Vを超えると，`EN`の電圧は，電源である`VCCB`の5Vで頭打ちとなり，一定電圧差を保てなくなります

![スクリーンショット 2023-08-15 5.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/392929a4-66d7-566e-87a6-ac65eeaef7b3.png)
*図11:リファレンス・トランジスタはダイオード*


- 次に`An(赤🟥)`の電圧を見ると..
    - `An`🟥の電圧はパス・トランジスタのゲート電圧のVgs分だけ下がった電圧が出るため，`EN`🩵より約1V低い電圧になっています

- つまり，『A側で必要な電圧を作ってやるには，パス・トランジスタのゲートには`VREFA`🟢よりちょっと高めの電圧が必要で，それを作り出すためのリファレンス・トランジスタが用意されている』ということになります

PCA9306では，このようにしてB側とA側に一定以上の電圧差があるとき，A側の電圧を制御できるようになっています．この「一定以上の電圧」は1.0Vとされています．この電圧差に満たない信号電圧同士での変換にはA側にもプルアップ抵抗が必要になります．

# I2Cデバイスの動作を真似てみる

では最後に2つのI²Cデバイスとなるモデルを追加して実験してみましょう．
ここではI²C信号を再現するのではなく，互いに電圧の異なるオープンドレイン出力のデバイスを作ってパルスを発生させてみます([pca9306_operation.asc](https://github.com/teddokano/pca9306_sim/blob/main/pca9306_operation.asc))．
B側とA側にはそれぞれ3.3Vと2Vでの動作を想定したデバイスを接続し，それぞれ別のタイミングでLOWを出力させます．

B側の信号線(Signal-B)は1kΩを介して3.3Vにプルアップされていて，こちら側のデバイスからは，シミュレーション開始後の10usから30usの間だけLOWが出力されます．

一方，A側の信号線(Signal-A)にはプルアップは接続されておらず，PCA9306のA側の電圧がそのまま現れます．こちら側のデバイスでは60usから70usの間だけLOWが出力されるようにしました．

![スクリーンショット 2024-01-07 14.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/447b4868-60d3-4c1e-6602-9bbdd26a6cee.png)
*図12:I²C信号シミュレーション*

この結果は図13のとおりです．  

![スクリーンショット 2024-01-07 15.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/3e04b3d9-36ce-1e18-cd33-763e74ccd9e5.png)
*図13:I²C信号シミュレーション結果*

赤い線がB側，緑の線がA側を示していて，どちらのデバイスもLOWを出力していないときにはそれぞれの電圧でHIGHとなっています．

10uSから30uSの間はB側がLOWを出しています．このとき，A側にもLOWが出されています．反対にA側がLOWを出している60usから70usの期間にはB側にLOWが出力されていることがわかります．

パス・トランジスタのA側またはB側にLOWが入力された際にはゲート電圧との電位差により，トランジスタがON状態となります．これにより互いに反対側の信号もLOWに引っ張られることになります．
([AN11127](https://www.nxp.com/docs/en/application-note/AN11127.pdf)の第4節によると，この内部のトランジスタはソースとドレインが可換となる設計になっているという記述からも，ゲートに対しAnまたはBnのいずれかがLOWになると，その電圧差でONになると考えることができます)

:::note info
[PCA9306の中身と動作](https://qiita.com/teddokano/items/2ecc1f65d7cd45e78b49) © 2024 by Tedd OKANO is licensed under [CC BY 4.0](http://creativecommons.org/licenses/by/4.0/?ref=chooser-v1) 
[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/deed.ja)
:::