jenya7 0 3 января, 2022 Опубликовано 3 января, 2022 · Жалоба Пытаюсь послать 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 активный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 3 января, 2022 Опубликовано 3 января, 2022 · Жалоба Тяжело телепатически определить тип вашего контроллера, но в тех, с которыми я работал, уменьшался регистр размера пересылаемого блока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 января, 2022 Опубликовано 3 января, 2022 · Жалоба 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 9 января, 2022 Опубликовано 9 января, 2022 · Жалоба 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 и ждет безуспешно запроса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 января, 2022 Опубликовано 10 января, 2022 (изменено) · Жалоба 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); Изменено 10 января, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться