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

 
 
 
Reply to this topicStart new topic
> Проблемы с 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
aaarrr
сообщение May 20 2009, 19:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А SPI в каком режиме работает?

Вообще, учитывая наличие глюка PDC при работе на передачу из SDRAM, вполне можно ожидать какой-нибудь косяк и здесь sad.gif
Go to the top of the page
 
+Quote Post
fantex
сообщение May 21 2009, 06:44
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Только что попробовал. Данный исходый код работает без проблем. SRAM внешняя 45нс.

dword framesCount = 0;

char txbuf[0x100];
char rxbuf[0x100];

for (int i = 0; i < 0x100; i++)
{
txbuf[i] = i;
rxbuf[i] = 0xFF;
};

PMC->PCER = PID::SPI;
SPI->MR = 0x00000085;
SPI->CR = 1;
SPI->CSR[0] = 0x0302;

SPI->PDC.RPR = &rxbuf;
SPI->PDC.RCR = 0x100;
SPI->PDC.TPR = &txbuf;
SPI->PDC.TCR = 0x100;
SPI->PDC.PTCR = 0x101;

dword *p = (dword*)0x10000000;

int j = 0;
int c = 0;
int cr = 0;

while(1)
{
if (SPI->SR & 0x200)
{
j = 0;

for (int i = 0; i < 0x100; i++)
{
if (rxbuf[i] != i) { j += 1; };
};

if (j != 0) { c += 1; };

cr += 1;

SPI->PDC.RPR = &rxbuf;
SPI->PDC.RCR = 0x100;
SPI->PDC.TPR = &txbuf;
SPI->PDC.TCR = 0x100;
SPI->PDC.PTCR = 0x101;
};

//framesCount++;
p[0] = framesCount++;

if (framesCount&512)
{
Printf(0, 1, "%08lX %08lX", cr, c);
};
};

При чём, поигравшись со значением CSR0.SCBR (строка в исходнике SPI->CSR[0] = 0x0202;) действительно идут ошибки при тактовой частоте 24МГц и выше. При частоте 16МГц ошибок нет
Go to the top of the page
 
+Quote Post
Intel4004
сообщение May 21 2009, 07:43
Сообщение #4


Участник
*

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



Цитата(aaarrr @ May 20 2009, 23:55) *
А SPI в каком режиме работает?

Угу. Я вчера под вечер отключил мозг и сел тупо перебирать все возможные значения в регистрах SPI_MR и SPI_CSR[0]. На наличие эффекта влияют только в SCBR и DLYBCT в SPI_CSR[0]. Остальное не влияет.
Глюк пропадает на скоростях MCK/5 и ниже и при задержке между байтами 2 (т.е. 64 такта) и больше. Оба варианта роняют скорость весьма ощутимо...
Вдогонку: Это при тех настройках SMC, что в первом посте. Чем тормознее память, тем сильнее надо тормозить SPI...

Цитата(aaarrr @ May 20 2009, 23:55) *
Вообще, учитывая наличие глюка PDC при работе на передачу из SDRAM, вполне можно ожидать какой-нибудь косяк и здесь sad.gif

Ну, этот глюк хотя-бы в еррате описан. И логически понятен: полезли в SDRAM одновременно двое - один обломался. Т.е. это глюк SRDAMC, а не PDC. А здесь - непонятно и нелогично...

Цитата(fantex @ May 21 2009, 10:44) *
При чём, поигравшись со значением CSR0.SCBR (строка в исходнике SPI->CSR[0] = 0x0202;) действительно идут ошибки при тактовой частоте 24МГц и выше. При частоте 16МГц ошибок нет

Спасибо. Т.е. глюк все-таки в процессоре, а не у меня...
Блин, второй раз обнаруживаю в атмеловских процессорах глюки не описанные в errata. Пойти что-ли к ним бетатестером smile.gif)

Сообщение отредактировал Intel4004 - May 21 2009, 07:32
Go to the top of the page
 
+Quote Post
fantex
сообщение May 21 2009, 08:18
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Скорее всего ето не глюк, а специфика работы контролера памяти, так как контролер работает одновременно с флэш, внутренней sram и внешней sram, и просто не успевает на такой частоте обрабатывать запросы.
Go to the top of the page
 
+Quote Post
Sanya_kv
сообщение May 22 2009, 07:26
Сообщение #6


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

Группа: Свой
Сообщений: 185
Регистрация: 25-02-09
Из: Россия
Пользователь №: 45 369



unsigned char Buf1[0x100];
unsigned char Buf2[0x100];
Объяви как статические wink.gif
Go to the top of the page
 
+Quote Post
fantex
сообщение May 22 2009, 13:12
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Цитата(Sanya_kv @ May 22 2009, 11:26) *
unsigned char Buf1[0x100];
unsigned char Buf2[0x100];
Объяви как статические wink.gif


Безпонтово, только что проверил.
Go to the top of the page
 
+Quote Post

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

 


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


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