wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1298回复:6

这么晚上来,请教问题(ISP1581)高手请回答

楼主#
更多 发布于:2004-07-14 21:02
我用的是ISP1581+5409,我是按照周立功的程序移植的,
上电后连接SOFTC,能够收到BUSRESET中断,在中断中void Int_Ext_0()  
{
asm(" STM  #0FFh,IFR");  //清除中断标识寄存器
D14_Cntrl_Reg.D14_INT.VALUE;
//读取ISP1581中断寄存器
USB_Int_Flag.VALUE |=D14_Cntrl_Reg.D14_INT.VALUE;
//回写ISP1581中断寄存器
D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
//总线复位处理
if(USB_Int_Flag.BITS.RESET)
{
//清除总线复位中断位
USB_Int_Flag.BITS.RESET = 0;
delay(10);
          //设置总线复位标志
Kernel_Flag.BITS.Bus_Reset = 1;
           delay(10);
PIO_Count = 64;
//切换到全速模式
       Kernel_Flag.BITS.HS_FS_State = FULL_SPEED;
//初始化ISP1581
Init_D14();
//设置softconnect
D14_Cntrl_Reg.D14_MODE.BITS.SOFTCT = 1;
delay(10);
}
}
中断中就做了这么多,然后就在也收不到中断了,有的时候看到DSP的IFR寄存器中还有中断产生,但是就怎么也不禁中断了,中断也是使能的,我看好像有些同行和我有些类是的问题,高手帮帮忙啊

还有就是我在设置ISP1581的某些寄存器时,比如
   D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C;
delay(15);
好像不加后面的delay(15)就不可以,是不是因为需要80ns的寻址周期啊?另外5409的编程需要注意什么问题啊?比如16位寻址的问题
问了这么多,20分太少了,我一定放分100,绝不食言
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-14 23:49
自己顶一下,高手们快来啊
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-15 09:07
1,靠delay来等待寄存器读写完成很麻烦,你的5409应该有寄存器设置来使dsp在读写数据的时候自动等待,以满足1581 80ns的读写周期
2,清中断寄存器的时候是写1来清除某一位
3,初始化的时候要写模式寄存器(mode)、中断配置寄存器、中断使能寄存器和地址寄存器(要使能默认的地址0),其中在中断配置寄存器中中断的触发模式是可以设置的,要配置成和你的5409匹配的

在复位中断里上述寄存器设置要重新设置一下。
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-15 15:04
1,靠delay来等待寄存器读写完成很麻烦,你的5409应该有寄存器设置来使dsp在读写数据的时候自动等待,以满足1581 80ns的读写周期
2,清中断寄存器的时候是写1来清除某一位
3,初始化的时候要写模式寄存器(mode)、中断配置寄存器、中断使能寄存器和地址寄存器(要使能默认的地址0),其中在中断配置寄存器中中断的触发模式是可以设置的,要配置成和你的5409匹配的

在复位中断里上述寄存器设置要重新设置一下。




jinghuiren说得很对,1,5409有一个软件等待寄存器,我只是大概的设置了一下,使用delay是不太好,这点我马上改进
2,清除终端这个语句,我用的是asm(" STM #0FFh,IFR"); //清除中断标识寄存器,的确是写1来清除所有中断,您看看是不是对德阿,
3,初始化1581的寄存器好像我也成功了,不然也不会受到复位中断,是不是?
最后一句,您说的在复位中断中需要重新设置这些寄存器,我也作了,不知道这么设置对不对?

void Init_D14(void)
{

//初始化ISP1581寄存器
Init_D14_SFR();

//初始化ISP1581端点
Init_Endpoint();

//初始化ISP1581工作标志寄存器
USB_Device.BITS.State = USB_Default;
Device_Config_Value = 0;
USB_Device.BITS.Alter_Interface = 0;
USB_Device.BITS.Big_Endian = On;
Kernel_Flag.BITS.Tx_Done = 0;

}


void Init_D14_SFR(void)
{
//enable Global Interrupt enable
//enable soft connect and other feature
//enable wakeup on chip select
//disable soft connect
//设置模式:时钟始终有效,全局中断使能,片选唤醒
D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C;

//设置全部中断为模式1,电平触发,低电平有效
D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x02;
//设置中断使能寄存器
//使用端点0和端点2
D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000;
}


jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-15 15:25
1,对于某个中断你只能清楚该位,不能把所有的都清了呀!只能处理什么中断清什么中断。
2,你初始化的时候没有使能默认的地址0,把中断配置寄存器(那个0x02)设置成0x62或者0x60试试,
3,你设置那个模式寄存器0x8C什么意思?,在设置softcnt之前之需要使能全局中断即可,即应该是0x08,设置softcnt时是0x09
4,你设置中断使能寄存器的方式好奇怪,就算你的数据总线是32位的,那16位的数据也应该是低16位呀,怎么跑到高16位上来?
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-15 16:22
1,对于某个中断你只能清楚该位,不能把所有的都清了呀!只能处理什么中断清什么中断。
2,你初始化的时候没有使能默认的地址0,把中断配置寄存器(那个0x02)设置成0x62或者0x60试试,
3,你设置那个模式寄存器0x8C什么意思?,在设置softcnt之前之需要使能全局中断即可,即应该是0x08,设置softcnt时是0x09
4,你设置中断使能寄存器的方式好奇怪,就算你的数据总线是32位的,那16位的数据也应该是低16位呀,怎么跑到高16位上来?



这么快就回答了,您真负责,以前有问题没有习惯问,真该大家讨论阿,
1。您说得对,可以改成asm(" STM #01H,IFR ")因为我没有用到别的中断,所以图省事,得改
2,这这个寄存器,我只对后两位理解,我在实际中按照ZLG设置的为0X52,您帮我解释一下这个寄存器
3,这个我也是按照周立功的程序的,有的抄袭了,您说得也对,
4,至于这个是因为,
typedef union INT_ENABLE
{

struct INT_ENABLE_BITS    //符合DSP寻址要求
{

u16 IEP2TX : 1;
u16 IEP2RX : 1;
u16 IEP1TX : 1;
u16 IEP1RX : 1;
u16 IEP0TX : 1;
u16 IEP0RX : 1;
u16 RESERVED2           : 1;
u16 IEP0SETUP           : 1;
u16 RESERVED3           : 1;
u16 IEDMA : 1;
u16 IEHS_STA           : 1;
u16         IERESM               :         1;
u16 IESUSP : 1;
u16 IEPSOF : 1;
u16 IESOF : 1;
u16 IERST :         1;  
                    //低位的  


u16 RESERVED1 : 6;
u16 IEP7TX : 1;
u16 IEP7RX : 1;
u16 IEP6TX : 1;
u16 IEP6RX : 1;
u16 IEP5TX : 1;
u16 IEP5RX : 1;
u16 IEP4TX : 1;
u16 IEP4RX : 1;
u16 IEP3TX : 1;
u16 IEP3RX : 1;


}BITS;

u32 VALUE;

}INT_ENABLE;
我是这样建立的结构,是一个32位的,然后将这个结构分配到DSP外部的0X8014H地址初,那么就是说低位的在14H,高位在15H ,我在软件仿真的时候事了一下,如果负值0x39fd0000的话,那么就是39FD在14H那个地址,0000在15H那个地址,我如果这样做,是不是就可以完成对中断是能寄存器的配置了,反正我的程序都是移植的,太多不规范的地方了,如果您有时间要是能给我看看就太好了!!!
再次感谢,这次不能给分了,我一会重开一个,给您分,多谢
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-16 09:14
1,你这样做是不是只清除掉了DSP中的中断标志位?其实按通常情况DSP中的中断位应该是自动清除的,你需要清楚的是ISP1581的中断标志位!也就是寄存器xx18和xx1a里的相应位,通常我们只用到低16位,可以对xx1a不予理会。清楚的方法是对该位写1
2,
7 to 6 CDBGMOD[1:0] Control 0 Debug Mode: values
5 to 4 DDBGMODIN[1:0] Data Debug Mode IN:
3 to 2 DDBGMODOUT[1:0] Data Debug Mode OUT:
1 INTLVL Interrupt Level: selects the signaling mode on output
INT (0 = level, 1 = pulsed). In pulsed mode an interrupt
produces a 60 ns pulse. Bus reset value: unchanged.//设置中断的触发模式,0电平触发,1脉冲触发,产生一个持续时间60ns的脉冲

0 INTPOL Interrupt Polarity: selects signal polarity on output INT
(0 = active LOW, 1 = active HIGH). Bus reset value:
unchanged.//设置中断的极性,0低电平有效,1高电平有效

Table 11: Debug mode settings
Value CDBGMOD DDBGMODIN DDBGMODOUT
00H  对所有的ACK和NAK以及OUT中的NYET都产生中断
01H  对所有的ACK和OUT中的NYET产生中断
1XH  对所有的ACK和第一个NAK以及OUT中的NYET产生中断

对于CONTROl中断,我们只对ACK产生中断(如果对NAK也产生中断,中断会很频繁,可能导致枚举失败)
对于IN中断,我们对所有的ACK和第一个NAK产生中断,这样一旦主机发送读数据请求,设备端就会产生第一个NAK中断,这比D12要好一些,这样我们就可以通过中断来判断什么时候发送数据了。但是这个第一个NAK指的是前一个ACK后的第一个NAK,因此如果你是对中断计数的话,每一个ACK后面都会有一个NAK中断没,这一点要注意。
对于OUT中断,我们只对ACK产生中断。否则会导致设备误动作。
游客

返回顶部