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

ILI9341 DMA SPI PIC18F47k42


serg123

Рекомендуемые сообщения

Привет народ, собираю проект с использованием дисплея ILI9341 и PIC18F47k42. Сейчас все работает просто через SPI. Так вот вопрос, никто не использовал похожую связку с использованием DMA? И еще скорее всего у меня проблема в этом можно ли передавать команды просто по SPI, а  данных по DMA не отключая модуль DMA.

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

06.04.2021 в 22:53, serg123 сказал:

не отключая модуль DMA.

Да, можно. Передача данных через ДМА никак не препятствует одновременной передаче данных программным способом, а равно через другой канал ДМА. Арбитр шины будет действовать при конфликтах доступа на основании настройки приоритетов.

戦う前に相手のベルトの色に注目

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Начал тестить по такой инициализации DMA

void DMA1_Initialize(void) {   
    
    /* stop and clear DMA 1  */
   // DMA1CON0 = 0;

    /* configure DMA 1 */

    /* 1. Program the appropriate Source and Destination addresses for the
     * transaction into the DMAxSSA and DMAxDSA registers
     */
    DMA1SSA = (uint24_t) & SrcVarName0[0]; /* source address */
    DMA1DSA = (uint24_t) & SPI1TXB; /* destination address */

    /* 2. Select the source memory region that is being addressed by DMAxSSA
     * register, using the SMR<1:0> bits.
     */
    DMA1CON1bits.SMR = 0b00; /* source pointer points to GPR space */

    /* 3. Program the SMODE and DMODE bits to select the addressing mode.
     */
    DMA1CON1bits.SMODE = 0b01; /* source is incremented after each transfer completion */
    DMA1CON1bits.DMODE = 0b00; /* destination remains unchanged after each transfer completion */

    /* 4. Program the Source size DMAxSSZ and Destination size DMAxDSZ
     * registers with the number of bytes to be transferred. It is recommended
     * for proper operation that the size registers be a multiple of each other.
     */
    DMA1SSZ = 9; /* source transfer size is size of array */
    DMA1DSZ = 1; /*  destination size 1 */


    /* 5. If the user desires to disable data transfers once the message has
     * completed, then the SSTP and DSTP bits in DMAxCON0 register need to be set
     */
    DMA1CON1bits.SSTP = 1; /* SIRQEN bit is cleared when source counter reloads */
    DMA1CON1bits.DSTP = 0; /* SIRQEN bit is not cleared when Destination Counter reloads */

    /* 6. If using hardware triggers for data transfer, setup the hardware
     * trigger interrupt sources for the starting and aborting DMA transfers
     * (DMAxSIRQ and DMAxAIRQ), and set the corresponding interrupt request
     * enable bits (SIRQEN and AIRQEN).
     */
    DMA1SIRQ = 21; /* HW trigger is SPI1TX */
    DMA1AIRQ = 0; /* none */

    /* enable hardware source trigger  */
    DMA1CON0bits.DMA1SIRQEN = 0;
    
    //PIE2bits.DMA1SCNTIE = 1; // Enable Source Count 0 Interrupt
   //PIE2bits.DMA1SCNTIE = 0; 
	//DMA1_SetSCNTIInterruptHandler(DMA1_DefaultInterruptHandler);


    
    
    //
   PIR2bits.DMA1SCNTIF = 0; // Clear Source Count Interrupt Flag bit
   PIE2bits.DMA1SCNTIE = 0; // Disable Source Count Interrupt
   PIR2bits.DMA1AIF = 0; // Clear abort Interrupt Flag bit
   PIR2bits.DMA1ORIF = 0; // Clear overrun Interrupt Flag bit
   //
   // Can use DMAxDCNTIF to signal when DMA x transfer is complete
   PIR2bits.DMA1DCNTIF = 0; // Clear Destination Count Interrupt Flag bit
   PIE2bits.DMA1DCNTIE = 0; // Disable Destination Count 0 Interrupt
   //
   PIE2bits.DMA1AIE = 0; // Disable abort Interrupt
   PIE2bits.DMA1ORIE = 0; // Disable overrun Interrupt 
 //
    /* 7. Select the priority level for the DMA
     * (see Section 3.1 ?System Arbitration?) and lock the priorities
     * (see Section 3.1.1 ?Priority Lock?)
     * 0 being the highest priority and 4 being the lowest priority.
     */
    m_ARBITER_UNLOCK(); /* unlock Arbiter settings */
    MAINPR = 3;
    ISRPR = 2;
    DMA1PR = 0;
    DMA2PR = 1;
    SCANPR = 4;
    m_ARBITER_LOCK(); /* lock Arbiter settings */

    /* 8. Enable the DMA (DMAxCON0bits. EN = 1)
     */
    DMA1CON0bits.EN = 1;

    /* 9. If using software control for data transfer, set the DGO bit,
     * else this bit will be set by the hardware trigger.
     */
    DMA1CON0bits.DGO = 1;
    
    /*
     * DMA Transfer is started with 
     *    MA1CON0bits.DMA1SIRQEN = 1;
     */

}

