最近在写ISP1362主机功能,遇到一点疑问。首先可以排除硬件的错误。因为从机功能正常的。
如下图是主函数和ISP1362 HC初始化函数。初始化HC时,我打开了所有中断,同时在对应的中断服务程序中用串口打印出产生的中断源(没有实际处理)。完整程序在附件中。
如上图所示,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 );
}
「该帖子被 blackfin 在 2011-12-05 23:27:26 编辑过」