HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2023/02/18

EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法 EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法

(OLED SSD1306で I2Cの SCLK周波数をドーピングで高速化して描画速度を爆速にする方法)

Tags: [電子工作]





● ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!

2023/02/18
ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!
ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!

  ESP32で東方の Bad Apple!!の動画を再生する!実際にはパラパラ漫画です

 注意: ESP32で MP3を再生して音楽が鳴ります!
Touhou Bad Apple!! Demo ESP32 with MP3 Audio and SSD1306 OLED (128x64 dot)



● ESP32の I2Cの SCLKクロックの周波数の上限が 1MHz(実測で 892kHz)っぽいのを解決する方法

 I2Cの OLED SSD1306の描画の高速化の為に I2Cの SCLKクロックの動作周波数を 4MHzに設定しても 1MHzを設定した時と同じで変化が有りません。
 上記の「東方の Bad Apple!!」の記事に実行時間の表がありますが 1MHz~4MHzで実行時間に変化が有りません。
// デフォルトは 700kHz
SSD1306 display (0x3c, I2C_SDA, I2C_SCL);

// 1MHzを指定
#define I2C_SCLK_FREQ 1000000
SSD1306 display (0x3c, I2C_SDA, I2C_SCL, GEOMETRY_128_64, I2C_ONE, I2C_SCLK_FREQ);

// 4MHzを指定(1MHzを指定した時と実行時間が同じ)
#define I2C_SCLK_FREQ 4000000
SSD1306 display (0x3c, I2C_SDA, I2C_SCL, GEOMETRY_128_64, I2C_ONE, I2C_SCLK_FREQ);

 1MHz以上で実行時間に変化が無いのでロジアナで実際に動作周波数を確認したら上限が 1MHz(実測で 892kHz)っぽい。
 これは ESP32-D0WDQ6 (revision 1)の上限?

