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

 
 
> пробьлема с DMA на msp430f1611, не запускается после стопа
-=Space=-
сообщение Oct 14 2010, 11:49
Сообщение #1


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

Группа: Свой
Сообщений: 105
Регистрация: 14-01-05
Из: Москва Зеленоград
Пользователь №: 1 962



Задача синхронизировать периодический сигнал ЦАП о опорному сигналу.
Хочу сделать так:
1. таймерА сконфигурирован на частоту 409600
2. по DMA передается 1024 точки в ЦАП по триггеру от Таймера А , результат на ЦАПе - синус 400 Гц
3. в прерывании от порта я останавливаю и запускаю DMA, получаем синхронизацию с опорой.

вот так это реализовано
Код
//---------------------------------------------------------------------------------------
void init_DMA(void)
{
    DMACTL0 = DMA0TSEL_1;        // запуск DMA от  CCR2 таймера А
    DMA0SA = (unsigned short)buf_DAC;    // Start block address
    DMA0DA = DAC12_0DAT_;                // Destination block address
    DMA0SZ = BUF_LENGTH;                // Block size    3,6864e6 = 400 * 9 * 1024
    DMA0CTL =
        DMADT_4 +                        // Одиночный перенос с повтором
        DMADSTINCR_0 +                    // Наззначение не инкрементируется
        DMASRCINCR_3 +                    // Источник инкрементируется
        0*DMADSTBYTE +                    // получатель слово
        0*DMASRCBYTE +                    // источник слово
        0*DMAIE;                        // не разрешаем прерывания
    DMA0CTL |=  DMAEN;
}
//---------------------------------------------------------------------------------------
void init_TimerA(void)
{                                                    //   2 - /4
    TACTL = 0;                       // сбрасываем региср управления
    TACTL = ID_0 + TASSEL_2 + TACLR;    // input divider: 0 - /1, тактирование SMCLK
            // Timer A counter clear  - сброс значения в таймере
    TACCTL0 = 0*CCIE;                // Capture/compare interrupt enable
    TACCR0 = 8;                        // Frequency = 409600 Hz = 1024*400
    TACCTL1 = OUTMOD_3;                // режим установки/сброса
    TACCR1 = 6;                        // на значении 6 установится , на 9 сбросится
    TACCTL2 = OUTMOD_3;                // режим установки/сброса
    TACCR2 = 4;                        // на значении 3 установится , на 9 сбросится


    TACTL |= MC_1;                    // Start Timer A in up mode
}

#pragma vector=PORT1_VECTOR
__interrupt void port1_int (void)
{
    LedOn();
    DMA0CTL &=  ~DMAEN;      // ReEnable DMA
    init_DMA();

    P1IFG = 0;
    LedOff();
}



проблема такая:
после
DMA0CTL &= ~DMAEN;
DMA0CTL |= DMAEN;

DMA не возобновляет работу, зависает.
бит DMAEN остается взведенным а передачи нет.
Что не так?

пробовал сбрасывать/устанавливать DMAEN отладчиком без прерываний
пробовал режим DMADT_0 - Одиночный перенос без повторов, тогда DMA срабатывает только один раз.


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Oct 14 2010, 12:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



C багой DMA9, описанной в Errata, случайно никакой связи нет?

Кстати
Цитата("User's Manual MSP430x1xx (Rev.E)")
When selecting the trigger, the trigger must not have already occurred, or the transfer will not take place. For example, if the TACCR2 CCIFG bit is selected as a trigger, and it is already set, no transfer will occur until the next time the TACCR2 CCIFG bit is set.


Сообщение отредактировал rezident - Oct 14 2010, 12:33
Go to the top of the page
 
+Quote Post



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

 


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


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