реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> DMA на LPC23xx, Помогите разобрать с работой ПДП.
bogdanov83
сообщение Nov 1 2011, 07:43
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 5-11-10
Пользователь №: 60 663



Доброго всем времени суток.

Вот, значит, возникла необходимость разработки устройства на базе микроконтроллера 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. Почему - ума не приложу. Причем на осциллографе продолжает шуровать процесс обмена. Можеткто подскажет, или хотябы в какую сторону копать. Перепробовал много чего, но безрезультатно.

Заранее благодарен всем откликнувшимся.
Go to the top of the page
 
+Quote Post
M_Andrey
сообщение Nov 1 2011, 09:00
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



Цитата(bogdanov83 @ Nov 1 2011, 11:43) *
GPDMA_CH0_DEST = (DWORD)buf;

А вы куда пытаетесь читать? Судя по ДШ (4.1 Memory regions accessible by the GPDMA. Table 556. GPDMA accessible memory) вам можно использовать только область USB RAM (8 kB) 0x7FD0 0000 - 0x7FD0 1FFF.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 20:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016