adsp 21361 AMI : иногда "проглатывает" команды чтения и записи. Сигнал ACK использовать невозможно (не разведен).
Сооотв в регистре он выключен.
Состояние шины DSP смотрим логическим анализатором.
Создается впечатление, что CPU core вообще не ждет готовности AMI(ext memory interface).
Если после каждой записи поставить сброс буферов в шину, все гораздо лучше.
Но если прибавить waitstate до 32, то в линию вообще выдается постоянно 0.
Первый раз с таким сталкиваюсь.
Пропадаю.
*pAMICTL1= PREDIS | RHC2 | /*RHC1 |*/ AMIFLSH | IC7 | HC2 | /*HC1 |*/ WS12 | PKDIS | BW32 | AMIEN; /* sram, 32 bit bus */
/* SRAM тест 1 */
for(addr= 0; addr <= SRAM_SIZE; addr++)     /* пишем по нечетным адресам 0xffff_ffff, по четным 0x0000_0000 */
    {p= (volatile unsigned int *)(EXT_BUS_BANK1_ADDR | addr);
     *pAMICTL1|= AMIFLSH;
     if(addr & 0x01)
        {*p= 0xffffffff; continue;}
     *p= 0x00000000;
    }
for(r=0x100; r; r--) continue;    /* задержка */
for(addr= 0; addr <= SRAM_SIZE; addr++)    /* проверяем, что по нечетным адресам 0xffff_ffff, по четным 0x0000_0000 */
    {p= (volatile unsigned int *)(EXT_BUS_BANK1_ADDR | addr);
     *pAMICTL1|= AMIFLSH;  
     v= *p;
     if(addr & 0x01)
        {if(v == 0xffffffff) continue;}
     else
        {if(!v) continue;}  
     return 0;
    }  
    
/* SRAM тест 2 */  
for(r=0x100; r; r--) continue;    /* задержка */   
for(addr= 0; addr <= SRAM_SIZE; addr++)    /* пишем по нечетным адресам 0x0000_0000, по четным 0xffff_ffff */
    {p= (volatile unsigned int *)(EXT_BUS_BANK1_ADDR | addr);
     if(*pAMICTL1 & AMIFLSH) continue;
     if(addr & 0x01)
        {*p= 0x00000000; *pAMICTL1|= AMIFLSH; continue;}
     *p= 0xffffffff; *pAMICTL1|= AMIFLSH;
    }
for(r=0x100; r; r--) continue;    /* задержка */    
for(addr= 0; addr <= SRAM_SIZE; addr++)    /* проверяем, что по нечетным адресам 0x0000_0000, по четным 0xffff_ffff */
    {p= (volatile unsigned int *)(EXT_BUS_BANK1_ADDR | addr);
     v= *p;
     if(addr & 0x01)
        {if(!v) continue;}  
     else
        {if(v == 0xffffffff) continue;}     
     return 0;
    }
 
++