USB的一些概念性知识:
1. 对于USB的操作一般分为USB Host(USB主机);USB Device(USB设备);USB On-The-Go(USB双向通信)
2. USB的数据传送单元:USB是按pakcet进行传送的,也就是说它传送的最小单位是pakcet。而像RS232是按字节传送的。以pakcet为单位传送数据,好处在于可以灵活的定义数据的传送格式,传送方式,从而可以适应各种各样的串行设备。
3. USB的传输类型:
控制传输:用于设备的控制。
批量传输:常用于U盘数据拷贝,打印数据传输,扫描仪数据接收等。
中断传输:典型应用包括键盘,鼠标,游戏控制器等,必须无延时传输的设备。
等时传输:用于多媒体数据的实时传输。
4. USB总线最大可提供5V,500mA电流,并支持节约能源的挂机和唤醒模式。 USB协议是主从协议,在所有通信里,只有一个主控器,其他都是从设备,最多能接127个从设备,因为协议默认只保留了7bit,作为设备地址。
5. USB协议定义的设备的六种状态:上电状态(powered);默认状态(default);地址状态(address);配置状态(configured);连接状态(attached);挂起状态(suspend)
6.USB的四种不同的中断事件:唤醒功能;设备插拔事件;USB事件;BUS事件
因为我主要用的是USB Host这方面的功能,这里就以USB Host的代码作为例子简单的说一下USB的用法。对了,这里要特别注意的一点是USB接口的时钟必须是48M的,如果使用其它频率可能会出错的。
int32_t main(void)
{
unsigned int u32ByteCount;
unsigned int u32PageNumber;
unsigned int u32ProgramFlashAddress = 0;
unsigned int u32VerifyFlashAddress = 0;
unsigned int MidDid;
FATFS *fs; /* 指向文件系统的指针 */
FRESULT res;
DIR dir; /* Directory object */
UINT s1, s2, cnt;
char a[8] = "abcdefg";
/* Lock protected registers */
if(SYS->REGLCTL == 1) // In end of main function, program issued CPU reset and write-protection
// will be disabled.
SYS_LockReg();
/* Unlock protected registers */
SYS_UnlockReg();
/* Init System, IP clock and multi-function I/O */
SYS_Init();
/* Lock protected registers */
SYS_LockReg();
/* Init UART0 for printf */
UART0_Init();
printf("\n\n");
printf("\n OTG->PHYCTL = 0x%x\n", OTG->PHYCTL);
printf("\n OTG->STS = 0x%x\n", OTG->STATUS);
printf("\n OTG->CTL = 0x%x\n", OTG->CTL);
USBH_Open(); //打开USB host控制器功能
USBH_MassInit(); //USB host 初始化
Delay(0x500000);
USBH_ProcessHubEvents(); //中断的检测
printf("rc=%d\n", (WORD)disk_initialize(0)); //disk_initialize()磁盘初始化
f_mount(0, &FatFs[0]); //配置文件系统
for(;;)
{
if(USBH_ProcessHubEvents()) //判断是否有U盘等设备接入USB host
{
put_rc(f_mount(0, &FatFs[0]));
}
printf(_T(">"));
res = f_open(&file1,(TCHAR*)"TEST2.TXT",FA_READ); //以读的形式打开文件
if(res)
{
printf("error");
}
else
{
res = f_read(&file1,(void *)Buff,8,&s2); //读取文件
if(res != FR_OK)
{
put_rc(res);
}else
{
printf("\n Data size:%d\n",s2);//Print how many read data
}
f_close(&file1);//Close "Test.txt" file //关闭文件
break;
}
res = f_open(&file1, (TCHAR*)"Test7.TXT", FA_CREATE_NEW|FA_WRITE); //以新建或写的形式打开
//文件(文件存在则以写
//的形式打开,不存在则新建
//一个)
if(res)
{
printf("error");
}
else
{
res = f_write(&file1, (void*)a, 8, &s2); //向文件中写数据
if(res != FR_OK)
{//Fail
put_rc(res);//Print fail message
}else
{//Pass
printf("\n Data size:%d\n",s2);//Print how many read data
}
f_close(&file1);//Close "Test.txt" file //关闭文件
}
}
}
其实作为USB host对于U盘的操作,只需要设置好时钟,最好初始化,配置好文件系统就可以了,在这方面新唐M451的官方例程已经做得很好了,都是现成的函数,只需要调用就行了,一般出错也不会是这里的问题。 接下来就可以用f_open(); f_close(); f_read(); f_write();函数对文件进行读写了。说句实话,新唐还是做得不错的,对于开发人员并不需要了解太多USB底层协议的一些东西。
在调试时碰到的一些问题,调试时最爱出现的问题就是文件打不开,这时候可能由于两种原因,第一个文件配置没有配置好;第二个有可能是USB host不支持你连接的U盘或其他USB从设备,这时可换一个设备重试一下。 |