完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 xianglong1712 于 2013-9-25 16:25 编辑
直接上程序,进不了DMA中断,求大神给与指点: /*给DMA分配两个缓冲区*/ u8 BufferA[BufferSize]; u8 BufferB[BufferSize]; /*配置SPI1端口寄存器(主模式)*/ void Spi1Init(u16 flag) { /*定义引脚*/ DO = 0; DI = 1; CLK = 0; /*清零中断标志位,禁止中断允许位*/ IFS0bits.SPI1IF = 0; IEC0bits.SPI1IE = 0; /*配置控制字CON1*/ SPI1CON1bits.DISSCK = 0; //使用内部SPI时钟 SPI1CON1bits.DISSDO = 0; //SDO1引脚由模块控制 SPI1CON1bits.MODE16 = 0; //采用字节宽通信 SPI1CON1bits.SMP = 1; //在数据输出时间的末端采样输入数据 SPI1CON1bits.CKE = 0; //串行输出数据在时钟从空闲状态转变为工作状态时变化 SPI1CON1bits.CKP = 1; //空闲状态时时钟信号为高电平,工作状态时为低电平 if(flag == 1) { SPI1CON1bits.SPRE = 6; //辅助预分频比为2:1 SPI1CON1bits.PPRE = 2; //主预分频比为4:1 } else { SPI1CON1bits.SPRE = 0; //辅助预分频比8:1 SPI1CON1bits.PPRE = 0; //主预分频比64:1 } SPI1CON1bits.MSTEN = 1; //主模式 /*配置控制字CON2*/ SPI1CON2bits.FRMEN = 0; //禁止帧SPI1支持 /*配置SPI1状态和控制寄存器*/ SPI1STATbits.SPISIDL = 0; //空闲模式下模块继续工作 SPI1STATbits.SPIROV = 0; //清零溢出标志位 SPI1STATbits.SPIEN = 1; //使能SPI1模块 /*清零中断标志位,使能中断允许位*/ IFS0bits.SPI1IF = 0; IEC0bits.SPI1IE = 1; } /*配置DMA0用于写数据操作*/ void Dma0InitTX(void) { /*将DMA0与外设SPI1关联*/ DMA0REQ = 0x000A; /*正确配置外设SPI1,设置前先禁止SPI1*/ CloseSPI1(); Spi1Init(1); /*存储器地址初始化*/ DMA0STAL = (volatile u16)BufferA; DMA0STAH = 0x0000; DMA0STBL = (volatile u16)BufferB; DMA0STBH = 0x0000; /*选择DMA通道0外设地址寄存器SPI1*/ DMA0PAD = (volatile u16) &SPI1BUF; /*DMA0传输计数设置*/ DMA0CNT = (BufferSize - 1); /*配置DMA0的控制、状态位*/ DMA0CONbits.SIZE = 1; DMA0CONbits.DIR = 1; DMA0CONbits.HALF = 0; DMA0CONbits.AMODE = 0; DMA0CONbits.MODE = 3; /*允许DMA通道0的中断*/ IFS0bits.DMA0IF = 0; IEC0bits.DMA0IE = 1; } /*配置DMA1用于读数据操作*/ void Dma1InitRX(void) { /*将DMA1与SPI1相关联*/ DMA1REQ = 0x000A; /*正确配置外设SPI1*/ CloseSPI1(); Spi1Init(1); /*存储器地址初始化*/ DMA1STAL = (volatile u16)BufferA; DMA1STAH = 0x0000; DMA1STBL = (volatile u16)BufferB; DMA1STBH = 0x0000; /*选择DMA通道1外设地址寄存器SPI1*/ DMA1PAD = (volatile u16) &SPI1BUF; /*DMA1传输计数设置*/ DMA1CNT = (BufferSize - 1); /*配置DMA1的控制、状态位*/ DMA1CONbits.SIZE = 1; DMA1CONbits.DIR = 0; DMA1CONbits.HALF = 0; DMA1CONbits.AMODE = 0; DMA1CONbits.MODE = 3; /*允许DMA通道1的中断*/ IFS0bits.DMA1IF = 0; IEC0bits.DMA1IE = 1; /*使能DMA通道1*/ // DMA1CONbits.CHEN = 1; } /*设置DMA中断处理程序,接收到8个字节的数据后进行DMA传输*/ void __attribute__((__interrupt__, no_auto_psv)) _DMA0Interrupt(void) { IFS0bits.DMA0IF = 0; } void __attribute__((__interrupt__, no_auto_psv)) _DMA1Interrupt(void) { static u16 BufferCount = 0; /*将DMA通道0指向要传输的数据*/ if(BufferCount == 0) { DMA0STAL = (volatile u16)BufferA; DMA0STAH = 0; } else { DMA0STAL = (volatile u16)BufferB; DMA0STAH = 0; } DMA0CONbits.CHEN = 1; //重新允许DMA通道0 DMA0REQbits.FORCE = 1; //强制启动第一次传输 BufferCount ^= 1; IFS0bits.DMA1IF = 0; //清零DMA通道1中断标志位 } 如果哪位用过DMA,求个例程,学习学习:375830746@qq.com |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2095 浏览 1 评论
3648 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2345 浏览 2 评论
2774 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4058 浏览 5 评论
1000浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6386浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 23:28 , Processed in 0.895114 second(s), Total 73, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号