787741568 发表于 2024-1-3 17:15:10

如何获取USB连接状态

如题,在实际应用中,读写文件系统跟使用USB和SD卡模拟u盘来操作文件不能同时进行,所以需要判断USB的连接状态,连接时当U盘用,不连接时,往文件里写数据。本来想使用USB的EN脚的高低点平来实现的,结果发现EN脚实际使用时是悬空的,无法作为判断依据,所以想请教下,又没有什么USB库函数可以判断usB连接状态的?

Devil_920 发表于 2024-1-3 19:40:00

我记得USB有各种事件类型,插入、拔除,根据那个试试?

eric2013 发表于 2024-1-4 08:56:19

以ST的USB库为例,有个接口函数的。

好像是在类似usb_usr.C这种文件里面。

787741568 发表于 2024-1-4 14:21:47

eric2013 发表于 2024-1-4 08:56
以ST的USB库为例,有个接口函数的。

好像是在类似usb_usr.C这种文件里面。

在conf.c里面有一些回调函数,但是根本就都没调用啊,HAL_PCD_ConnectCallback跟HAL_PCD_DisconnectCallback

787741568 发表于 2024-1-4 14:46:54



找到没有调用的原因了,我之前初始化USB的时候,如果连接了usb线的话,初始化完后就直接弹出来了,然后我不想让他直接弹出,所以我把USB初始化函数中的USBD_Start(&hUsbDeviceFS);给拿出来了。这样在初始化函数中的
void MX_USB_DEVICE_Init(void)
{
if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK)
{
    Error_Handler();
}
if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_MSC) != USBD_OK)
{
    Error_Handler();
}
if (USBD_MSC_RegisterStorage(&hUsbDeviceFS, &USBD_Storage_Interface_fops_FS) != USBD_OK)
{
    Error_Handler();
}
}
就剩这3个,初始化完成后确实不会弹出来,然后单独调用USBD_Start(&hUsbDeviceFS)也可以启动u盘,但是这种情况下conf.c里的回调函数就都不执行了,我设置的标志也没有置。
然后我把USBD_Start(&hUsbDeviceFS)还是加在MX_USB_DEVICE_Init后面,然后执行判断,判断USB是否连接,连接了就调用USBD_Start启动u盘,没有连接就打开文件存数据。这次就能进回调函数里了,我的标志也调用了。就很奇怪。。。。。。。。 最变态的是执行第一个USBD_Start时,u盘没启动

787741568 发表于 2024-1-4 14:49:01

第一个USBD_Start的位置,第二个USBD_Start的位置

787741568 发表于 2024-1-4 15:52:18

eric2013 发表于 2024-1-4 08:56
以ST的USB库为例,有个接口函数的。

好像是在类似usb_usr.C这种文件里面。

不过现在好像有个新问题,usb插上会调用USBD_LL_SetUSBAddress()这个函数 ,但是他不是没次插上都会调用,只有设备第一次连接电脑时才会调用,有没有什么稳定的函数,会在usb连接时被调用的。
页: [1]
查看完整版本: 如何获取USB连接状态