您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF531+ISP1362做主机功能的疑惑
本帖共有1177个阅读者
发表帖子 发表投票 回复主题
BF531+ISP1362做主机功能的疑惑
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF531+ISP1362做主机功能的疑惑

最近在写ISP1362主机功能,遇到一点疑问。首先可以排除硬件的错误。因为从机功能正常的。

如下图是主函数和ISP1362 HC初始化函数。初始化HC时,我打开了所有中断,同时在对应的中断服务程序中用串口打印出产生的中断源(没有实际处理)。完整程序在附件中。

上传的图片
  201112523201691.jpg [ 120.30 KB 960×988 ] (缩略时请点击查看原图)

 

如上图所示,HC中断在HcµPInterrupt register的OPR_Reg位反应

1.如果把BF531的PF2设置为输入,下降沿中断;同时把HC的中断也设置为下降沿中断触发,即ISP1362Init()是的ISP1362Reg16Write(HC_HARDWARECONFIG, 0x8C28); 然后运行程序,发现没有中断发生,插入U盘也一样没有中断。但是可以运行到while(1)里的代码,且插入U盘后,发现读回来的值也正确反应U盘插入了。

2.如果把两个中断都设置为低电平触发中断。即ISP1362Init()里的ISP1362Reg16Write(HC_HARDWARECONFIG, 0x8C2A);发现程序一直产生“HcµPInterrupt register中的SOF_INT中断 “,而无法运行到while(1)里的代码!

3.按我个人理解,应该是HC初始化完后。如果没有插入U盘,是不会产生中断的。如果插入U盘,应该先产生OPR_Reg(即HC操作中断)中断下的根集线器状态改变(即HcInterruptStatus register中的RSHC)中断,然后程序再发送获取描述符等操作吧。但是一直没看到OPR_Reg中断产生。

不知是什么原因!疑惑啊,不知有没有人做过ISP1362的HC功能的,能不能指点下!万分感谢!

void main( void )
{
    INT32U HcRhPortStatusVal;
    INT16U Val;    

    //设置PLL,EBIU,串口,SDRAM
    BF531Init();
#ifdef DEBUG_HC
    uart_printf("初始化BF531完成\n");
#endif

    //初始化BF531与ISP1362接口
    //HC中断连接到PF2,下降沿触发中断
    BF531ToISP1362PortConfig();

    if (ReadISP1362ChipId())    //检查ISP1362 ID?
    {
        ISP1362Init();  //ISP1362 HC初始化
#ifdef DEBUG_HC
        uart_printf("初始化ISP1362完成\n");
#endif
    }

    while (1)
    {
//读端口2状态(即HC)
        HcRhPortStatusVal = ReadHcRhPortStatusB();
    }
}

