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

 
 
> Проблемы с SPI DMA в AT91SAM7SE512, DMA теряет байты при обращении к внешней оперативке.
Intel4004
сообщение May 20 2009, 16:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 7-09-07
Из: Наб.Челны
Пользователь №: 30 364



Третий день бодаюсь. Сдался, пишу сюда.
Ситуация такая: AT91SAM7SE512, если во время работы SPI DMA обратится к внешней статической памяти - то приемник DMA теряет байты. В еррате про это ничего нет, поиск в инете тоже не помог.
Иллюстрация:

int i;
unsigned char Buf1[0x100];
unsigned char Buf2[0x100];
for (i=0;i<0x100;i++)
{
Buf1[i] = 0xff;
Buf2[i] = i;
}
AT91C_BASE_SPI->SPI_MR |= AT91C_SPI_LLB; //Включили Loopback для наглядности
AT91C_BASE_SPI->SPI_RPR = (unsigned int)Buf1;
AT91C_BASE_SPI->SPI_RCR = 0x100;
AT91C_BASE_SPI->SPI_TPR = (unsigned int)Buf2;
AT91C_BASE_SPI->SPI_TCR = 0x100; //Запустили копирование из Buf2 в Buf1 через SPI_DMA
for (i=0;i<10;i++)
*((unsigned char*)0x10000000)=0xff; //10 раз ткнулиись во внешнюю оперативку
for (i=0;i<100000;i++); //подождали подольше, чтобы DMA с гарантией закончил
printf ("Tx:%d, Rx:%d\n",AT91C_BASE_SPI->SPI_TCR, AT91C_BASE_SPI->SPI_RCR);
//TCR = 0, RCR = 10
//т.е. приемник пропустил 10 байт.
//При разглядывании массивов видны 10 пропусков в самом начале через равные промежутки(3 байта), т.е. понятно что пропускал именно при обращении к внешней оперативке...
for (i=0;i<0x100;i++)
if (Buf1[i] != Buf2[i])
printf ("%02x:%02x,%02x\n",i,Buf1[i],Buf2[i]);

//Оперативка настроена так:
//AT91C_BASE_SMC->SMC2_CSR[id]
//SMC_SetMode(id,nws,wsen,tdf,bat,dbw,drp,acss,rwsetup,rwhold)
SMC_SetMode(0,15,AT91C_SMC2_WSEN,5,~AT91C_SMC2_BAT,AT91C_SMC2_DBW_8,~AT91C_SMC2_
DRP,2,1,1);
Go to the top of the page
 
+Quote Post



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

 


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


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