打印
[圈圈教你玩USB]

为什么D12的INT_N一直为低

[复制链接]
3417|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baiguo|  楼主 | 2010-8-18 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
拜读了圈圈的书,按书中所讲搭了块板(用mega16+d12)
现在情况是:读芯片ID是对的(返回0x1012),可d12的14脚(int_n)一直为低电平?

//================================================
//Main_Program
void main(void)
{
unsigned char id0=0;
unsigned char id1=0;
unsigned char intSource=0;

DDRA|=0xE0;
Uart_Init();
    DDRB|=0xF0;
   
    delay_ms(100);
  
D12WriteDataOrCmd(0xFD,COMMAND);
id0=D12ReadData();
id1=D12ReadData();

if(id0==0x12 && id1==0x10)
  printf(" ID is correct! Congratulations! \r\n");
  
UsbDisconnect();
UsbConnect();

//**************************************************************************
    for(;;)
    {
     if(D12GetIntPin()==0)
        {
         D12WriteDataOrCmd(READ_INT_REG,COMMAND);    //写读中断寄存器的命令  
         intSource=D12ReadData();                    //读回第一字节的中断寄存器
         printf("intSource = %d \r\n",intSource);
         
         if(intSource&0x80)        //总线挂起中断
          UsbBusSuspend();
         if(intSource&0x40)        //总线复位中断
          UsbBusReset();
         if(intSource&0x01)        //端点0输出中断
          UsbEp0Out();
         if(intSource&0x02)        //端点0输入中断
          UsbEp0In();
         if(intSource&0x04)        //端点1输出中断
          UsbEp1Out();
         if(intSource&0x08)        //端点1输入中断
          UsbEp1In();
         if(intSource&0x10)        //端点2输出中断
          UsbEp2Out();
         if(intSource&0x20)        //端点2输入中断
          UsbEp2In();
        }
    }
}

相关帖子

沙发
baiguo|  楼主 | 2010-8-18 15:32 | 只看该作者
串口工具显示:
ID is correct! Congratulations!
intSource = 244
USB总线挂起!
USB总线复位!
USB端点1输出!
USB端点2输出!
USB端点2输入!
intSource = 244
USB总线挂起!
USB总线复位!
USB端点1输出!
USB端点2输出!
USB端点2输入!
intSource = 244
USB总线挂起!
USB总线复位!
USB端点1输出!
USB端点2输出!

使用特权

评论回复
板凳
h490516509| | 2010-8-19 08:44 | 只看该作者
可能的错误:1,D12GetIntPin()==0,引脚是输入吗?PORTX是上拉吗?
2,你没有读取最后状态,所以会一直低。。我认为是这点,你的程序里没有。

使用特权

评论回复
地板
h490516509| | 2010-8-19 08:45 | 只看该作者
UsbDisconnect();
UsbConnect();
你是怎么写的,函数实现,
我也做了D12但,复位,挂起,设备描述符。。。
不明怎么挂起了。

使用特权

评论回复
5
baiguo|  楼主 | 2010-8-19 08:51 | 只看该作者
感谢楼上的回复!!

上拉电阻肯定接了(1k)

//================================================
//函数功能:USB断开连接函数
//入口参数:无
//返    回:无
//备    注:无
//================================================
void UsbDisconnect(void)
{
D12WriteDataOrCmd(D12_SET_MODE,COMMAND);    //写设置模式命令
D12WriteDataOrCmd(0x06,DATA);               //设置模式的第一字节
D12WriteDataOrCmd(0x47,DATA);               //设置模式的第二字节
delay_ms(1000);
}
//================================================
//函数功能:USB连接函数
//入口参数:无
//返    回:无
//备    注:无
//================================================
void UsbConnect(void)
{
D12WriteDataOrCmd(D12_SET_MODE,COMMAND);    //写设置模式命令
D12WriteDataOrCmd(0x16,DATA);               //设置模式的第一字节
D12WriteDataOrCmd(0x47,DATA);               //设置模式的第二字节

}

使用特权

评论回复
6
baiguo|  楼主 | 2010-8-19 08:53 | 只看该作者
现在就是断开m16和D12的所有连接,上电后int_n仍一直为低

使用特权

评论回复
7
baiguo|  楼主 | 2010-8-19 09:03 | 只看该作者
主循环里增加两条语句,写成如下形式。结果还是一样的
//***********************************************************************
    for(;;)
    {
            if(D12GetIntPin()==0)
        {
                D12WriteDataOrCmd(READ_INT_REG,COMMAND);    //写读中断寄存器的命令  
                intSource=D12ReadData();                    //读回第一字节的中断寄存器
                temp=D12ReadData();
               
                printf("intSource = %d \r\n",intSource);
                printf("temp = %d \r\n",temp);
               
                if(intSource&0x80)        //总线挂起中断
                        UsbBusSuspend();
                if(intSource&0x40)        //总线复位中断
                        UsbBusReset();
                if(intSource&0x01)        //端点0输出中断
                        UsbEp0Out();
                if(intSource&0x02)        //端点0输入中断
                        UsbEp0In();
                if(intSource&0x04)        //端点1输出中断
                        UsbEp1Out();
                if(intSource&0x08)        //端点1输入中断
                        UsbEp1In();
                if(intSource&0x10)        //端点2输出中断
                        UsbEp2Out();
                if(intSource&0x20)        //端点2输入中断
                        UsbEp2In();
        }
    }

使用特权

评论回复
8
baiguo|  楼主 | 2010-8-19 09:03 | 只看该作者
ID is correct! Congratulations!
intSource = 244
temp = 244
USB总线挂起!
USB总线复位!
USB端点1输出!
USB端点2输出!
USB端点2输入!
intSource = 244
temp = 244
USB总线挂起!
USB总线复位!
USB端点1输出!
USB端点2输出!

使用特权

评论回复
9
h490516509| | 2010-8-19 10:10 | 只看该作者
D12WriteDataOrCmd(READ_INT_REG,COMMAND);    //写读中断寄存器的命令  
                intSource=D12ReadData();                    //读回第一字节的中断寄存器
                temp=D12ReadData();
D12ReadData(); 你设置了数据命令了吗?设置了输入了吗?
第一个字节是没用的,
第二个字节是读取的长度。
以后的才是正确的数据。

使用特权

评论回复
10
baiguo|  楼主 | 2010-8-19 16:27 | 只看该作者
//D12读数据
unsigned char D12ReadData(void)
{
        unsigned char temp=0;
       
        //设为输入
        D12SetPortIn();
        temp=0;
       
        D12_A0=0;
        delay_us(1);
        D12_RD=0;
        delay_us(2);
        temp =D12_DATA;       
       
        D12_RD=1;
        delay_us(2);       
        return(temp);
}

设为输入了。

感觉UsbConnect()函数没设置成功---连上USB线,系统没提示有设备插入

使用特权

评论回复
11
computer00| | 2010-12-15 12:48 | 只看该作者
应该是还有些中断没有处理。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

67

帖子

0

粉丝