Третий день бодаюсь. Сдался, пишу сюда. Ситуация такая: 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);
|