ESP32のLEDCやI2Sで5, 10, 20MHzのmaster clock (連続したclock) を出力するとWifiスループットが低下します。
ESP32カメラで一般的なCameraWebServerで発生します。WROOM-32で起きやすく、chip実装で起きにくいです。
https://www.facebook.com/100009187204902/videos/954929518394522/
WROOM-32で起きやすく、chip実装で起きにくい。32/32D/32E間での有意差は確認できず
I2Sによる10MHz生成(元はLEDC≒PWM)
→ NG
DirectI/Oによる10MHz生成
→ DevkitCはOKになったが、OKだったaitendo基板がNGになった。
XCLKとWiFi不安定の原因の間でなんらかの同調関係になると問題が起きるらしく、周波数と位相関係の依存性がありそう。
最終段のIO_MUXを10MHzから別のI/O(H又はL)にするとOKになる
→ IO_MUX、DigitalPads (出力I/Oセル) 周辺で問題が起きている
XCLK出力 open drain、drive strength 最低でもNG。XCLK=GND直結でもNG
→ 出力I/Oセル周辺の問題だが、XCLK信号の反射等によるものではない
2のことからXCLKと「WiFi不安定原因」の周期との同調が小さい(最大公倍数が大きい)周波数を取ることである程度の対策が可能かも
→ XCLK=8MにすることでOK、未知の「WiFi不安定原因」が10MHzで動作している?
ノイズ源:不安定要因 = 8MHz:10MHz? = 4:5 とあまり非同期化できていないため(XCLKから見て4周期に1回程度同期する)、
なぜここまで効果があるのか謎。
この問題はESP32単体で発生。下記に再現環境をリリースします。
chromeブラウザで下記URLを開く
https://sohta02.sakura.ne.jp/tukurutch/
拡張機能(左下ボタン) - [M5Camera,ESP32cam..] 選択
[xx 書き込み] - [testXclockIssue]を選択して[xx 書き込み]をクリック
FW書き込み開始
[接続 ssid ..] でSSID/PASS設定してクリック、[WiFi接続状態] でIP確認
ソースコード:https://github.com/sohtamei/TuKuRutch.ext/tree/master/libraries/testCamWifi/src
XCLK=20MHz、カメラ不要、上記テスト環境
chip実装は全てOK。WROOMではaitendoのみOK
XCLK=8MHz、カメラあり
全てOK。ov2640 → ESP32転送が有効のため20MHz評価より時間が長くなっているが正常。
共通
ESP32 - AP距離約5m、マンションのため他の世帯からの干渉は多い。
unitCAM, ESP32CAM用FWをリリース中
M5Stack Community https://community.m5stack.com/topic/3649/unitcam-hw-issue-cannot-stream-video
Official arduino-esp32 https://github.com/espressif/arduino-esp32/issues/5834