SDメモリカードのインタフェース制御を行うSpi_Ctrl部について、もう少し深く検討してみました。
転送帯域が厳しいaudioデータの再生は、ハードアシストでデータ転送を行い、SDメモリカードの初期化は、遅くても問題ないのでNiosiIIで行うようにする。またAudioデータ転送中の帯域を確保するため
FAT予約領域ルート/FAT領域/デレクトリエントリはSDRAM上に転送して、そちらを参照する。
以上転送帯域確保のための最低限ハード化するとこんな感じで良いかなと考えています。
SDメモリカードへのライトなどはプレイヤーとしては不要なのでばっさりと機能を落とします。
以下がSpi_Ctrl部の現時点での仕様です。
概要
SpiCtrlは、SPIマスタとして動作し、SD メモリカードのシングルブロックリードアクセスのみをサポートする。
SDメモリカードの初期化は、制御ルートを切り替えGPIOポートを使用してNiosII処理により行う(予定)。
-1536バイトの受信FIFO
-32ビット スレーブavalonバスインターフェイス(レジスタアクセス用)
-32ビット マスタavalonバスインターフェイス(リードデータDMA用)
転送先の指定により2つの転送モード
・port to port :設定sampling周波数でESへ転送(audio data転送用)
・port to memory :SDRAMミラー領域へ転送(FAT予約領域ルート/FAT領域/デレクトリエントリ)
- avalonバスインターフェイスは50MHz(予定)
-SPIアクセスは20M(予定)
構成
SPI_Ctrl部のブロック構成
アクセス手順
.
SD/メモリカードSingleBlockReadアクセスの手順は次のとおり。
1. Set the SD block address Reg: SDメモリカードRead Address
2. Set Trans Type Reg = SPI_RW_READ_SD_BLOCK
3. Set Trans Ctrl Reg = SPI_TRANS_START
4. Wait for Trans Status Reg != TRANS_BUSY
5. Check for Trans Error Reg [3:2] == READ_NO_ERROR
6. Read 512 bytes from SPI_Rx_FIFO to SDcard_ES (p_to_p)or SDRAM(p_to_m)
レジスタ一覧
Register Address | Name |
0x0 | SPI Master Control Reg |
0x4 | Trans Type Reg |
0x8 | Trans Ctrl Reg |
0xc | Trans Status Reg |
0x10 | Trans Error Reg |
0x14 | Direct_Access Data Reg |
0x18 | SD Addr Reg |
0x1c | Rx_FIFO_data_count |
レジスタ詳細
SPI Master Control Reg
Bit Pos | Name | Description | Default | R/W |
0 | RST | 1 = Reset core logic, and registers. Self clearing | 0 | W |
Trans Type Reg
Bit Pos | Name | Description | Default | R/W |
[2:0] | TRANS_TYPE | Sets the transaction type, where; 0 = DIRECT_ACCESS (future study) 1 = INIT_SD (future study) 2 = RW_READ_SD_BLOCK 4 = PIO_ACCESS | 0 | R/W
|
Trans Ctrl Reg
Bit Pos | Name | Description | Default | R/W |
[1:0] | TRANS_START | 1 = Start transaction to ES. Self clearing 2 = Start transaction to SDRAM. Self clearing | 0 | W |
Trans Status Reg
Bit Pos | Name | Description | Default | R/W |
0 | TRANS_BUSY | 1 = Transaction busy |
| R |
Trans Error Reg
Bit Pos | Name | Description | Default | R/W |
[3:2] | SD_READ_ERROR | 0 = READ_NO_ERROR 1 = READ_CMD_ERROR 2 = READ_TOKEN_ERROR |
| R
|
[1:0] | SD_INIT_ERROR (future study) | 0 = INIT_NO_ERROR 1 = INIT_CMD0_ERROR 2 = INIT_CMD1_ERROR |
| R
|
SD Addr Reg
Bit Pos | Name | Description | Default | R/W |
[31:0] | SD_ADDR_31_0 | Set the SD memory address before starting a block read. | 0x00000000 | R/W
|
Rx_FIFO_data_count
Bit Pos | Name | Description | Default | R/W |
[15:0] | FIFO_DATA_COUNT | FIFO_DATA_COUNT Indicates the number of data entries within the fifo. |
| R
|
入出力信号一覧
Port | Width | Direction | Description |
spi_sysclk | 1 | input | spi logic clock. |
rstn | 1 | input | reset. Asynchronous. Resets all logic. |
slave_address | 32 | input | slave port address input |
slave_wr_data | 32 | input | slave port data input |
slave_rd_data | 32 | output | sslave port data output |
slave_write_enb | 1 | input | slave port write enable |
slave_read_enb | 1 | input | slave port read enable |
slave_ack | 1 | output | slave port acknowledge output |
master_address | 32 | output | master port address output |
master _wr_data | 32 | output | master port data output |
master_write_enb | 1 | output | master port write enable |
master_ack | 1 | input | master port acknowledge input |
spi_clk_out | 1 | output | SPI clock. Clock speed configurable |
spi_data_in | 1 | input | SPI serial data from slave |
spi_data_out | 1 | input | SPI serial data to slave |
spi_cs_n | 1 | input | SPI device chip select |
sample_rate | 3 | input | sampling_rate |