

SPRESENSE Arduino IDE（Ver1.8.16）で、「Software Serial ライブラリ」を使用したプログラム作成をしています。

LowPower.clockMode(CLOCK_MODE_32MHz)を設定し、動作クロックを32MHzに落とすと正常に通信できなくなります。  
この設定を外してクロックモードの指定なしにすると正常に通信できています。  
スピードは115200bpsです。

Spresenseの「Software Serial ライブラリ」はクロックモード設定に対して何か制限があるのでしょうか？  
Webの開発者情報では特に記述が見つかりませんでした。  
電池動作のシステムを開発しており、CLOCK_MODE_32MHzで動作させてできるだけ電力消費量を落とそうとしています。  
アドバイスいただけると助かります。  
（以下12/17 追加）  
各モード設定時のTx波形をオシロスコープで測定してみました。  
結果、CLOCK_MODE_32MHzにすると送信パルスが115200bpsからずれてしまっています。  
（１）クロックモード・通常時  
[![正常動作](https://i.stack.imgur.com/4GFNF.jpg)](https://i.stack.imgur.com/4GFNF.jpg)  
（２）クロックモード設定：CLOCK_MODE_32MHz  
[![画像の説明をここに入力](https://i.stack.imgur.com/b0Uur.jpg)](https://i.stack.imgur.com/b0Uur.jpg)  
このクロックのズレが正常に通信できない原因と思われます。  
ライブラリーの不具合ではないでしょうか？


CC BY-SA 4.0
2021-12-16T07:04:58.753
85163
2021-12-17T01:41:35.567
2021-12-16T22:54:21.817
49331
49331
question
spresense arduino
LowPower.clockMode(CLOCK_MODE_32MHz)での「Software Serial ライブラリ」動作


`SoftwareSerial`ライブラリの中身を覗いてみると、`bitDelay`で時間を調整しているようです。CPUクロックでディレイを調整しているので、CLOCK_MODE_32MHzでCPUクロックを下げた場合には対応されていないのかもしれません。

<https://github.com/sonydevworld/spresense-arduino-
compatible/blob/master/Arduino15/packages/SPRESENSE/hardware/spresense/1.0.0/libraries/SoftwareSerial/SoftwareSerial.cpp#L238>

[code]

    void SoftwareSerial::begin(long speed)
    {
      unsigned long bitDelay;
    
      pinMode(_transmitPin, OUTPUT);
      pinMode(_receivePin, INPUT_PULLUP);
    
      /* 4-cycle delays (must never be 0!) */
      bitDelay = (clockCyclesPerMicrosecond() * 250000) / speed;
      _tx_delay = bitDelay - 16;
      _rx_delay_centering = bitDelay + (bitDelay / 2) > 160 ? bitDelay + (bitDelay / 2) - 160 : 1;
      _rx_delay_intrabit = bitDelay - 16;
    
    
[/code]

ただ、オシロスコープで波形をみながら自分で`bitDelay`を調整すれば、CLOCK_MODE_32MHzでも動作するのではないかと思います。是非試してみてください。


CC BY-SA 4.0
2021-12-17T01:41:35.567
85179
2021-12-17T01:41:35.567
31378
85163
answer