Перейти к содержанию
    

UART DMA. Проблема с посылкой.

Пытаюсь послать

void DMA_Start(uint8_t *data, uint32_t pakage_size)
{
    while ((DMA_TCD0_CSR & DMA_CSR_DONE_MASK) == 0);

    //size to be transferred - reload each request
    DMA_TCD0_NBYTES_MLNO = pakage_size;

    //set memory address for source and destination 
    DMA_TCD0_SADDR = (uint32_t)&data;
    DMA_TCD0_DADDR = (uint32_t)&UART0_D;

    //current major iteration count
    DMA_TCD0_CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(1);
    //starting major iteration count
    DMA_TCD0_BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(1);

    //enable auto disable request feature
    DMA_TCD0_CSR |= DMA_CSR_DREQ_MASK;
    //enable major interrupt
    DMA_TCD0_CSR |= DMA_CSR_INTMAJOR_MASK;

    //enable request signal for channel 0
    DMA_ERQ = DMA_ERQ_ERQ0_MASK;
}

При вызове DMA_Start вроде как функция отрабатывает, по крайней мере не получаю никаких исключений. Но физически я не вижу чтоб что то выходило наружу на TX пине.

Как можно отследить что DMA активный?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тяжело телепатически определить тип вашего контроллера, но в тех, с которыми я работал, уменьшался регистр размера пересылаемого блока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, Сергей Борщ said:

Тяжело телепатически определить тип вашего контроллера, но в тех, с которыми я работал, уменьшался регистр размера пересылаемого блока.

Это NXP Kinetis.

DMA_Start(sendBuff, 9);
if (DMA_TCD0_CSR & DMA_CSR_ACTIVE_MASK)
	flag = 1;
else
	flag = 0;

флаг активности не подымается.

а размера пересылаемого блока где смотреть, в  Current Major Iteration Count? (DMA_TCD0_CITER_ELINKNO).


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 1/3/2022 at 1:36 PM, jenya7 said:

Пытаюсь послать


void DMA_Start(uint8_t *data, uint32_t pakage_size)
{
    while ((DMA_TCD0_CSR & DMA_CSR_DONE_MASK) == 0);

    //size to be transferred - reload each request
    DMA_TCD0_NBYTES_MLNO = pakage_size;

    //set memory address for source and destination 
    DMA_TCD0_SADDR = (uint32_t)&data;
    DMA_TCD0_DADDR = (uint32_t)&UART0_D;

    //current major iteration count
    DMA_TCD0_CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(1);
    //starting major iteration count
    DMA_TCD0_BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(1);

    //enable auto disable request feature
    DMA_TCD0_CSR |= DMA_CSR_DREQ_MASK;
    //enable major interrupt
    DMA_TCD0_CSR |= DMA_CSR_INTMAJOR_MASK;

    //enable request signal for channel 0
    DMA_ERQ = DMA_ERQ_ERQ0_MASK;
}

При вызове DMA_Start вроде как функция отрабатывает, по крайней мере не получаю никаких исключений. Но физически я не вижу чтоб что то выходило наружу на TX пине.

Как можно отследить что DMA активный?

С Kinetis дело не имел, но где-то надо настроить и UART на то, чтобы оно работало с DMA: посылало ему запросы по биту освободившегося буфера в UART. Может вы этого не сделали, вот DMA и ждет безуспешно запроса?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, KnightIgor said:

С Kinetis дело не имел, но где-то надо настроить и UART на то, чтобы оно работало с DMA: посылало ему запросы по биту освободившегося буфера в UART. Может вы этого не сделали, вот DMA и ждет безуспешно запроса?

почему то пока не включил прерывание на отправку не работало (DMA_CSR_DONE_MASK не подымался)

UART0_C2 |= UART_C2_TIE_MASK;

и minor/ major loops нужно определить наоборот

DMA_TCD0_NBYTES_MLNO = 1;

DMA_TCD0_CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(pakage_size);
DMA_TCD0_BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(pakage_size);

    

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...