G2021_MCP23017_I/Oエキスパンダー(出力)
2024年12月15日
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);