STM32F767でI2Cモニター　(F767のクロック216Mhzは、速い。)(100KHz)




目的
I2Cをモニターして開発効率を上げる



![o_con410.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/eb4cf51c-b05b-6ccf-346d-0e6239ffb112.jpeg)


![o_con411.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b4f21c63-1c12-801b-fdd3-7d755148f65a.jpeg)



いろいろ

なんとなく壊すと高いし、フラッシュの寿命もあるしと使っていなかったが!!

F767 216Mhzのパワーを思いしったか　がっがっはははあーー　(宮崎アニメの悪役ふう)

2022/5/9 20時頃 ふろ入ってアイス食ってプログラムは、全て使い回し
実質0分0秒　ほぼ、事務作業



「A」を0x80(8ビット表記)に1秒おきに送信する。


```c++



//I2C_A_031_1

#include <Arduino.h>
#include <Wire.h>

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define en     PB7     // 1pin

#define ADDR1  0x40

//初期化
void setup() {

  delay(3000); //not Delete

  //GPIOの初期化
  pinMode(en, OUTPUT);

  //i2cの初期化
  Wire.begin(sdaPin, sclPin); //STM32G031J6M6

}//setup

//メインループ
void loop() {

  digitalWrite(en, 1); //LED ON debug

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write('A');
  Wire.endTransmission();

  delay(500);//0.5秒待つ


  digitalWrite(en, 0); //LED OFF debug
  delay(500);//0.5秒待つ

}//loop



```







Arduino UNO用がそのまま動いた


```c++





//soft_i2c_slave_test_767_1


#include <Arduino.h>

//ピン 13 LED1
//ピン Vdd
//ピン Gnd
//ピン 

//ピン 
//ピン 
//ピン A4 SDA
//ピン A5 SCL

//GPIOの初期化 //LED1
#define myled 13


#define DW   digitalWrite



#define  SDA1 A4
#define  SCL1 A5

int TinmOut1 = 100000;

//SDAがHの間は、ループ
#define SDA_START() while(digitalRead(SDA1) == 1){}

//SDAがHの間は、ループ TinmOut1付き
#define SDA_H() while(digitalRead(SDA1) == 1 && TinmOut1 != 0){TinmOut1--;}

//SDAがLの間は、ループ TinmOut1付き
#define SDA_L() while(digitalRead(SDA1) == 0 && TinmOut1 != 0){TinmOut1--;}

//SCLがHの間は、ループ TinmOut1付き
void SCL_H() {
  while (digitalRead(SCL1) == 1 && TinmOut1 != 0) {
    TinmOut1--;
  }
}

//SCLがLの間は、ループ TinmOut1付き
void SCL_L() {
  while (digitalRead(SCL1) == 0 && TinmOut1 != 0) {
    TinmOut1--;
  }
}

int input, input_bk = 1;

/*
  //立ち上がり
  void SCL_UP_H()
  {
    while(TinmOut1 != 0){

       //立ち上がり
       input = SCL1;
       if( input_bk != input ){
           if( input == 1 ) break;
       }//endif

      //バックアップの保存
      input_bk = input;

      TinmOut1--;
    }//while
  }//SCL_UP_H()
*/

//初期化関数
void setup()
{

  //シリアルの初期化
  Serial.begin(9600);

  //LED1ポートの初期化
  pinMode(myled, OUTPUT);

  //ソフトI2Cの初期化
  pinMode(SDA1, INPUT);
  pinMode(SCL1, INPUT);

}//setup

char buf[10]; //I2Cバッファー
int ii; //ループカウンター

//アドレス
int a0, a1, a2, a3, a4, a5, a6, a7;
int a[8];

//データ
int d0, d1, d2, d3, d4, d5, d6, d7;
int d[8];

//無限ループ
void loop()
{

  //スタート信号の立下りを待つ
  //タイムアウトの設定
  TinmOut1 = 100000;

  //開始
  SDA_START();

  //アドレスの取り込み
  SCL_H();
  SCL_L();
  a7 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a6 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a5 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a4 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a3 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a2 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a1 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  a0 = digitalRead(SDA1);


  //a7 = 1;
  //a6 = 0;
  //a5 = 0;
  //a4 = 0;
  //a3 = 0;
  //a2 = 0;
  //a1 = 0;
  //a0 = 0;

  //アンクの処理
  SCL_H();
  SCL_L();
  //a0 = SDA1;

  //データの取り込み
  SCL_H();
  SCL_L();
  d7 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d6 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d5 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d4 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d3 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d2 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d1 = digitalRead(SDA1);

  SCL_H();
  SCL_L();
  d0 = digitalRead(SDA1);

  //d7 = 0;
  //d6 = 0;
  //d5 = 1;
  //d4 = 1;
  //d3 = 0;
  //d2 = 0;
  //d1 = 0;
  //d0 = 0;


  digitalWrite(myled, HIGH); //LED ON  debug

  buf[0] = 'U';//バッファーのクリア
  buf[1] = 0;


  //I2Cスレーブの受信データの表示
  Serial.print(buf);
  Serial.print("\r\n");


  //I2Cスレーブの受信データの表示 debug
  //pc_printf("Read A: %x\r\n", buf[0]);

  digitalWrite(myled, HIGH); //LED OFF  debug


  a[7] = a0;
  a[6] = a1;
  a[5] = a2;
  a[4] = a3;
  a[3] = a4;
  a[2] = a5;
  a[1] = a6;
  a[0] = a7;

  d[7] = d0;
  d[6] = d1;
  d[5] = d2;
  d[4] = d3;
  d[3] = d4;
  d[2] = d5;
  d[1] = d6;
  d[0] = d7;

  //アドレスの表示
  for (ii = 0; ii < 8; ii++) {
    if (ii == 4) Serial.print(": ");

    if (a[ii] == 0) {
      Serial.print("__ ");
    } else {
      Serial.print("[] ");
    }//ebdif
    
  }//for
  Serial.print("\r\n");//リターン


  //データの表示
  for (ii = 0; ii < 8; ii++) {
    if (ii == 4) Serial.print(": ");

    if (d[ii] == 0) {
      Serial.print("__ ");
    } else {
      Serial.print("[] ");
    }//endif
    
  }//for
  Serial.print("\r\n");//リターン

  digitalWrite(myled, LOW); //LED OFF  debug

  delay(500);//0.5秒待つ
  
}//loop



```