Цитата(defunct @ May 15 2009, 01:26)

Дык, а где код которым Вы собсно DMA инициализируете на передачу?
Код
xx_TPR = (U32)&pRing->storage[ pRing->CurrFrameHead ];
xx_TCR = pRing->CurrFrameSize;
xx_PTCR = AT91C_PDC_TXTEN; // enable transfer
Спасибо за ответ.
Извиняюсь за неполноту, привожу функцию (это код взятый из файла spi.c в примерах от атмела):
unsigned char SPI_WriteBuffer(AT91S_SPI *spi, void *buffer, unsigned int length)
{
// Check if first bank is free
if (spi->SPI_TCR == 0) {
spi->SPI_TPR = (unsigned int) buffer;
spi->SPI_TCR = length;
spi->SPI_PTCR = AT91C_PDC_TXTEN;
return 1;
}
// Check if second bank is free
else if (spi->SPI_TNCR == 0) {
spi->SPI_TNPR = (unsigned int) buffer;
spi->SPI_TNCR = length;
return 1;
}
// No free banks
return 0;
}
Есть значительное сходство с Вашим ответом. Порылся еще в поиске. В одном из сообщений говорилось, что при использовании DMA необходимо одновременно запускать процедуры для приема и передачи данных (в частности настраивать регистры SPI_TCR и SPI_TRCR на одинаковое количество). Сделал так - заработало, но нестабильно - данные передаются без остановки примерно до 500 байт, при заданной длине длине свыше примерно 500 передаются каждый раз разное количество байт (в диапазоне от 500 до 1000) причем количество переданных байт всегда равно количеству принятых. Мне же требуется передать блок данных от 10кБ до 50 кБ.
Работаю с JTAG-отладчиком (IAR+MT_Link) - может он как-то влиять на работу DMA?