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, для своего кода, чтобы полная транзакция (одновременная передача и прием) стала полностью автоматической без использования процессора?
@souravg009, 👍0
Обсуждение1 ответ
Я думаю, что нашел решение во время поиска: https://github.com/avrxml/asf/blob/master/sam/drivers/spi/spi_dmac_slave_example/spi_dmac_slave_example.c
Это пример для sam3X8EK от atmel. Но ядра MCU одинаковы. Хотя код служит другой цели, мы можем изменить его в нужном нам направлении. Единственное, что оставалось сделать, это протолкнуть массив через него. Ребята, что вы думаете?
- Программирование ведомого SPI для Arduino
- Использование экрана SD-карты на Arduino Due
- Запуск передачи SPI с помощью прерывания в Arduino Due
- 16-битный SPI на Arduino Due
- Поддерживает ли MFRC522 собственный SPI Arduino Due?
- Проблема с настройкой Arduino Due SPI на АЦП.
- Отправка данных через SPI с DMA
- Есть ли хороший справочник для Arduino архитектуры и использования памяти?
Это более чем вероятно. Однако мы, простые пользователи 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