esp8266-oled-ssd1306/src/SSD1306Wire.h
bool connect() {
  // Let's use ~700khz if ESP8266 is in 160Mhz mode
  // this will be limited to ~400khz if the ESP8266 in 80Mhz mode.
  if(this->_frequency != -1)
    _wire->setClock(this->_frequency);
  return true;

 使用した SSD1306のライブラリ(ThingPulse)は TwoWire::setClock()を呼んでおり、その内部では i2cSetClock()を呼んでいるので、ESP32のネイティブ側の実装で何か制限をしている?
arduino-esp32/libraries/Wire/src/Wire.cpp
bool TwoWire::setClock(uint32_t frequency)
  err = i2cSetClock(num, frequency);

 なんじゃあこりゃああ!!!(太陽にほえろ!風に)
 1MHzで制限してるううううぅうううぅう!
arduino-esp32/cores/esp32/esp32-hal-i2c.c
esp_err_t i2cSetClock(uint8_t i2c_num, uint32_t frequency)
  ...
  if(!frequency){
      frequency = 100000UL;
  } else if(frequency > 1000000UL){
      frequency = 1000000UL;
  }

ESP32 Series Datasheet
4.1.10 I2C Interface
Up to 5 MHz, yet constrained by SDA pull-up strength
最大 5MHz、ただし SDA プルアップ強度による制約あり


● EPS32の I2Cの SCLの周波数をクロックアップして SSD1306 OLEDの描画を高速化する方法

 上記の様に 1MHz以上を指定しても ESP32のライブラリ内部で 1MHzに制限され、更に実測値では 892kHzになってしまいます。

 「鳴かぬなら 鳴かせてしまえ ホトトギス(FREE WING)」の精神で I2Cの SCLの周波数のレジスタを直接いじくります(笑

ESP32 Technical Reference Manual
Table 11­1. SCL Frequency Configuration
fscl = 80 MHz / (SCL_Low_Level_Cycles + SCL_High_Level_Cycles)

SCL_Low_Level_Cycles = I2C_SCL_LOW_PERIOD + 1
SCL_High_Level_Cycles = I2C_SCL_HIGH_PERIOD + 7

I2C_SCL_LOW_PERIOD_REG Configures the low level width of the SCL clock 0x3FF53000 0x3FF67000 R/W
I2C_SCL_HIGH_PERIOD_REG Configures the high level width of the SCL clock 0x3FF53038 0x3FF67038 R/W
esp-idf/components/soc/esp32/include/soc/i2c_reg.h
#define I2C_SCL_LOW_PERIOD_REG(i)   (REG_I2C_BASE(i) + 0x0000)
#define I2C_SCL_HIGH_PERIOD_REG(i)  (REG_I2C_BASE(i) + 0x0038)

 USBロジアナを接続した状態で下記で I2Cの SCLKが 1.46MHzで動きました!
 (信号線のプルアップ抵抗等のアナログ的な要素で I2Cの通信波形が安定するのでしょう)
    uint32_t* ptr;
    ptr = (uint32_t*)0x3FF53000; // I2C_SCL_LOW_PERIOD_REG
    *ptr = 30;
    ptr = (uint32_t*)0x3FF53038; // I2C_SCL_HIGH_PERIOD_REG
    *ptr = 0;

 通常の状態では下記で安定して I2Cの SCLKが 1.31MHzで動きました!
 と言う訳で 1MHz指定時(実測で 892kHz)から実測で 1.31MHz(1.47倍)に高速化できました!
    uint32_t* ptr;
    ptr = (uint32_t*)0x3FF53000; // I2C_SCL_LOW_PERIOD_REG
    // *ptr = 30; // 動かない
    // *ptr = 31; // 時々フレームの描画が止まる
    // *ptr = 32; // 動く
    *ptr = 35; // 安全を見て 35
    ptr = (uint32_t*)0x3FF53038; // I2C_SCL_HIGH_PERIOD_REG
    // *ptr = 0; // 動く
    *ptr = 2; // 安全を見て 2


● USB Logic Analyzerを使って I2Cの信号を解析する方法

 USB Logic Analyzer便利すぎる!

2016/12/29
パソコンと USBで接続して使用する USB 8ch 24MHzロジック アナライザ
パソコンと USBで接続して使用する USB 8ch 24MHzロジック アナライザ

  Cypress EZ-USB FX2LP CY7C68013A使用で内部のバッファ ICに LVC245Aを使用のチョイ性能アップ版

・USB Logic Analyzer sigrokの PulseViewで I2Cの信号を解析する方法
USB Logic Analyzer sigrokの PulseViewで I2Cの信号を解析する方法


USB Logic Analyzer sigrokの PulseViewで I2Cの信号を解析する方法


USB Logic Analyzer sigrokの PulseViewで I2Cの信号を解析する方法


USB Logic Analyzer sigrokの PulseViewで I2Cの信号を解析する方法



設定値(理論値)実測値
1kHz5008Hz
5kHz4986Hz
6kHz5964Hz
10kHz9868Hz
100kHz96.03kHz
400kHz381.55kHz
700kHz648.64kHz
800kHz727.27kHz
900kHz821.91kHz
1MHz892.19kHz
2MHz892.19kHz(1MHzと同じ)
4MHz892.19kHz(1MHzと同じ)
Low = 35、High = 21.318MHz(黒魔術でクロックアップ)
Low = 30、High = 01.463MHz(黒魔術でクロックアップ)

・ESP32 I2C SCLK frequency 1kHz
ESP32 I2C SCLK frequency 1kHz


・ESP32 I2C SCLK frequency 5kHz
ESP32 I2C SCLK frequency 5kHz


・ESP32 I2C SCLK frequency 6kHz
ESP32 I2C SCLK frequency 6kHz


・ESP32 I2C SCLK frequency 10kHz
ESP32 I2C SCLK frequency 10kHz


・ESP32 I2C SCLK frequency 100kHz
ESP32 I2C SCLK frequency 100kHz


・ESP32 I2C SCLK frequency 400kHz
ESP32 I2C SCLK frequency 400kHz


・ESP32 I2C SCLK frequency 700kHz
ESP32 I2C SCLK frequency 700kHz


・ESP32 I2C SCLK frequency 900kHz(892.19kHzよりも低い)
ESP32 I2C SCLK frequency 900kHz(892.19kHzよりも低い)



● I2Cの SCLKは 1MHz以上は 1MHzに制限される(ESPのライブラリ内で 1MHzに制限している)
・ESP32 I2C SCLK frequency 1MHz
ESP32 I2C SCLK frequency 1MHz


・ESP32 I2C SCLK frequency 2MHz
ESP32 I2C SCLK frequency 2MHz


・ESP32 I2C SCLK frequency 4MHz
ESP32 I2C SCLK frequency 4MHz



● I2Cの SCLKを黒魔術で 1MHzの壁を破りクロックアップの高速化
・ESP32 I2C SCLK Low = 30、High = 0
ESP32 I2C SCLK Low = 30、High = 0


ESP32 I2C SCLK Low = 30、High = 0


ESP32 I2C SCLK Low = 30、High = 0


ESP32 I2C SCLK Low = 30、High = 0



・ESP32 I2C SCLK Low = 35、High = 2
ESP32 I2C SCLK Low = 35、High = 2


ESP32 I2C SCLK Low = 35、High = 2


ESP32 I2C SCLK Low = 35、High = 2


ESP32 I2C SCLK Low = 35、High = 2




● 信号線のプルアップ抵抗の値と動作周波数の関係がグラフになっている

I2c frequency #6444
The maximum frequency is 1 million -

 ディスって言いますが、周波数に "1 million"と言う言葉は使わないでしょ。

I2C/Wire/TwoWire can lock up or cease working in some conditions #349




Tags: [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!
ESP32で東方の Bad Apple!!の動画を 128 x 64 dotの OLED SSD1306で再生する!

  ESP32で東方の Bad Apple!!の動画を再生する!実際にはパラパラ漫画です

2.4インチの大画面 OLED SSD1309で東方の Bad Apple!!の動画を再生する
2.4インチの大画面 OLED SSD1309で東方の Bad Apple!!の動画を再生する

  2.42inch 128x64 OLED LCD Display module SSD1309で Bad Apple!!を再生します

SSD1306 OLEDの描画を高速化する方法
SSD1306 OLEDの描画を高速化する方法

  How to Speed Up OLED Drawing Speed

【技適付き】Freenoveの ESP32-S3-WROOMの Basic Starter Kitを買ってみた、カメラ、SD-Card付きの学習キット
【技適付き】Freenoveの ESP32-S3-WROOMの Basic Starter Kitを買ってみた、カメラ、SD-Card付きの学習キット

  Freenove Basic Starter Kit for ESP32-S3-WROOM Onboard Camera Wireless Python C FNK0084

【技適付き】Freenoveの ESP32-WROVERの Ultimate Starter Kitを買ってみた、カメラ付きの学習キット
【技適付き】Freenoveの ESP32-WROVERの Ultimate Starter Kitを買ってみた、カメラ付きの学習キット

  Freenove Ultimate Starter Kit for ESP32-WROVER Onboard Camera Wireless Python C FNK0047

LoRa通信を使用してポストに郵便物が投函されるとスマホの LINE宛に通知する IoTの作り方
LoRa通信を使用してポストに郵便物が投函されるとスマホの LINE宛に通知する IoTの作り方

  LoRaを使用した IoT郵便受け LoRa IoT Mailbox Sensor with LINE Messaging API

ESP32で Slackに「勤怠管理」メッセージをワンボタン操作で投稿する方法
ESP32で Slackに「勤怠管理」メッセージをワンボタン操作で投稿する方法

  Slackの勤怠チャンネルに毎日毎日毎日毎日 手動で投稿するのが馬鹿らしいので ESP32で作った

ESP32-S3で SPIを使う時に Arduinoでエラーが出た話
ESP32-S3で SPIを使う時に Arduinoでエラーが出た話

  ESP32 S3 SPI error VSPI was not declared in this scope

ESP32の I2Sで MCLKが必須の CS4344 DAC Audioを使用する方法
ESP32の I2Sで MCLKが必須の CS4344 DAC Audioを使用する方法

  ESP32で MCLKが必須の CS4344が問題無く使えます

ESP32で SPI接続の Color LCD ST7735S 160x80px IPSを動かす方法
ESP32で SPI接続の Color LCD ST7735S 160x80px IPSを動かす方法

  ESP32 SPI IPS Color LCD ST7735S tutorial

【ソースコード有】ESP32で I2C接続の OLED SSD1306 128x64pxを動かす方法
【ソースコード有】ESP32で I2C接続の OLED SSD1306 128x64pxを動かす方法

  ESP32 I2C OLED SSD1306 tutorial

ESP32-WROOMを購入したらヘンテコ技適マークもどきの基板が届いた話
ESP32-WROOMを購入したらヘンテコ技適マークもどきの基板が届いた話

  Fake ESP32-WROOM Ignore FCC ID and Strange TELEC mark




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2023 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/hardware/espressif_esp32_clock_up_i2c_sclk/