[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 メーリングリストの案内