Старт передачи пакета 

void SendPktToSlave(void) // Enable DMA1 to send a full data packet according to DMA1SSZ size
{
 
   PIE2bits.DMA1SCNTIE = 1; // Enable Source Count 0 Interrupt
   DMA1CON0bits.SIRQEN = 1; // Start of Transfer Interrupt Request Enable
   DMA_Busy = 1; 	// признак занятости шины
}

И прерывание по завершению передачи пакета

void __interrupt (irq(IRQ_DMA1SCNT)) DMA1Complete(void) //Enabled 10-Jul-2019
{
// ------- DMA 1 DCount = 0 Interrupt (DMA - SPI1 Transfer is complete) ------------------------
DMA_Busy = 0;
PIR2bits.DMA1SCNTIF = 0; // Clear Destination Count Interrupt Flag bit
PIE2bits.DMA1SCNTIE = 0; // Disable Destination Count 0 Interrupt
}

Так вот при этом не срабатывает прерывание.

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

У вас в качестве реквестов ДМА использовано событие поднимающее флаг прерывания SPI Tx. Но после старта ДМА не может произойти события вызывающего реквест, поскольку буфер изначально пуст. Поэтому нужно первый байт в SPI Tx запустить руками.

 

戦う前に相手のベルトの色に注目

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

Перед началом рабы DMA устанавливается бит  SPI1INTFbits.SPI1TXUIF = 1; в общем заказал логический анализатор надо посмотреть что там вообще происходит.

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

9 часов назад, serg123 сказал:

Перед началом рабы DMA устанавливается бит

Без шансов. Установка бита вручную не имеет ничего общего С СОБЫТИЕМ, которое устанавливает этот бит. Не флаг является реквестом, а то самое событие. Событие завершения передачи является общим для триггера флага и для реквеста. Сгенерировать событие вручную невозможно.

ЗЫ. Ваша ситуация является стандартной при работе передатчиков любого коммуникационного модуля. В PIC24 для этого есть бит FORCE, который позволяет запустить первую транзакцию без ручной пересылки в передатчик. В STM32 этот вопрос решен встроенной автоматикой контроллера DMA.

Собственно такое положение вещей связано с топологией сигналов. Сигнал завершения передачи формируется в модуле SPI и из него идет ОДНОВРЕМЕННО в мультиплексор контроллера DMA и в контроллер прерываний. И в этих двух РАЗНЫХ контроллерах этот сигнал ЗАЩЕЛКИВАЕТСЯ системным клоком в соответствующем машинном такте. Системный клок поступает на все модули параллельно.

Никто не будет тянуть из контроллера прерываний еще пук линий в контроллер ДМА, занимая площадь на медном слое чипа.

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

戦う前に相手のベルトの色に注目

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

Там не в чем разбираться. Запустите одну пересылку вручную или переключите реквесты на таймер, например. Тут же получите останов на бряке в прерывании по ДМА.

戦う前に相手のベルトの色に注目

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...