⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于S3C2440在ADS环境下开发的USB读写程序。
💻 C
字号:
static void __irq IsrUsbd(void)
{
U8 usbdIntpnd, epIntpnd;
U8 saveIndexReg = rINDEX_REG;    //保存索引寄存器值(现场保护)
usbdIntpnd = rUSB_INT_REG;	//保存中断标志寄存器
epIntpnd = rEP_INT_REG;


if(usbdIntpnd&SUSPEND_INT)	//总线上超过 3ms 没有活动信号引起中断
{ 
rUSB_INT_REG = SUSPEND_INT;//清除中断标志位
} 

if(usbdIntpnd&RESUME_INT)
{ 
rUSB_INT_REG = RESUME_INT; //恢复引起的中断
} 

if(usbdIntpnd&RESET_INT)	//接收到复位信号引起的中断
{ 
//ResetUsbd(); 
ReconfigUsbd();	//重新配置 USB device
rUSB_INT_REG = RESET_INT;    //RESET_INT should be cleared after ResetUsbd().
PrepareEp1Fifo(); 
} 


if(epIntpnd&EP0_INT)	//端点 0 中断
{ 
rEP_INT_REG = EP0_INT;
Ep0Handler();	//进入控制传输中断处理程序
}

if(epIntpnd&EP1_INT) 
{ 
rEP_INT_REG=EP1_INT; 
Ep1Handler();	//进入 Ep1 中断处理程序(BULK IN)
} 


if(epIntpnd&EP2_INT)
{ 
rEP_INT_REG = EP2_INT; 
//Ep2Handler();
} 


if(epIntpnd&EP3_INT)
{ 
rEP_INT_REG = EP3_INT; 
Ep3Handler();	//进入 Ep3 中断处理程序(BULK OUT)
} 


if(epIntpnd&EP4_INT)
{ 
rEP_INT_REG = EP4_INT; 
//Ep4Handler();
} 


ClearPending(BIT_USBD);	//USB 设备中断处理完毕,清除中断标志位
rINDEX_REG = saveIndexReg;	//恢复索引寄存器原来的值(恢复现场)
}


6.2 端点 1 的数据传输程序


void Ep1Handler(void)

{
U8 in_csr1;


rINDEX_REG = 1; 

in_csr1 = rIN_CSR1_REG;


//I think that EPI_SENT_STALL will not be set to 1.
if(in_csr1 & EPI_SENT_STALL) //USB 已经发布了一个 STALL 握手信号,由此引起该中断

{ 
CLR_EP1_SENT_STALL();//清除 SENT_STALL 位,STALL 状态结束

return;

} 


//IN_PKT_READY is cleared


//The data transfered was ep1Buf[] which was already configured transferIndex++;
if(UsbState==0x01234567)
PrepareEp1Fifo();//准备好发送的数据,把 IN_PKT_READY 置位

//IN_PKT_READY is set

//This packit will be used for next IN packit.

return; 

}

6.3 USB Device 初始化函数


void UsbdInit(U8 fun)

{

isUsbdSetConfiguration = 0;

//MDIV=40,PDIV=4,SDIV=1

//Upll = (m * Fin) / (p * 2**s)

//m = (MDIV + 8), p = (PDIV + 2), s = SDIV

//Upll=48MHz

rUPLLCON = (40<<12) | (4<<4) | 1;
//初始化描述符 InitDescriptorTable(fun); ReconfigUsbd();


UsbState = 0;
}


6.4 USB 下载函数

static int BoardUsbDownload(U32 addr, U32 run)

{

U8 fun;

int len;


//GPH9-->output    GPH10-->output

rGPHCON = rGPHCON&~(0xf<<18)|(0x5<<18);

//GPG9-->input

rGPGCON &= 0xfff3ffff;

fun = 1;
//USB Device 初始化 UsbdInit(fun); Delay(100);
//GPG9-->output rGPGCON |= 0x00040000;
//GPG9 ouput 1
rGPGDAT |= 0x0200;


//中断服务程序
pISR_USBD =(unsigned)IsrUsbd; ClearPending(BIT_USBD); EnableIrq(BIT_USBD);
len = WaitDownload(addr); DisableIrq(BIT_USBD);
rGPGCON &= 0xfff3ffff;	//GPG9 input


if(len>0) {

Uart_Printf("\nUSB download finished,press any key to exit\n");

}


return len;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -