Добрый день!
Использую DMA для передачи значений АЦП в буфер (массив из 4652 ячеек). Останов преобразований АЦП происходит в произвольный момент времени. Однако регистр DMA.CH0.TRFCNT всегда считываю равным 4652.
Подскажите, пожалуйста, в чем ошибка?
Я пишу в буфер по кругу (т.е. когда дохожу до конца массива перепрыгиваю на начало), поэтому мне необходимо знать номер ячейки массива, где записана последняя точка.
Инициализацию DMA и считывание регистра DMA.CH0.TRFCNT следующим образом:
Код
void DMAC_init()
{
DMA.CTRL=0;//DMA отключен
DMA.CH0.CTRLA|=(1<<7)|(1<<2);//посылка из 1 байта
//разрешение работы 0 канала DMA
//singleshot
DMA.CH0.ADDRCTRL|=(1<<3)|(1<<2);//Начальное значение перезагружается
// в регистр адреса получателя DMA в конце каждой транзакции
DMA.CH0.ADDRCTRL|=(1);//Инкрементное увеличение адреса получателя
DMA.CH0.TRIGSRC=0x20;//Запуск оn ADCB
DMA.CH0.TRFCNT=4652;//Количество байт в блоке
DMA.CH0.SRCADDR0=0x64;//младший байт адреса RESL ADCB.CH0
DMA.CH0.SRCADDR1=0x02;//старший байт адреса RESL ADCB.CH0
DMA.CH0.DESTADDR0=((int)&Ch0)&255;
DMA.CH0.DESTADDR1=((int)&Ch0)>>8;
}
void main
{
DMAC_init();
DMA.CTRL|=(1<<7);//Включили DMA
ADCB_init();
ADCB.CTRLA|=1;//Включаем АЦП
ADCB.CTRLB|=(1<<3); // Старт первого преобразования АЦП
//.... //работа DMA;
ADCB.CTRLA=0;//Отключил АЦП
unsigned int ch_i;
ch_i=DMA.CH0.TRFCNT;
}
Заранее спасибо!