Arduino Due как Triggered DMA SPI Slave - возможно?

Возможно ли, чтобы arduino выполнял функцию DMA-SPI-ведомого устройства, которое может обмениваться данными SPI (uint16_t TX[10] и RX[10]) в активированном подчиненном режиме?

У меня есть настройка, в которой период времени очень короткий (~500 МС/цикл). поэтому мне нужно обмениваться данными с другим микроконтроллером (действующим как "Мастер") в течение установленного срока. Некоторые другие задачи также должны быть обработаны. Вот почему я должен перейти на DMA и быструю передачу данных без вмешательства процессора. Все доступные коды должны использоваться в основном режиме SPI. Ни один из них не находится в подчиненном режиме. Я написал код, но не могу реализовать передачу, инициированную оборудованием SPI. Также как реализовать полное прерывание передачи данных после того, как все 10 данных(16 бит) были переданы и получены? Вот мой код инициализации:

    void DMAslaveBegin()
{
    // Configure the pins for SPI in peripheral mode
    PIO_Configure(
        g_APinDescription[PIN_SPI_MOSI].pPort,
        g_APinDescription[PIN_SPI_MOSI].ulPinType,
        g_APinDescription[PIN_SPI_MOSI].ulPin,
        g_APinDescription[PIN_SPI_MOSI].ulPinConfiguration);
    PIO_Configure(
        g_APinDescription[PIN_SPI_MISO].pPort,
        g_APinDescription[PIN_SPI_MISO].ulPinType,
        g_APinDescription[PIN_SPI_MISO].ulPin,
        g_APinDescription[PIN_SPI_MISO].ulPinConfiguration);
    PIO_Configure(
        g_APinDescription[PIN_SPI_SCK].pPort,
        g_APinDescription[PIN_SPI_SCK].ulPinType,
        g_APinDescription[PIN_SPI_SCK].ulPin,
        g_APinDescription[PIN_SPI_SCK].ulPinConfiguration);
    PIO_Configure(
        g_APinDescription[PIN_SPI_SS0].pPort,
        g_APinDescription[PIN_SPI_SS0].ulPinType,
        g_APinDescription[PIN_SPI_SS0].ulPin,
        g_APinDescription[PIN_SPI_SS0].ulPinConfiguration); 
    //pmc_enable_periph_clk(ID_SPI0);
#if USE_SAM3X_DMAC
    pmc_enable_periph_clk(ID_DMAC);
    DMAC_Disable();
    DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_FIXED;  //Fixed priority arbiter
    DMAC_Enable();

#if USE_SAM3X_BUS_MATRIX_FIX    // not active here
    MATRIX->MATRIX_WPMR = 0x4d415400;
    MATRIX->MATRIX_MCFG[1] = 1;         //Single Access
    MATRIX->MATRIX_MCFG[2] = 1;         //Single Access
    MATRIX->MATRIX_SCFG[0] = 0x01000010;
    MATRIX->MATRIX_SCFG[1] = 0x01000010;
    MATRIX->MATRIX_SCFG[7] = 0x01000010;

#endif  // USE_SAM3X_BUS_MATRIX_FIX
#endif  // USE_SAM3X_DMAC
    //  initialize SPI controller - Slave mode
    SPI.begin(_pin);
    SPI_Disable(SPI0);
    REG_SPI0_CR = SPI_CR_SWRST;     // reset SPI
    REG_SPI0_CR = SPI_CR_SPIEN;     // enable SPI
    REG_SPI0_MR = 0x10;              // DLYBCS=0, PCS=0, MODFDIS=1, PS=0, MSTR=0(slave)
    REG_SPI0_CSR = 0x80;            // DLYBCT=0, DLYBS=0, SCBR=0, 16 bit transfer, Mode 0/1
    REG_SPI0_IDR = ~SPI_IDR_RDRF;
    REG_SPI0_IER = SPI_IDR_RDRF;
    NVIC_EnableIRQ(SPI0_IRQn);
    SPI_Enable(SPI0);
}

Является ли это допустимым условием для DMA? Как я могу использовать обработчик SPI ISR, подобный системе в DMA, для своего кода, чтобы полная транзакция (одновременная передача и прием) стала полностью автоматической без использования процессора?

, 👍0

Обсуждение

Это более чем вероятно. Однако мы, простые пользователи Arduino, вероятно, недостаточно осведомлены о SDK Atmel и работе микроконтроллера Due, чтобы дать вам лучший ответ. Вашим лучшим источником информации, вероятно, будет специальный форум Atmel ARM MCU. Тот, который работает на более профессиональном уровне, чем Arduino., @Majenko

Спасибо. Я отправлю сообщение. но прерываются ли обратные вызовы DMA на SPI?, @souravg009

Что говорится в руководстве по API datasheet / SDK?, @Majenko

PDC может использовать обработчик, но я не смог найти обработчик DMA для подчиненного режима SPI. Раздел DMAC данных также является беспорядочным., @souravg009

Я не думаю, что DMA действительно заботится о том, в каком "режиме" работает SPI., @Majenko

Глядя на таблицу данных, хотя в ней говорится только о dma в главном режиме, так что, возможно, это невозможно..., @Majenko

Ваша точка зрения может быть верной относительно того, что "DMA действительно заботится о том, в каком "режиме" работает SPI".@Майенко. Мы используем буферы SPI RX и TX в качестве источника и назначения соответственно. Таким образом, аппаратное обеспечение SPI обрабатывает всю передачу данных и прерывания; после этого DMA берет на себя взаимодействие с памятью. DMA и SPI имеют отдельные часы и должны быть активированы отдельно. Это доказательство того, что два модуля разделены. Кроме того, DMA действует от имени процессора, поэтому он должен находиться в главном режиме. Затем, как мы можем включить и получить доступ к прерыванию "Передача с цепным буфером завершена"?, @souravg009

Я думаю, что нашел решение во время поиска: https://github.com/avrxml/asf/blob/master/sam/drivers/spi/spi_dmac_slave_example/spi_dmac_slave_example.c Это пример для sam3X8EK от Atmel. Но ядра MCU одинаковые. Хотя код служит другой цели, мы можем формировать его в нужном нам направлении. Осталось только протолкнуть через него массив. Товарищи, как вы думаете?, @souravg009


1 ответ


0

Я думаю, что нашел решение во время поиска: https://github.com/avrxml/asf/blob/master/sam/drivers/spi/spi_dmac_slave_example/spi_dmac_slave_example.c

Это пример для sam3X8EK от atmel. Но ядра MCU одинаковы. Хотя код служит другой цели, мы можем изменить его в нужном нам направлении. Единственное, что оставалось сделать, это протолкнуть массив через него. Ребята, что вы думаете?

,