STM32G031とI2CでIOエキスパンダー化(4GPIO)(IN)(mbed-os)


x 超超重要 なぜか秋月STM32G031J6M6がうり切れていた。注意!!(2022/8/27現在)

x SWDをいじるので上級者向け

x 過去ログを見よ!!

x PA0をGPIOがわかる人むけ
x PA0を470Ωでプルアップ
x アドレスは、0x40(8ビット0x80)
x i2cプルアップも忘れずに
x 再書き込みに問題があるかも

目的
I2CでIOを拡張する。
金銭的には、ほぼ意味は、無い。
たまたまSTM32G031J6M6がある場合、買いに行く手間が省ける。

1 1ビット目
2 VDD
3 GND
4 2ビット目

8 SWD 3ビット目
7 SWD 4ビット目
6 SDA
5 SCL


![o_con704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/362b291c-9728-c72c-cc3d-f9d86cec3b85.jpeg)



![o_con684.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1c255d3b-751c-3c87-f52d-29e58c86d46d.jpeg)




受信

I2C_EXPANDER_IN_031_1



```c++



//I2C_EXPANDER_IN_031_1

#include "mbed.h"

//1 LED1 PB_7
//2 VDD
//3 GND
//4 LED2 PA_0
//
//5 LED3 PA_14
//6 LED4 PA_13
//7 SDA
//8 SCL

char out_t[][5]={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?" };
//char out_t[][5]={"[00]", "[01]", "[02]", "[03]", "[04]", "[05]", "[06]", "[07]",
//                "[08]", "[09]", "[0A]", "[0B]", "[0C]", "[0D]", "[0E]", "[0F]" };
//
//char out_t[][5]={"\000", "\001", "\002", "\003", "\004", "\005", "\006", "\007",
//                "\010", "\011", "\012", "\013", "\014", "\015", "\016", "\017" };

//I2Cの初期化
//               sda   scl
I2CSlave slave(PA_12, PA_11); //0031

//メインルーチン
int main()
{

    //not delete 3s wait
    wait_us(1000*1000);// 1秒待つ
    wait_us(1000*1000);// 1秒待つ
    wait_us(1000*1000);// 1秒待つ

    //GPIOの初期化
    DigitalIn myled1(PB_7);  //LED1
    DigitalIn myled2(PA_0);  //LED2
    DigitalIn myled3(PA_14); //LED3
    DigitalIn myled4(PA_13); //LED4

    //I2Cスレーブのアドレスの設定
    slave.address(0x80);

    //無限ループ
    while(1) {

        //I2Cの状態の読み出し(ポーリング)
        while(  slave.receive()  != I2CSlave::ReadAddressed   ) {};

        //I2Cマスターに送信する
        slave.write(out_t[myled4*8 + myled3*4 + myled2*2 + myled1 ],1);
        //slave.write(out_t[myled1],1);
        //slave.write(out_t[13],1);//debug
        
    }//while

}//main




```


マスター


I2C_M_Read_CH_031_1


```c++


//I2C_M_Read_CH_031_1

#include "mbed.h"

//I2Cの定義
//        sda   scl
I2C i2c(PA_12, PA_11); //031

//シリアルの定義
UnbufferedSerial serial_port(PA_2, PA_3); //031

//GPIOの初期化
DigitalOut myled1(PB_7);  //LED1

int main()
{

    //シリアルの初期化
    serial_port.baud(9600);
    serial_port.format(
        /* bits */ 8,
        /* parity */ SerialBase::None,
        /* stop bit */ 1
    );

    char data_read[5]; //文字

    //無限ループ
    while(1) {

        //myled1=1;//debug

        //dataの読み込み
        // Data Read  register
        data_read[0]='@';
        //i2c.write( 0x80,     data_read, 0,false);
        i2c.read(  0x80 | 1, data_read, 1,false);
        //data_read[0] = i2c.read(false);
        
        if(data_read[0] == 'A' ) {myled1=1;}else{myled1=0;}

        //文字の出力
        serial_port.write(data_read, 1);

        //myled1=0;//debug

        //1秒待つ
        //wait_us(1000*1000);
        
        HAL_Delay(500);

    }//while

}//main




```


ナイトライダー


GPIO_4LED_Knight_Rider_031_1



```c++



//GPIO_4LED_Knight_Rider_031_1

#include "mbed.h"

//1 LED1 PB_7
//2 VDD
//3 GND
//4 LED2 PA_0
//
//5 SWD
//6 SWD
//7 LED3 PA_12
//8 LED4 PA_11

//GPIOの初期化
DigitalOut  leds[]  = {
    DigitalOut (PB_7),  //LED1
    DigitalOut (PA_0),  //LED2
    DigitalOut (PA_12), //LED3
    DigitalOut (PA_11)  //LED4
};

//メイン関数
int main()
{

    //not delete 3s wait
    wait_us(1000*1000);// 1秒待つ
    wait_us(1000*1000);// 1秒待つ
    wait_us(1000*1000);// 1秒待つ


    //無限ループ
    while(1) {

        for(int ii=0; ii<=4; ii++) {

            for(int jj=0; jj<=4; jj++) {

                //GPIOへビットを設定
                if(ii == jj) {
                    leds[ jj ] = 1;
                } else {
                    leds[ jj ] = 0;
                }

            }//for

            wait_us(1000*1000);// 1秒待つ

        }//for

    }//while

}//main





```