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_4GPIO_V3_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
//GPIOの初期化
DigitalOut myled1(PB_7); //LED1
DigitalOut myled2(PA_0); //LED2
DigitalOut myled3(PA_14); //LED3
DigitalOut myled4(PA_13); //LED4
//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秒待つ
char buf; //I2Cバッファー
//I2Cスレーブのアドレスの設定
slave.address(0x80);
//無限ループ
while(1) {
//I2Cの状態の読み出し(ポーリング)
while (slave.receive() != I2CSlave::WriteAddressed) {}
//I2Cスレーブの受信バッファーを読み取る
slave.read(&buf, 1);
//GPIOへビットを設定
myled1 = ( buf & 0x01 );//LED1の点灯,消灯
buf = buf >> 1;
myled2 = ( buf & 0x01 );//LED2の点灯,消灯
buf = buf >> 1;
myled3 = ( buf & 0x01 );//LED3の点灯,消灯
buf = buf >> 1;
myled4 = ( buf & 0x01 );//LED4の点灯,消灯
}//while
}//main
送信
//i2c_0x80_1248_out_031_1
#include "mbed.h"
// sda scl
I2C i2c(PA_12, PA_11); //010
int main() {
while(1) {
i2c.write( (0x80), "1", 1);wait_us(1000*1000);// 1秒待つ
i2c.write( (0x80), "2", 1);wait_us(1000*1000);// 1秒待つ
i2c.write( (0x80), "4", 1);wait_us(1000*1000);// 1秒待つ
i2c.write( (0x80), "8", 1);wait_us(1000*1000);// 1秒待つ
}//while
}//main