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
受信
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