主题中讨论的其他器件:HALCOGEN
工具与软件:
您好(Jagadish)、
我一直在按照 span227的指示实施具有 DMA 的 ADC。 我需要从特定(单)通道获取20个样本并将其存储到 RAM 中。 为了简化操作、我首先通过单个样本触发 DMA 请求。
// // Inside void main() // adcInit(); adcREG1->ADG1CHNSELMODECTRL = 0x0A; // enable enhanced channel selection mode for group1 adcREG1->ADG1MAXCOUNT = 1; // 1 conversion total adcREG1->ADG1CURRCOUNT = 0; // clear group1 current_count counter adcREG1->G1DMACR = 0x09; // DMA request on group1 conversion end adcEnableNotification(adcREG1, adcGROUP1);
// // Inside void main() // dmaEnable(); dmaReqAssign(1, 10); dmaConfigCtrlPacket( ADG1_ptr, // control packet for group1 (uint32)(&adcREG1->GxBUF[1]), // group1 results FIFO (uint32)(&adc1_G1_results), // group1 results in CPU data RAM 1, // number of frames to be transferred 1, // number of elements per frame 0, // next channel to be chained, 0 = disable chaining 2, // read element size (32 bits) 2, // write element size (32 bits) 1, // transfer type = 1 ==> block transfer 0, // read addressing mode = 0 ==> fixed 1, // write addressing mode = 1 ==> post-incremented 1, // autoinit enabled 0, // read address element index offset = 0 0, // write address element index offset = 0 0, // read address frame index offset = 0 0 // write address frame index offset = 0 ); dmaSetCtrlPacket(DMA_CH1, *ADG1_ptr); dmaEnableInterrupt(DMA_CH1, BTC); dmaSetChEnable(DMA_CH1, DMA_HW);
并在具有足够堆栈分配的任务中打印结果:
// // Inside task // while (1) { adcStartConversion(adcREG1, adcGROUP1); printf("ADC: %u\n", adc1_G1_results[0]); vTaskDelay(xDelay); }
在处理 每帧不同数量的元素(1、5、20)后、我能够通过调试器看到 DMA 引擎将请求的计数转移到目标 RAM 缓冲区中。 我不使用连续转换-在 以下主题中读取 Sunil Oak 的响应后: e2e.ti.com/.../tms570lc4357-dma-with-adc-in-continuous-mode
遗憾的是、在不改变照明水平的情况下、我从 Launchpad 套件通道6上的光电晶体管得到了非常奇怪的结果。 我知道它会打印整个 uint32 、包括标志和通道 ID、但读数差异仍然很大(在单个恒定通道的上下文中)。 其内容如下所示:
ADC: 0 ADC: 68347 ADC: 68347 ADC: 68347 ADC: 68348 ADC: 2812 ADC: 2811 ADC: 68347 ADC: 2812 ADC: 2811
我也很难理解以下内容:
1. ADC 和 DMA 中断通知都不会被触发。 我不仅尝试使用 HALCoGen 功能(如上述代码片段中所示)、还通过在 INT 使能寄存器中分配适当的位字段值进行了尝试。
void dmaGroupANotification(dmaInterrupt_t inttype, uint32 channel) { sciSendByte(scilinREG, 'D'); return; } void adcNotification(adcBASE_t *adc, uint32 group) { sciSendByte(scilinREG, 'A'); return; }
我的 GIO 和 SCI 中断(FIQ/IRQ)能够正常工作(在 FreeRTOS 环境中)。
2. API 中提及的 ADC 存储对象与 TRM 之间的关系是什么:
- (API) GxBUF[...] -数组(8 *(uint32_t))=(8 * 4字节)=每组32字节
- (TRM) ADC FIFO RAM -"转换结果存储在 a. 64字存储器 (SRAM)。" 这意味着总共64 * 4 = 256个字节、每个组~85个字节
- (TRM)"ADBNDEND 包含一个名为 BNDEND 的3位字段、用于配置可用总存储器。 满量程
模块最多可支持1024个缓冲器。 该器件最多支持对两个 ADC 使用64个缓冲器
供电"。
3.基于上述情况, DMA 传输应该考虑哪些因素? 如何配置 ADC FIFO 以实现最佳的 DMA 传输效率?
我希望我的帖子不是那么压倒性,但我真的花了大约一个星期的研究,我是无处可去。
非常感谢使用任何其它最新的示例代码。。。
感谢您的理解和诚挚的问候、
Varban