G2021_MCP23017_I/Oエキスパンダー(出力)

20241215

3:06

G2021_lpc812_MCP23017_io_expander_output

 

 

アドレスを 0x4E に変更して出力テストします

 

 

 

 

出力処理の関数です

 

//        MCP23017 全出力初期設定

void        MCP23017_out_init(uint8_t prm_bnk)

{

uint8_t buf_max = 16;

char snd_buf[16+2];

char rcv_buf[16+2];

uint32_t i2c_err = 99;

uint8_t i2c_add;

 

// prm_bnk 0-7

if(Exp_23017_dat_max-1 < prm_bnk) return;        // バンクオーバーフロー

i2c_add = Exp_23017_add_tbl[prm_bnk/2];

if(i2c_add == 0) return; // アドレス未定義

 

if((prm_bnk % 2) == 0)

{

snd_buf[0] = 0x00;        // 入出力選択A

snd_buf[1] = 0x00;        // 全点出力

i2c_err = LPC_i2c_snd_rcv(i2c_add,2,0,snd_buf,rcv_buf,buf_max);

if(i2c_err != 0) LPC_i2c_msg("A POL SET",i2c_err);

 

snd_buf[0] = 0x02;        // IPOLA

snd_buf[1] = 0xFF;        //

i2c_err = LPC_i2c_snd_rcv(i2c_add,2,0,snd_buf,rcv_buf,buf_max);

if(i2c_err != 0) LPC_i2c_msg("A IPOL",i2c_err);

 

}

else

{

snd_buf[0] = 0x01;        // 入出力選択B

snd_buf[1] = 0x00;        // 全点出力

i2c_err = LPC_i2c_snd_rcv(i2c_add,2,0,snd_buf,rcv_buf,buf_max);

if(i2c_err != 0) LPC_i2c_msg("B POL SET",i2c_err);

 

snd_buf[0] = 0x03;        // IPOLB

snd_buf[1] = 0xFF;        //

i2c_err = LPC_i2c_snd_rcv(i2c_add,2,0,snd_buf,rcv_buf,buf_max);

if(i2c_err != 0) LPC_i2c_msg("B IPOL",i2c_err);

}

 

//        出力で利用する場合下記設定が必要です

//        VCC -> 2K -> LED -> PINx (1:点灯 0:消灯)

 

}

 

//        MCP23017 全出力

void        MCP23017_wrt(uint8_t prm_bnk)

{

uint8_t buf_max = 16;

char snd_buf[16+2];

char rcv_buf[16+2];

uint32_t i2c_err;

uint8_t i2c_add;

 

// prm_bnk 0-7

if(Exp_23017_dat_max-1 < prm_bnk) return;        // バンクオーバーフロー

i2c_add = Exp_23017_add_tbl[prm_bnk/2];

if(i2c_add == 0) return; // アドレス未定義

 

if((prm_bnk % 2) == 0)

{

snd_buf[0] = 0x12;

snd_buf[1] = Exp_23017_dat[prm_bnk];

i2c_err = LPC_i2c_snd_rcv(i2c_add,2,0,snd_buf,rcv_buf,buf_max);

if(i2c_err != 0) LPC_i2c_msg("A OUTPUT",i2c_err);

}

else

{

snd_buf[0] = 0x13;

snd_buf[1] = Exp_23017_dat[prm_bnk];

i2c_err = LPC_i2c_snd_rcv(i2c_add,2,0,snd_buf,rcv_buf,buf_max);

if(i2c_err != 0) LPC_i2c_msg("B OUTPUT",i2c_err);

}

 

}

 

//////////////////////////////////////

//        バンク単位のビット設定 (出力)

//////////////////////////////////////

void        MCP23017_bit_set(

uint8_t prm_bnk,                // 0-7

uint8_t prm_set_bit,        // 0-7

uint8_t prm_set_dat)        // 1-1

{

uint8_t i2c_add;

 

// prm_bnk 0-7

if(Exp_23017_dat_max-1 < prm_bnk) return;        // バンクオーバーフロー

i2c_add = Exp_23017_add_tbl[prm_bnk/2];

if(i2c_add == 0) return; // アドレス未定義

 

if(prm_set_dat  == 0) Exp_23017_dat[prm_bnk] &= ~(1<<prm_set_bit);

else Exp_23017_dat[prm_bnk] |= (1<<prm_set_bit);

}

 

プロジェクトの説明

 

 

uint8_t bnk,bit_no;

 

    // 誤動作防止のため、実装されていないバンクはアドレスゼロ設定必要

    Exp_23017_add_tbl[0] = 0x4E;

    Exp_23017_add_tbl[1] = 0;

    Exp_23017_add_tbl[2] = 0;

    Exp_23017_add_tbl[3] = 0;

 

 

    // 16ビットすべて出力に設定する

    MCP23017_out_init(0);        // バンク単位出力設定

    MCP23017_out_init(1);        // バンク単位出力設定

 

    // 出力データ初期化

    Exp_23017_dat[0] = 0;        MCP23017_wrt(0);

    Exp_23017_dat[1] = 0;        MCP23017_wrt(1);

 

 

                    // Bxyy  x BNK   yy  Bit

                    // 今回もオルタネート処理します

                    bnk = cha_dec_to_int(rcv_buf,1,1);

 

                    bit_no = cha_dec_to_int(rcv_buf,2,2);

                    if(MCP23017_bit_chk(bnk,bit_no) == 0)

                            MCP23017_bit_set(bnk,bit_no,1);

                    else

                            MCP23017_bit_set(bnk,bit_no,0);

                    MCP23017_wrt(bnk);

 

ブレッドボードの作業

 

 

 

通信処理

 

 

 

 

動作テストの様子を動画で確認できます

 

G2021 MCP23017 出力LEDテスト ‐ Clipchampで作成

 

 

速度テストをします

 

 

 

    MCP23017_wrt(0);

    MCP23017_wrt(1);