分享一个OMAPL138上在用GPIO触发EDMA传输,并产生中断的例程。
zhongkui zhang:
你好,可不可以发我邮箱zhangzhongkui1987@163.com,这个我下不下来。谢谢了
nick sun:
不好意思,我好像也下载不不附件,能不能发一份到我的邮箱,sundian2008@yahoo.com.cn,非常感谢!
Tony Tang:
回复 nick sun:
还下不了吗?我试了可以下载的啊。
miker Owen:
回复 Tony Tang:
EDMA3 的紧急事件指的是什么
Tony Tang:
回复 miker Owen:
什么事件是紧急的,是由事件本身的特性决定的,比如McBSP接口,使能后就一直在工作,当数据到了,必需在下一个数据到之前读走,否则就会把McBSP口卡死,而对于一些带FIFO的接口,因为有缓冲,对其事件的响应速度就没那么严格。
在处理上,把紧急的事件映射到高优先级的队列与TC。
yu zhang4:
回复 Tony Tang:
这个例子要怎么在BIOS上实现呢?因为要用到DSPLink!
我在任务中使能BANK的中断(BINTEN |= (1《 GPIO_BANK2)),程序就会挂掉!
(例子是基于3.3下SEED的AD程序实现的,DMA能正常工作,放到readwrite例子下,DMA的目的地址上就没数据)
leo chen:
回复 yu zhang4:
可有linux下相关的例程
maohai tang:
您好,DSP端也可以用GP8中断触发EDMACC1的18通道吗?为什么中断发生了,就是触发不了18通道,无奈只是在GPIO中断服务程序里手动触发18通道。有哪些可能的原因?我的程序是CSL芯片支持里Event触发改的,同为GPIO8中断触发,对应着CC1的18通道 。查了好久,就是没查出来,配置不对?谢谢您,可以看下程序是不是哪配置的不行?
这是通道设置部分的程序,其中edma3ccRegs的基地址为0x01E3 0000:
static void setup_EDMA (void){ // Clear Event Registers CSL_FINST(edma3ccRegs->ECR, EDMA3CC_ECR_REG, MASK); CSL_FINST(edma3ccRegs->SECR, EDMA3CC_SECR_REG, MASK); // Enable Channel 18 to DSP (Region 1) CSL_FINST(edma3ccRegs->DRA[CSL_EDMA3_REGION_1].DRAE,EDMA3CC_DRAE_E18, ENABLE); // Assign Channel 18 to Queue 0 CSL_FINST(edma3ccRegs->DMAQNUM[2], EDMA3CC_DMAQNUM_E2, Q0); // Initialize PaRAM Transfer Context for Event 18 init_PaRAM_event18(); // Enable Interrupts for Channel 18 CSL_FINST(edma3ccRegs->IESR, EDMA3CC_IESR_I18, SET);}/* setup_EDMA */
这是参数设置部分:
static void init_PaRAM_event18(void){ // Reset EDMA PaRAM OPT Register edma3ccRegs->PARAMSET[18].OPT = CSL_EDMA3CC_OPT_RESETVAL; // Config PaRAM OPT (Enable TC Interrupt; Set TCC) edma3ccRegs->PARAMSET[18].OPT = CSL_FMKT(EDMA3CC_OPT_TCINTEN, ENABLE) | CSL_FMK(EDMA3CC_OPT_TCC, 18); // Initialize EDMA Event Src and Dst Addresses edma3ccRegs->PARAMSET[18].SRC = (Uint32)&srcBuffer; edma3ccRegs->PARAMSET[18].DST = (Uint32)&dstBuffer; // Set EDMA Event PaRAM A,B,C CNT edma3ccRegs->PARAMSET[18].A_B_CNT = CSL_FMK(EDMA3CC_A_B_CNT_ACNT, XFER_BYTES) | CSL_FMK(EDMA3CC_A_B_CNT_BCNT, XFER_ARRAYS); edma3ccRegs->PARAMSET[18].CCNT = XFER_FRAMES; // Set EDMA Event PaRAM SRC/DST BIDX edma3ccRegs->PARAMSET[18].SRC_DST_BIDX = CSL_FMK(EDMA3CC_SRC_DST_BIDX_SRCBIDX, SRC_ARRAY_SIZE) | CSL_FMK(EDMA3CC_SRC_DST_BIDX_DSTBIDX, DST_ARRAY_SIZE); // Set EDMA Event PaRAM SRC/DST CIDX edma3ccRegs->PARAMSET[18].SRC_DST_CIDX = CSL_FMK(EDMA3CC_SRC_DST_CIDX_SRCCIDX, 0) | CSL_FMK(EDMA3CC_SRC_DST_CIDX_DSTCIDX, 0); // Set EDMA Event PaRAM LINK and BCNTRLD edma3ccRegs->PARAMSET[18].LINK_BCNTRLD = CSL_FMK(EDMA3CC_LINK_BCNTRLD_LINK, PaRAM_NULL_LINK) | CSL_FMK(EDMA3CC_LINK_BCNTRLD_BCNTRLD, 0);}/* init_PaRAM_event 18 of EMACC1 */由于中断触发触发不了,只好自己在GPIO服务程序里手动触发它一下。
interrupt void GPIO_BNK8_isr (void){ // Disable Interrupt Trigger on Falling Edge gpioRegs->BANK[GP8].CLR_RIS_TRIG = GP8P12; //gpioRegs->BANK[GP8].CLR_FAL_TRIG = GP8P12; printf("GPIO Interrupt occurred!\n"); CSL_FINST(edma3ccRegs->ESR, EDMA3CC_ESR_E18, SET); }
maohai tang:
回复 maohai tang:
漏了个通道使能,这就是手动触发的区别吧,太粗心了,谢谢
maohai tang:
你好:
Tony Tang,GPIO中断触发EDMA已经可以跑起来了,但是关于参数设置这一块还有一些疑惑,向你请教下。
1.A_B_CNT:是不是只要A*B=数据字节数就OK了,没有特殊要求?
2.SRC_DST_BIDX:只要都是对应的数组长度就行了?
3.你的程序里ParameterBase_EDMA_1_36_LINK_BCNTRLD = (0<<16 | 0x480);这里的链接地址代表什么意思
4.我只用了18通道,除了链接地址外,其它的都和你的设的一样,我设的链接地址是空。这会不会有什么影响
5.发现,有的时候并没有传进到目的数组里,但时有发生,比例有个0.2左右,这会是什么原因?