Armadilloフォーラム

Armadillo-X1のSPIのスレーブモード動作

seltec032

2022年10月27日 14時00分

Armadillo-X1を使用して外部のアナログ信号を44.1kHzのサンプリング周波数で取り込むことを実現したいと考えています。
ArmadilloのSPIをスレーブモードにして、外部から、SS・SCK・MOSI・MISOをSPIに与える方式です。
このような使用に対して、Linuxカーネルは標準でサポートしているでしょうか?
ADCは、サポートデバイスとしてリストに掲載されているADS8684(TI製)を候補として考えています。

コメント

at_mizo

2022年10月27日 17時01分

溝渕です。

> このような使用に対して、Linuxカーネルは標準でサポートしているでしょうか?

i.MX 7DのSPIドライバがslave modeをサポートしていません。該当箇所は次の通りです。
# function nameが"mx51_*"となっていますが、i.MX7Dもこれを使います。

drivers/spi/spi-imx.c:
static int mx51_ecspi_config(struct spi_device *spi,
			     struct spi_imx_config *config)
{
	:snip
	/*
	 * The hardware seems to have a race condition when changing modes. The
	 * current assumption is that the selection of the channel arrives
	 * earlier in the hardware than the mode bits when they are written at
	 * the same time.
	 * So set master mode for all channels as we do not support slave mode.
	 */
	ctrl |= MX51_ECSPI_CTRL_MODE_MASK;

> ADCは、サポートデバイスとしてリストに掲載されているADS8684(TI製)を候補として考えています。

master modeで利用することは不可能ですか?

seltec032

2022年10月27日 17時25分

> 溝渕です。
>
> > このような使用に対して、Linuxカーネルは標準でサポートしているでしょうか?
>
> i.MX 7DのSPIドライバがslave modeをサポートしていません。該当箇所は次の通りです。
> # function nameが"mx51_*"となっていますが、i.MX7Dもこれを使います。
>
>

> drivers/spi/spi-imx.c:
> static int mx51_ecspi_config(struct spi_device *spi,
> 			     struct spi_imx_config *config)
> {
> 	:snip
> 	/*
> 	 * The hardware seems to have a race condition when changing modes. The
> 	 * current assumption is that the selection of the channel arrives
> 	 * earlier in the hardware than the mode bits when they are written at
> 	 * the same time.
> 	 * So set master mode for all channels as we do not support slave mode.
> 	 */
> 	ctrl |= MX51_ECSPI_CTRL_MODE_MASK;
> 

>
>
> > ADCは、サポートデバイスとしてリストに掲載されているADS8684(TI製)を候補として考えています。
>
> master modeで利用することは不可能ですか?
>
ご回答ありがとうございます。
遅れましたが、大隅と申します。

MasterモードではなくSlaveモードを選択したのは、
ADのサンプリング周波数は44.1kHzの正確な周期で、ADコンバータからデータを
採取したい為、外部でSS・SCK・MOSIの信号を生成する回路を作って
Armadillo側のSPIに渡す仕様を考えました。
Masterモードにした場合にはソフトの割込み処理プログラムで、データを受信する事になると思いますが、
その場合、SS信号の出力タイミングが割込み遅延により遅れる事も予想されるので、
外部からSS信号を出す仕様を検討いたしました。

seltec032

2022年10月31日 13時20分

ご回答ありがとうございました、大隅です。
ドライバーは、Masterモードのみ対応のみで、やむを得ずSlaveモードで動作させる場合は、
直接SPIのレジスタを制御する事でSlave モードの動作は可能でしょうか?
ドライバーを使用せずにレジスタ直接制御した時の、リスクや留意点等
ご教授いただければ幸いです。
宜しくお願い致します。

at_mizo

2022年10月31日 13時36分

溝渕です。

> ドライバーは、Masterモードのみ対応のみで、やむを得ずSlaveモードで動作させる場合は、
> 直接SPIのレジスタを制御する事でSlave モードの動作は可能でしょうか?
> ドライバーを使用せずにレジスタ直接制御した時の、リスクや留意点等
> ご教授いただければ幸いです。

先に示しましたコードのコメントにある通り、直接SPIのレジスタを変更してSlaveモードにしただけでは、リソースの競合状態が生じる(正常動作しない)ようです。

linux-4.9-atには含まれていませんが、以下の修正を行うとSlaveモードとして動作可能のようです。
# こちらで試した実績は無いことをご了承ください

https://source.codeaurora.org/external/imx/linux-imx/commit/?h=lf-5.15…

seltec032

2022年10月31日 14時32分

大隅です。
貴重な情報ありがとうございます。
資料を確認してみます。

今後供宜しくお願いします。