今回は簡単にマイコンの出力ポートを拡張できるシフトレジスタ、SN74LV8153を紹介したいと思います。
一般的にマイコン等のGPIOを拡張する際にはI2C接続のGPIO Expanderを多く使用することが多いと思います。また、出力もしくは入力の片方しか使用しない場合はパラレル入力用のシフトレジスタSN74HC165やパラレル出力のSN74HC595等を活用することが多いと思います。入出力混在の場合はI2C GPIO Expander、入力のみor出力のみといった片方向の場合はシフトレジスタという使い分が多いようです。
I2C接続のGPIO ExpanderやSN74HC165、SN74HC595等は少なくとも2本、現実的にはINTピンやロードピンを含めて3本以上の通信線が必要となります。少しでも占有ピン数を減らして出力を拡張する手段として、シフトレジスタとコンデンサや抵抗を駆使して1wire化する方法もありますが、信号タイミングの依存が強くなります。比較的タイミングに依存せず、容易に拡張可能なICとしてSN74LV8153があります。
SN74LV8153は一言でいえばUARTから8bitの出力ポートを操作できるExpander/シフトレジスタです。UARTのTX通信線、1本のみで8bitの出力操作を実現できます(必要に応じて別途Resetピンを接続してください)。また、3ビットのアドレス設定ピンを備えており、1本の通信ラインで最大8つのSN74LV8153を接続可能です。この場合、最大64bitまで拡張することができます。その他の特徴として、自動的にボーレートを検出するため、ボーレート設定が不要という特徴があります。
SN74LV8153の主な仕様は下記の通りです
・信号電源3V〜5.5V
・出力電源3V~13.2V
・出力電流最大40mA
・UARTフォーマット互換
・ボーレート2kbps~24kbps
※UARTであれば9600bpsや19200bps等の設定が汎用的
データシートに記載されていないものの、UARTから送信する際の仕様
・UARTデータ長8bit
・スタートビット 1bit
・ストップビット 1bit
・パリティビット None
・スタートビット後は必ずHighレベルである必要があるため、データは0bXXXXAAA1となる
※XXXXは出力のデータ、AAAは出力先ICのアドレス
・8つの出力を制御するため、1byteデータ0bXXXXAAA1を2回連続で送信する
PCにUSB-UARTSerial変換アダプタを接続して、SN74LV8153を操作した際、UARTはLSB Firstであることを失念しており、なかなか思い通りに動作せず、時間を要してしまいました。具体的には「スタートビット後は必ずHighレベルにする」ということは理解していましたが、MSB Firstだと思い込んでしまい、0b1AAAXXXXのデータを送信して、全く動作しないと悩んでしまいました。
UARTからデータを送信する際は下記のように「スタートビット後は必ずHighレベルにする」ため、UARTはLSB Firstなので0x80を加えるのでなく、0x01を加えるプログラムになります。
bytes[0] = 0x01 + (addr<<1) +((io_state&0x0F)<<4);
bytes[1] = 0x01 + (addr<<1) +((io_state&0xF0)<<0);
bytes[1] = 0x01 + (addr<<1) +((io_state&0xF0)<<0);
EdgeやChorme等のWebSerialAPIに対応したブラウザからSN74LV8153の出力ポートを簡単に操作できます。
UARTはLSB Firstであることを失念して時間を要してしまいましたが、1本の通信線で出力を拡張できるSN74LV8153は非常に便利で面白いと思いました。出力だけでなく、入力に対応したICも出てくれば更に汎用性が上がって面白いですが、入力の場合はボーレート設定等が必要になるため、そのようなICは開発、販売されていないようです。少し残念です。
SN74LV8153の通信ボーレートが最大24kbpsでそこまで高速ではないため、高速な出力用途には向いていませんが、そこまで速度を要しない7SegやLED等の出力だけを拡張したいという場合には非常に便利だと思いました。今後、更に活用してみたいと思います。