lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1534回复:12

1581固件程序求助

楼主#
更多 发布于:2004-08-20 19:40
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;
}
请大家帮忙看看,提提意见也可.
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-21 14:36
你是用什么模式控制DMA读写?DIOR和DIOW控制,还是DACK控制(好象)?
新手上路,请多关照.
lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-21 19:11
我想用从mdma方式,不过后来看书说mdma方式不用外接电路,只用1581就可以驱动,请问dack,diow,dior,dreq引脚如何与1581连接。
lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-21 19:12
错了,应该是mdma主机方式。
lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
}

谢谢你上次在你的贴子里对我的问题的回答,先放点分表示感谢。
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-21 20:10
我先看看,明天给你回答,好吗?今天太晚了.呵呵.
"metalwing!",不要激动,气大伤身,呵呵.
新手上路,请多关照.
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
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命令吧.
新手上路,请多关照.
lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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"是多余的?
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
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)?
我糊涂了.
新手上路,请多关照.
lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-22 10:19
我说的MDMA实指通用DMA的主机方式。
D14_Cntrl_Reg.D14_DMA_HARDWARE.VALUE=0X10;
D14_Cntrl_Reg.D14_DMA_COMMAND=0x00应该为0x06是不是?我太马虎了。
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-22 14:02
如果是主模式的话,我想应该是:
DREQ接到MCU上,由程序控制电平的高低(注意满足DMA主模式的时序要
求),DIOR,DIOW,DACK按照读写功能分别接到你的数据存储芯片的读写
控制脚,如果DIOR或DIOW不用的话接高电平,DACK不用的话接DREQ反.
基本上就是这样了.呵呵.
新手上路,请多关照.
lhm_as
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2006-04-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-22 15:38
谢谢!我试试看,另外在问一下,设置dma端点和设置普通端点一样吗?是不是先选择端点,然后再设置端点类型使能端点?
metalwing
驱动中牛
驱动中牛
  • 注册日期2003-10-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分178分
  • 威望58点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-22 18:35
设置DMA端点只用设端点就可以了,设置端点类型使能端点是在你初始
化1581时进行的,到DMA初始化时不用再重设了.
新手上路,请多关照.
游客

返回顶部