Доброго всем времени суток.
Вот, значит, возникла необходимость разработки устройства на базе микроконтроллера LPC2364 с применением SD карточки. Как и подразумевает классика жанра я взял схему подключения с набора разработки mcb2300 и шаблон программы MCB2300_SD_File. Перенял процедуры для работы с картой SD и в результате карточка ожила. Т.е. процедуры инициализации, считывания регистров, конфигурирования прошли на УРА. И как только дело дошло до чтения данных с карточки, возникла загвоздка, с которой я уже мучаюсь неделю.
Теперь по порядку:
Чтения данных выполняется при помщи DMA.
Процедура настройки DMA
Код
void MCI_DMA_Start(DWORD mode, BYTE *buf) {
DWORD i;
#define PCGPDMA 29
/* Configure DMA controller Ch0 for read or write. */
//DMA on
PCONP |= (1<<PCGPDMA);
if (mode == DMA_READ) {
/* Transfer from MCI-FIFO to memory. */
GPDMA_CH0_SRC = (DWORD)&MCI_FIFO;
GPDMA_CH0_DEST = (DWORD)buf;
/* The burst size set to 8, transfer size 512 bytes. */
GPDMA_CH0_CTRL = (512>>2)|(0x04 << 12)|(0x04 << 15)|
(0x02 << 18)|(0x02 << 21)|(1 << 27)|(1u << 31);
GPDMA_CH0_CFG = 0x10001 | (0x04 << 1) | (0x00 << 6) | (0x06 << 11);
}
else {
/* Transfer from memory to MCI-FIFO. */
GPDMA_CH1_SRC = (DWORD)buf;
GPDMA_CH1_DEST = (DWORD)&MCI_FIFO;
/* The burst size set to 8, transfer size 512 bytes. */
GPDMA_CH1_CTRL = (512 >> 2) | (0x04 << 12) | (0x04 << 15) |
(0x02 << 18) | (0x02 << 21) | (1 << 26) | (1u << 31);
GPDMA_CH1_CFG = 0x10001 | (0x00 << 1) | (0x04 << 6) | (0x05 << 11);
}
/* Enable DMA channels, little endian */
GPDMA_INT_TCCLR = 0x03;
GPDMA_CONFIG = 0x01;
}
Смотрю в отладчике: в регистрах те самые значения, которые и надо.
Далее процедура чтения сектора. (Кстати MCI_DMA_Start() вызывается из этой процедуры)
Код
BOOL MCI_ReadSect (DWORD sect, BYTE *buf, DWORD cnt) {
// Read one or more 512 byte sectors from Flash Card.
DWORD i;
if (MCI_WaitForTran() == FALSE)
{
// Card not in TRAN state.
return (FALSE);
}
if (MCI_CmdReadBlock(sect, cnt) == FALSE)
{
// Command Failed.
return (FALSE);
}
// Set MCI Transfer registers.
MCI_DATA_TMR = DATA_RD_TOUT_VALUE;
MCI_DATA_LEN = cnt * 512;
// Start DMA Peripheral to Memory transfer.
MCI_DMA_Start (DMA_READ, buf);
MCI_DATA_CTRL = 0x9B; //И вот сдесь ошибка. В регистре канала DMA
//Raw Error Interrupt Status Register (DMACRawIntErrorStatus)
//возводится бит RawIntErrorStatus0
for (i = DMA_TOUT; i; i--) {
if (GPDMA_RAW_INT_TCSTAT & 0x01) {
// Data transfer finished.
break;
}
}
if (i == 0) {
//DMA Transfer timeout.
return (FALSE);
}
if (cnt > 1) {
// Stop reading Multiple sectors.
MCI_SendStop ();
}
return (TRUE);
}
Т.е. после запуска контроллера SD карточки на обмен информацией регистре канала DMA Raw Error Interrupt Status Register (DMACRawIntErrorStatus) возводится бит RawIntErrorStatus0. Что это за ошибка такая я не сильно понимаю. Понимаю только, что почему-то сбиваеться DMA. Почему - ума не приложу. Причем на осциллографе продолжает шуровать процесс обмена. Можеткто подскажет, или хотябы в какую сторону копать. Перепробовал много чего, но безрезультатно.
Заранее благодарен всем откликнувшимся.