我需要尽快将数据从 Arduino DUE 发送到外部 DAC。为此,我使用 DMA 和 SPI,我希望 DMA 从内存中获取数据并将其发送到 SPI,SPI 将通过其主输出从输入中继它。 到目前为止,我进行了从一个变量到另一个变量的 DMA 传输,完美唤醒。我使用相同的代码但将地址更改为 SPI_TDR(传输数据寄存器),不幸的是它不起作用。我想地址不好,但如果是这样我该怎么办?
这是我的代码:
#include <dmac.h>
#include <SPI.h>
#define DMA_CH 0 //N° Canal du DMA
#define DMA_BUF_SIZE 32 //Taille mémoire DMA
uint32_t g_dma_buf2[DMA_BUF_SIZE];
void setup() {
Serial.begin(9600);
SPI.begin();
SPI0->SPI_WPMR = 0x53504900; //Protection key
SPI0->SPI_IDR = 0x0000070F; //Desactivation interrupts
SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS; //SPI master
}
void loop() {
Serial.println("+++++");
pmc_enable_periph_clk(ID_DMAC);
uint32_t i;
uint32_t cfg;
dma_transfer_descriptor_t desc;
for (i = 0; i < DMA_BUF_SIZE; i++) {
g_dma_buf2[i] = i;
Serial.print(g_dma_buf2[i]);
}
Serial.println();
dmac_init(DMAC);
dmac_set_priority_mode(DMAC, DMAC_PRIORITY_ROUND_ROBIN);
dmac_enable(DMAC);
cfg = DMAC_CFG_SOD_ENABLE | DMAC_CFG_AHB_PROT(1) | DMAC_CFG_FIFOCFG_ALAP_CFG; //Config registre CFG
dmac_channel_set_configuration(DMAC, DMA_CH, cfg);
desc.ul_source_addr = (uint32_t)g_dma_buf2;
desc.ul_destination_addr = SPI0->SPI_TDR;
desc.ul_ctrlA = DMAC_CTRLA_BTSIZE(DMA_BUF_SIZE) | DMAC_CTRLA_SRC_WIDTH_WORD | DMAC_CTRLA_DST_WIDTH_WORD;
desc.ul_ctrlB = DMAC_CTRLB_SRC_DSCR_FETCH_DISABLE | DMAC_CTRLB_DST_DSCR_FETCH_DISABLE | DMAC_CTRLB_FC_MEM2MEM_DMA_FC | DMAC_CTRLB_SRC_INCR_INCREMENTING | DMAC_CTRLB_DST_INCR_FIXED;
desc.ul_descriptor_addr = 0;
SPI_Enable(SPI0);
dmac_channel_multi_buf_transfer_init(DMAC, DMA_CH, &desc);
dmac_channel_enable(DMAC, DMA_CH);
Serial.println("*****");
while (!dmac_channel_is_transfer_done(DMAC, DMA_CH)) { Serial.print('X'); }
Serial.print("SR : "); Serial.println(SPI0->SPI_SR, HEX);
Serial.print("TDR : "); Serial.println(SPI0->SPI_TDR, HEX);
Serial.print("PSR : "); Serial.println(PIOA->PIO_PSR, HEX); //PIO_SODR
Serial.print("OSR : "); Serial.println(PIOA->PIO_OSR, HEX);
Serial.println(DMAC->DMAC_CH_NUM[0].DMAC_SADDR , HEX);
Serial.println(DMAC->DMAC_CH_NUM[0].DMAC_DADDR, HEX);
Serial.println("-----");
}
我主要使用这个例子:https://ww1.microchip.com/downloads/en/Appnotes/Atmel-42291-SAM3A-3U-3X-4E-DMA-Controller-DMAC_ApplicationNote_AT07892.pdf#_OPENTOPIC_TOC_PROCESSING_d91e3076 这是 µc 的数据表:https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet.pdf
你可以在我的代码底部看到几个打印,从中我有很多想法:PIO 是否可以阻止数据?地址 PIO_PA26A_SPI0_MOSI 可以工作吗? SPI 是否会因为不满足条件而阻止数据?
欢迎任何想法,我已经研究了一段时间了。