[Armadillo:09055] Re: A-4x0 にSPIでSDカードスロットを増設

Yasuhisa Nakamura email@hidden
2013年 7月 20日 (土) 23:52:58 JST


中村です。

自己レスが続きますが・・・
なんとかSPIでSDカードが読めるようになりました。
書き込みはまだ試してません。

この次のメールで修正箇所をレポートしますが、その前に、
過去記事で気づいたところを書いておきます。

1つ前の私の投稿で
> 過去記事の[Armadillo:06883]
> http://lists.atmark-techno.com/pipermail/armadillo/2011-March/006886.html
>> | ....                                        i.MX25のSPIコントローラ
> | の制限として、一回のバーストで転送可能なデータは最大2^10(1024)バイト
> | となっております。

と引用したこの説明をデータシートで見つけることができませんでした。

もう1つ。

> ソースを追ってみて、この話の続きの[Armadillo:06887]
> http://lists.atmark-techno.com/pipermail/armadillo/2011-March/006890.html

この記事に、次のような記述があります。

| i.MX25では、Control Register (CONREG)の BURST LENGTHには、一回の
| チップセレクト信号アサート(バースト)で転送するビット数を、XCHを1
| にする前にセットしておかなければなりません。
|
| しかし、現在のSPIスタックでは、転送を開始する前に一回のバーストで
| 転送するビット数を知るのは難しいです。これは、連続したSPIの転送を
| おこなう場合、struct spi_messageに複数のstruct spi_transferをセット
| しておこなうようになっているのですが、struct spi_transferが複数ある
| 場合、一つずつバラバラにmxc_spiドライバに渡されるようになっているためです。

これにも惑わされました。

FIFOにいくつデータを入れたかには関係なく常に7になってます。

どこでやっているかというと、mxc_spi.cの
void mxc_spi_chipselect(struct spi_device *spi, int is_active)
{
        ...
        xfer_len = spi->bits_per_word;
        ...
        ctrl_reg |=
            (((xfer_len - 1) & spi_ver_def->bc_mask) << spi_ver_def->bc_shift);
        ...
        __raw_writel(ctrl_reg, master_drv_data->base + MXC_CSPICTRL);
        ...
}
です。

データシートのSPIの BURST LENGTH の説明では次のように書いてあります。
 In master mode, it controls the number of bits per SPI burst.
 Since the shift register always loads 32-bit data from transmit
 FIFO, only the n least-significant (n = BURST LENGTH + 1) will
 be shifted out. The remaining bits will be ignored.

ようするに、1ワードのビット数だけで決まる値ってことだと思います。

BURST LENGTHの説明の直前にあるTXDATAレジスタの説明に
 The number of bits actually transmitted is determined by the
 BIT_COUNT field of the corresponding SPI Control register.
という記述があるのですけど、"BIT_COUNT"というフィールドの
説明がどこにもありません。
"BIT_COUNT"=="BURST LENGTH"かな?と思ってます。

-- 
なかむら




armadillo メーリングリストの案内