阅读:1534回复:12
1581固件程序求助
1581dma批量写数据,diow脚连mcu的p1.5,应用程序中的deviceiocontron()发0x80.
固件程序如下: void DMA_Mode(Data) { if(Data)//(批量写) { while(!USB_Int_Flag.BITS.EP2RX) { } D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.WIDTH=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.MODE0=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.MODE1=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.BURST0=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.BURST1=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.BURST2=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.DIS_XFER_CNT=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.ATA_MODE=0; D14_Cntrl_Reg.D14_DMA_HARDWARE.VALUE=0x2f; DMA_Read=1;//p1.5 D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4; EA_DISABLE; USB_Int_Flag.BITS.EP2RX = 0; EA_ENABLE; D14_Cntrl_Reg.D14_DMA_COMMAND=0x00; do { for(Count_PIO = 0 ; Count_PIO < PIO_Count ; Count_PIO++) Endpt_FIFO[PIO_Count] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; }while(!D14_Cntrl_Reg.D14_DMA_INT.BITS.DMA_DONE); DMA_Read=0; } 请大家帮忙看看,提提意见也可. |
|
沙发#
发布于:2004-08-21 14:36
你是用什么模式控制DMA读写?DIOR和DIOW控制,还是DACK控制(好象)?
|
|
|
板凳#
发布于:2004-08-21 19:11
我想用从mdma方式,不过后来看书说mdma方式不用外接电路,只用1581就可以驱动,请问dack,diow,dior,dreq引脚如何与1581连接。
|
|
地板#
发布于:2004-08-21 19:12
错了,应该是mdma主机方式。
|
|
地下室#
发布于:2004-08-21 19:28
metalwing!mdma主机方式,dior,diow引脚接1581的rd,wr就可以了吗?的dreq,dack用连接吗?另外,如果我想bulkout数据(主机到设备),下面的固件程序对吗?
void DMA_Mode(Data) { if(Data)//(批量写) { while(!USB_Int_Flag.BITS.EP2RX) { } D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.WIDTH=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.MODE0=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.MODE1=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.ATA_MODE=1; D14_Cntrl_Reg.D14_DMA_HARDWARE.VALUE=0x2f; DMA_Read=1;//rd D14_Cntrl_Reg.D14_DMA_ENDPOINT = 4; EA_DISABLE; USB_Int_Flag.BITS.EP2RX = 0; EA_ENABLE; D14_Cntrl_Reg.D14_DMA_COMMAND=0x00; do { for(Count_PIO = 0 ; Count_PIO < PIO_Count ; Count_PIO++) Endpt_FIFO[PIO_Count] = D14_Cntrl_Reg.D14_DATA_PORT_LSB; }while(!D14_Cntrl_Reg.D14_DMA_INT.BITS.DMA_DONE); DMA_Read=0; } 谢谢你上次在你的贴子里对我的问题的回答,先放点分表示感谢。 |
|
5楼#
发布于:2004-08-21 20:10
我先看看,明天给你回答,好吗?今天太晚了.呵呵.
"metalwing!",不要激动,气大伤身,呵呵. |
|
|
6楼#
发布于:2004-08-21 20:51
D14_Cntrl_Reg.D14_DMA_HARDWARE.VALUE=0x2f
你到底是DMA从模式(GDMA)还是DMA主模式(MDMA)?你说的是主模式,但 从你的寄存器设置来看是从模式. 在ISP1581的GDMA模式下,DREQ是主动的,即是由1581产生的,而DACK, DIOR,DIOW是被动的,即是外部电路产生的. "dior,diow引脚接1581的rd,wr就可以了吗?的dreq,dack用连接吗", DIOR和DIOW由外部电路产生并直接接到1581的DIOR(14脚)和DIOW(15 脚),而不是RD(26脚)和WR(脚).DREQ应该要连的,除非你能不需要DREQ 的触发而产生DIOR,DIOW,DACK信号(不大可能吧),DACK在你读写时没 有用处,但还是连上吧,反正连上不会出错,不连的话就不敢保证了. "Endpt_FIFO[PIO_Count] = D14_Cntrl_Reg.D14_DATA_PORT_LSB" 你这是干什么?0X00命令是将数据从外部经由DMA总线读到1581的某个 端点(对你的而言是端点4的OUT)的BUFF里,当他读完或达到端点的最 大包时,BUFF自动有效,等待PC(HOST)来取,你不用管他. 另:你好象没有初始化中断使能寄存器(DMA的,0X54),也没有向DMA记 数寄存器(0X34)赋值.再有,你发的命令是0X00,那你管EP2RX干什么? 如果是要将数据从PC(HOST)发到USB的话,应该是0X01命令吧. |
|
|
7楼#
发布于:2004-08-21 21:21
非常感谢!我也没办法,BOSS逼得太紧,而我的硬件基础又太差,不用DMA传输我已经实现了,可是速度太慢。只好用DMA传了。
我想用MDMA(主机)因为我不想外接DMA控制器,DIOR DIOW(输出),DREQDACK(输入)资料说DIORDIOW是由1581驱动的,我应该如何接?硬件寄存器中的MASTER应该置1,我写错了,记 数寄存器(0X34)我在前面用管道0传的,4字节。中断使能寄存器(DMA的,0X54),我在初始化时做的: void DMA_Init(void) { D14_Cntrl_Reg.D14_DMA_INT_ENABLE.BITS.DMA_DONE=0; } 另:你的意思是不是我选通了DMA的DIOR/DIOW、设置了DMA端点和DMA命令后,数据就自动传输,直到计数器为0自动产生中断,而"Endpt_FIFO[PIO_Count] = D14_Cntrl_Reg.D14_DATA_PORT_LSB"是多余的? |
|
8楼#
发布于:2004-08-22 09:41
你说的我怎么和你的程序对不上?
D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.MODE0=0; D14_Cntrl_Reg.D14_DMA_CONFIG.BITS.MODE1=0; 哪一个是MODE,哪一个是DMA_MODE?MODE设为0X00的话,是由DIOR和 DIOW控制读写,DACK没作用."DIOR DIOW(输出),DREQDACK(输入)"? D14_Cntrl_Reg.D14_DMA_HARDWARE.VALUE=0x2f; 你说你用的是MDMA(主DMA模式),可你的DMA硬件寄存器里的MASTER位 是置0,表征的是选择GDMA(从DMA模式).而且,你说用主DMA模式,可又 用从DMA模式的命令(D14_Cntrl_Reg.D14_DMA_COMMAND=0x00)? 我糊涂了. |
|
|
9楼#
发布于:2004-08-22 10:19
我说的MDMA实指通用DMA的主机方式。
D14_Cntrl_Reg.D14_DMA_HARDWARE.VALUE=0X10; D14_Cntrl_Reg.D14_DMA_COMMAND=0x00应该为0x06是不是?我太马虎了。 |
|
10楼#
发布于:2004-08-22 14:02
如果是主模式的话,我想应该是:
DREQ接到MCU上,由程序控制电平的高低(注意满足DMA主模式的时序要 求),DIOR,DIOW,DACK按照读写功能分别接到你的数据存储芯片的读写 控制脚,如果DIOR或DIOW不用的话接高电平,DACK不用的话接DREQ反. 基本上就是这样了.呵呵. |
|
|
11楼#
发布于:2004-08-22 15:38
谢谢!我试试看,另外在问一下,设置dma端点和设置普通端点一样吗?是不是先选择端点,然后再设置端点类型使能端点?
|
|
12楼#
发布于:2004-08-22 18:35
设置DMA端点只用设端点就可以了,设置端点类型使能端点是在你初始
化1581时进行的,到DMA初始化时不用再重设了. |
|
|