Armadilloフォーラム

Armadillo-X1 SPIの周波数設定について

k-tsuru

2017年6月21日 20時29分

いつもお世話になっております。

Armadillo-X1にて、拡張I/F(CON8)のSPI利用時、
クロックの周波数設定についてご教授ください。

サンプル等を参考に、50MHzでの動作を行おうとしましたが、
30MHz程度しか出力されておりませんでした。

設定等足りない点を教えて頂きたく思います。

---------------------------------------------------
SPIの設定に関しては、下記投稿を利用させていただきました。
https://users.atmark-techno.com/blog/615/2577

armadillo_x1-ecspi4_user1.dtsを利用させてもらい、
spi-max-frequencyを下記のように修正。
・spi-max-frequency = <50000000>;

ユーザーランド側にて、spidevのioctl、
・SPI_IOC_RD_MAX_SPEED_HZ、
・SPI_IOC_WR_MAX_SPEED_HZ
それぞれ50000000に設定。

---------------------------------------------------

上記設定後、ioctlのSPI_IOC_MESSAGEより、データの読み込みを実施した所、
SCLKのクロックが期待の値となっておりませんでした。

何か設定等足りないものがあると思いますので、ご助言いただけませんでしょうか。

以上、よろしくお願い致します。

コメント

at_mizo

2017年6月23日 10時29分

溝渕です。

> サンプル等を参考に、50MHzでの動作を行おうとしましたが、
> 30MHz程度しか出力されておりませんでした。

源clockが60MHzなので、50MHzで動かそうとすると、div2で30MHzになってしまいます。

50MHzで動作させたい場合は親clockの変更等を行う必要があります。

k-tsuru

2017年6月23日 18時09分

溝渕様

いつもお世話になっております。
回答ありがとうございます。

> 源clockが60MHzなので、50MHzで動かそうとすると、div2で30MHzになってしまいます。
imx7dual-reference-manualを確認したところ、
 ・源clock p1145「ECSPI4_CLK_ROOT」のFrequencyが60MHz
 ・Div p2602 「ECSPIx_CONREG」の15-12bit (にて出力可能な周波数を設定)
という事でしょうか。

p506, p524にある記載より、SYS_PLLの480MHzを2分周して、
60MHzのソースとなっているPLL_SYS_MAIN_240Mを生成していると思われますが、
PLL_SYS_MAIN_240Mからの240MHz⇒60MHzの仕組みが読み取れませんでした。

> 50MHzで動作させたい場合は親clockの変更等を行う必要があります。
源clock 60MHzの変更方法をご教授お願いできませんでしょうか。
よろしくお願い致します。

at_mizo

2017年6月26日 9時13分

溝渕です。

> > 源clockが60MHzなので、50MHzで動かそうとすると、div2で30MHzになってしまいます。
> imx7dual-reference-manualを確認したところ、
>  ・源clock p1145「ECSPI4_CLK_ROOT」のFrequencyが60MHz
>  ・Div p2602 「ECSPIx_CONREG」の15-12bit (にて出力可能な周波数を設定)
> という事でしょうか。
>
> p506, p524にある記載より、SYS_PLLの480MHzを2分周して、
> 60MHzのソースとなっているPLL_SYS_MAIN_240Mを生成していると思われますが、
> PLL_SYS_MAIN_240Mからの240MHz⇒60MHzの仕組みが読み取れませんでした。

ecspi3_srcは、pll_sys_main_240m_clkで240MHzです。

これを、p506にあるpre dividerでdiv4し、ecspi3_root_clkは60MHzになります。

さらに、p2602にあるPRE/POST_DIVIDERでdiv2して30MHzになっています。

> > 50MHzで動作させたい場合は親clockの変更等を行う必要があります。
> 源clock 60MHzの変更方法をご教授お願いできませんでしょうか。

丁度50MHzを作るのであれば、pll_enet_250m_clkを使うのが良いと思います。

ecspi4_root_clkは、最大80MHzなので、ここを50MHzにしています。

DTS内のecspi4ノードのプロパティとして、以下を追加してください。

assigned-clocks = <&clks IMX7D_ECSPI4_ROOT_SRC>,
<&clks IMX7D_ECSPI4_ROOT_CLK>;
assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_250M_CLK>;
assigned-clock-rates = <0>, <50000000>;

k-tsuru

2017年6月27日 18時11分

溝渕様

いつもお世話になっております。

下記設定を行ったところ、無事目的のクロックでの動作を確認できました。
> assigned-clocks = <&clks IMX7D_ECSPI4_ROOT_SRC>,
> <&clks IMX7D_ECSPI4_ROOT_CLK>;
> assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_250M_CLK>;
> assigned-clock-rates = <0>, <50000000>;

ご助力感謝いたします。
ご教授いただき、ありがとうございました。