Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: пробьлема с DMA на msp430f1611
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
-=Space=-
Задача синхронизировать периодический сигнал ЦАП о опорному сигналу.
Хочу сделать так:
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 срабатывает только один раз.


rezident
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.
-=Space=-
Да, действительно оно.
Сброс этого флага все решил
Код
    TACCTL2 &= ~CCIFG;


странно другое, я читал еррату,
но этого текста не видел
у меня
Цитата
DMA9 DMA Module
Function Corrupted MAB/MDB during DMA and TB IRQ at high frequency (SMCLK and MCLK
greater than 7 MHz) caused by IRQ chain

и это про другое

если можно ссылочку на ваш еррата


а, нашел, это в даташите.
(надо очень внимательно читать даташиты)
rezident
Цитата(-=Space=- @ Oct 14 2010, 19:35) *
если можно ссылочку на ваш еррата
Ссылка на текущую версию errata в моем предыдущем сообщении. А цитата там вообще-то из юзергайда smile.gif Я же подписал специально, намекая на авторство цитаты.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.