void ISP1362Init(void)
{
    INT32U uValue32;
    INT32U uValue16;

    /*复位HC和OTG寄存器*/
    SoftwareReset();
    Delay_1ms(100);

    /* 软件复位HC */
    uValue32 = ISP1362Reg32Read(HC_COMMAMDSTATUS);
    uValue32 |= 0x1;          
    ISP1362Reg32Write(HC_COMMAMDSTATUS, uValue32);
    while (ISP1362Reg32Read(HC_COMMAMDSTATUS) & 0x00000001); //HC复位完成?

    ISP1362Reg32Write(HC_CONTROL, 0x00);   //置HC为USB_RESET状态

    /* 配置Com16_HcHardwareConfiguration寄存器 */    
    ISP1362Reg16Write(HC_HARDWARECONFIG, 0x8C28);  //禁止D_SUSPEND/D_WAKEUP和H_SUSPEND/H_WAKEUP引脚功能
        //断开H_DM2和H_DP2引脚内部下拉电阻,采用外部15K下拉电阻
        //HC中断与INT1相连,DC中断与INT2相连
        //未使用DMA,相关位都为默认值
        //16bit数据总线模式
        //INT1低电平有效,INT1中断为边沿触发
        //禁用INT1
                                                                //若为低电平触发中断设为0x8C2A

/* 配置中断 */
    ISP1362Reg32Write(HC_INTERRUPTDISABLE, 0x8000007F); // 禁止所有主机中断
    ISP1362Reg16Write(HC_uPINTERRUPT, 0x03FF);  // 清除所有主机微控器中断
    ISP1362Reg32Write(HC_INTERRUPTSTATUS, 0x0000007F); // 清除所有中断状态位
    ISP1362Reg32Write(HC_INTERRUPTENABLE, 0x8000007F); // 使能所有主机中断
    ISP1362Reg16Write(HC_uPINTERRUPTENABLE, 0x03FF); // 使能所有主机微控器中断

    /* 配置HcControl寄存器, */
    uValue32 = ISP1362Reg32Read(HC_CONTROL);
    ISP1362Reg32Write( HC_CONTROL, uValue32 | 0x600 );      //设置远程唤醒使能及连接。

    /* 配置HcFmInterval寄存器 */
    ISP1362Reg32Write(HC_FMINTERVAL, 0x20002EDF);

    /* 配置根集线器 */
    //set root hub registers
    ISP1362Reg32Write(HC_RHDESCRIPTORA, 0x05000B02); //0x0500 0B02
    ISP1362Reg32Write(HC_RHDESCRIPTORB, 0x00000000); //0x0000 0000
    //ISP1362Reg32Write(HC_RHSTATUS,      0x00000001); //0x0000 0001

    /* 设置ITL及ATL缓冲长度*/
    ISP1362Reg16Write(Hc_ATLBufferSize, 0x0400);         //0x0400
    ISP1362Reg16Write(Hc_INTLBufferSize, 0x0200);       //0x0200
    ISP1362Reg16Write(Hc_ISTLBufferSize, 0x0400);       //0x0400
    //ATL Buffer
    ISP1362Reg32Write(Hc_ATLPTDSkipMap, 0xFFFFFFFE);              
    ISP1362Reg32Write(Hc_ATLLastPTD, 0x00000001);  
    ISP1362Reg16Write(Hc_ATLBlkSize, 64);
    ISP1362Reg16Write(Hc_ATLPTDDoneThresholdCount, 1);
    ISP1362Reg16Write(Hc_ATLPTDDoneThresholdTimeOut, 5);

    /* 使能全局INT1中断 */
    uValue16 = ISP1362Reg16Read(HC_HARDWARECONFIG);
    ISP1362Reg16Write(HC_HARDWARECONFIG, (uValue16 | 0x0001));

    /* 设置主控器为操作状态 */
    uValue32 = ISP1362Reg32Read(HC_CONTROL);
    ISP1362Reg32Write( HC_CONTROL, uValue32 | 0x80 );
}


上传的附件
   20111252324691.zip [ 105.59 KB ]




「该帖子被 blackfin 在 2011-12-05 23:27:26 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/12/5 23:11:04
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
上面的问题没人遇到过么?今天看了数据手册,里面有下面一段!说:“在OTG模式下,端口2只能作内部主机......”我想问下,ISP1362有端口1和端口2。我在硬件设置OTGMODE = L,ID = H;即端口1固定为OTG的设备功能。此时我想用端口2作主机读写U盘。这样是不是说控制的时候还是要经过OTG,还是说只要控制端口2的主机控制器就行了呢?若我硬件上将OTGMODE =H,ID = H;那么端口1就固定为设备,端口2固定为主机,这样是不是就不用管OTG控制器了呢?
上传的图片
  201112615505112.jpg [ 75.05 KB 762×454 ] (缩略时请点击查看原图)

 



「该帖子被 blackfin 在 2011-12-06 16:04:50 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/12/6 15:56:43
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

回答不了你的问题,没有仔细研究过,给你一个可以读写U盘的代码吧,硬件上采用的是OTG接口扩展的HOST接口接入U盘,详细实验看附件中的文档。


上传的附件
   20111261871946.rar [ 768.54 KB ]


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/12/6 18:08:27
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢andy!这个程序我在网上看到过。好像是用飞利蒲那PCI板的DOS源码修改的。我之前也用这个源码做了一个OTG DC和HC的驱动,但是都是用大循环扫描的没有用中断功能。OTG DC和HC驱动同时用程序就会死掉,但分开即只用OTG DC或HC就正常。不知什么缘故。现在想用中断来处理重新写一下。

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2011/12/8 8:26:23
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154438 Call, 1 Queries, Processed in 0.015625 second(s),