Microchip の MCP23017 は、I2C ベースの 16 ピン IO エクステンダです。デバイスを一度セットアップ (ピンの方向と値を設定) できましたが、その後、デバイスをリセットまたは電源を入れ直さない限り、期待どおりに値を変更できません。これは、最初に初期化してピンを設定するために使用したコードです。
I2C_Start(); I2C_Write(0x40); // スレーブアドレス I2C_Write(0x00); // アドレスレジスタ ... (シーケンシャル モードなので、次の 10 は I2C_Write(0x00) に設定されます。 I2C_Write(0x08); // IOCON: HAEN=1 I2C_Write(0x08); // IOCON: HAEN=1 ... (シーケンシャル モードなので、次の 6 つは I2C_Write(0x00) に設定されます。 I2C_Write(0xFEu); // GPIOA I2C_Write(0x01u); // GPIOB I2C_Stop();
この後、出力値を切り替えられるようにしたいと思います (0xFE <-> 0x01)。私はこのコードを試みました:
I2C_Start(); I2C_Write(0x40); // スレーブアドレス I2C_Write(0x12); // アドレスレジスタ I2C_Write(0x01u); // GPIOA I2C_Write(0xFEu); // GPIOB I2C_Stop();
この時点で、ランチに出かけるように見えます。ピンの値はランダムに見えます (入力対出力、出力ハイ対ロー)。誰かがこの I2C IO エクステンダーを使用した場合は、私を助けてください。よくわからない場合でも、コメントを歓迎します。注: ここに示す I2C API は、すべてのクロック サイクルに約があるビット バン アルゴリズムです。それらの間の1msの重み。
役立つドキュメント (種類): http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf