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

 
 
> Проблема с Link List в DMA
Novichok1
сообщение Aug 31 2009, 06:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



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

Нужно в LPC2478 копировать блоки данных из памяти в память через DMA контроллер.
Все делаю, как прописано в мануале:
- подаю питание на DMA
- енаблю сам DMA
- очищаю регистры запросов прерываний на нужном канале
- устанавливаю адреса исходных и целевых данных на нужном канале
- устанавливаю адрес заранее записанного на флэшку связанного списка
- устанавливаю необходимые параметры размеров трансферов
- енаблю канал

В результате, первый блок копируется нормально, но ко второму элементу связанного списка DMA почему-то не доходит. Я уже не знаю что курить, кто сталкивался с такой проблемой- пожалуйста,поделитесь опытом.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
i.cf
сообщение Aug 31 2009, 23:40
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 25-08-09
Из: Украина, Харьков
Пользователь №: 52 034



Столкнулся с такой же проблемой!
Сейчас стоит LPC2468 ‘-’ Initial device revision (но там вроде с DMA ошибок у них не было).

Пробовал для On-chip RAM 0x7FD00000 - 0x7FD03FFF USB RAM (16 kB) и Off-Chip Memory 0xA0000000 - 0xAFFFFFFF Dynamic memory bank 0.

Для обоих результат такой-же, как и у Novichok1 - копируется только первый блок, но память-то я разрешенную для использования DMA использую.
Ели не сложно - взгляните свежим взглядом - где-то я что-то упускаю...

CODE
#define MEMORY_SOURCE 0x7FD00000
#define MEMORY_DESTINATION 0x7FD01000
#define TRANSFER_SIZE 16

int main(void)
{
volatile unsigned int chain_arr[3][4];
unsigned char *temp1_ptr;
unsigned char *temp2_ptr;
unsigned int i;


// set buffers

temp1_ptr = (U8*)MEMORY_SOURCE;
temp2_ptr = (U8*)MEMORY_DESTINATION;
for (i = 0; i < 200; ++i)
{
temp1_ptr[i] = i;
temp2_ptr[i] = 0;
}


// set chain list

chain_arr[0][0] = MEMORY_SOURCE;
chain_arr[0][1] = MEMORY_DESTINATION;
chain_arr[0][2] = (unsigned int)&chain_arr[1][0];
chain_arr[0][3] = (TRANSFER_SIZE & 0x0FFF)//set the transfer size
| (1u << 12) //Source burst size
| (1u << 15) //destination burst size
| (0u << 18) //Source width
| (0u << 21) //destination width
| (1u << 26) //Source increment
| (1u << 27) //Destination increment
| (0u << 31); //interrupt

chain_arr[1][0] = MEMORY_SOURCE + 32;
chain_arr[1][1] = MEMORY_DESTINATION + 32;
chain_arr[1][2] = (unsigned int)&chain_arr[2][0];
chain_arr[1][3] = (TRANSFER_SIZE & 0x0FFF)//set the transfer size
| (1u << 12) //Source burst size
| (1u << 15) //destination burst size
| (0u << 18) //Source width
| (0u << 21) //destination width
| (1u << 26) //Source increment
| (1u << 27) //Destination increment
| (0u << 31); //interrupt

chain_arr[2][0] = MEMORY_SOURCE + 64;
chain_arr[2][1] = MEMORY_DESTINATION + 64;
chain_arr[2][2] = 0;
chain_arr[2][3] = (TRANSFER_SIZE & 0x0FFF)//set the transfer size
| (1u << 12) //Source burst size
| (1u << 15) //destination burst size
| (0u << 18) //Source width
| (0u << 21) //destination width
| (1u << 26) //Source increment
| (1u << 27) //Destination increment
| (1u << 31); //interrupt


// enable GPDMA

PCONP |= (0x1<<29); // Power up the GPDMA
GPDMA_CONFIG = 0x01; // Enable the GPDMA

while (!(GPDMA_CONFIG & 0x01)); // Wait until the GPDMA is operational

// configure and start GPDMA
GPDMA_INT_TCCLR = 0x01; // Clear the interrupt status bits
GPDMA_INT_ERR_CLR = 0x01;
GPDMA_CH0_SRC = chain_arr[0][0]; // Load source start address into Channel 0
GPDMA_CH0_DEST = chain_arr[0][1]; // Load destination start address into Channel 0

GPDMA_CH0_CTRL = chain_arr[0][3]; //set the transfer size and settings

GPDMA_CH0_LLI = chain_arr[0][2]; // next item to transfer
GPDMA_CH0_CFG |= 0x08001; // Start the channel transfer


while (!GPDMA_RAW_INT_TCSTAT); //Wait until the transfer has finished


for(;;);

return 0;
}


Список вроде правильный формируется :
Прикрепленное изображение
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 6th August 2025 - 21:04
Рейтинг@Mail.ru


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