主题中讨论的其他器件: ADS930
你(们)好 我们正在尝试设置 TM4C1294NCPDT EPI 接口以从 ADS930读取数据。
低速读取示例:
我将 EPI 时钟设置为20MHz、工作正常。
然后、我检查使用 DMA 从 EPI FIFO 中读取数据的缓冲区。
馈入 ADS930 ADC 的信号为200kHz 方波、因此我知道我想查看的值是多少、EPI 是否真正使用20MHz 波特率。
我看到、我获得的样本几乎是使用20MHz EPI 时钟时所需的样本数量的两倍。
DMA 和 EPI 配置:
ROM_EPIDividerSet (EPI0_BASE、4); // EPIClk =(Divider = 0)? SYSCLK:(SYSCLK /(((Divider / 2)+ 1)* 2)// 1 -> 120MHz/2,2 un 3 -> 120MHz/4,4 -> 120MHz/6=20MHz ROM_EPImodeSet (EPI0_BASE,EPIMODE_General); EPI_EPIRE_0 (EPSIM0_BASE,EPIRE_GP0_GPIM_0) EPI_NbCONFIG_SIZE、0); ROM_EPIFOConfig (EPI0_BASE、EPI_FIFO_CONFIG_RX_1_8 | EPI_FIFO_CONFIG_RSTALLERR); EPIIntRegister (EPI0_BASE、 EPIInterruptHandler); ROM_EPIIntEnable (EPI0_BASE、EPI_INT_DMA_RX_DONE | EPI_INT_ERR); while (HWREG (EPI0_BASE + EPI_O_STAT)& EPI_STAT_INITSEQ){} ////// DMA 配置////////////////////////////////// //此处对 DMA 使用附加抽象层,但定义相同,因此您应该能够了解 DMA 的配置方式 EPIRXDMA = NAFT::DMA (UDMA_CH30_EPI0RX、UDMA_ARB_1、UDMA_SRC_INC_NONE、UDMA_DST_INC_8、UDMA_SIZE); EPIRXDMA.setHighPriority(true); EPIRXDMA.setUseBurst(true); EPIRXDMA.setDataSource(reinterpret_cast (EPI0_BASE + EPI_O_READFIFO0);
我还检查了 DMA RX 传输完成后是否不再有挂起的 EPI 读操作。 EPINONBlockingReadCount 返回0。
此外、如果 DMA 传输数据速度太慢或繁忙、FIFO 已满且我丢失数据、我还为 RX STALL 启用了中断、但也不会触发该中断-因此 RX FIFO 永远不会满。
我已经尝试过20MHz、15MHz、12MHz 的 EPI 时钟、但在所有情况下波特率都要慢约2倍。
有什么想法吗? 如果有一些帮助、我将不胜感激。
卡利斯