LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-26

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

o_con684.jpg

受信

I2C_EXPANDER_IN_031_1




//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



//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




//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





0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0