STM32
直播中

王桂英

7年用户 1246经验值
私信 关注
[问答]

USB MSC SCSI命令指纹头协议工作不正常是什么原因导致的?

Hi,
平台F756, STM32Cube  FW_F7 V1.2.0, 基于USB MSC demo 例子程序开发指纹头产品。
指纹头和PC通讯协议是基于SCSI ,协议所有命令是 通过 SCSI 命令0xEF来实现。
比如指纹头协议有30个命令,其中第一个为 CMD_TEST_CONNECtiON = 0x01. 第3个为 CMD_GET_PARAM =0x03

目前的问题是第一个命令实现了,PC 上的程序PC_APP可以打开usb设备.但当PC_APP上按“获得参数”按钮,向F756发送 CMD_GET_PARAM命令后,
F756程序中仍旧获得第一个命令CMD_TEST_CONNECTION。

感觉是USB bot状态不对,里面的data没被清除,不能正常接收PC_APP发过来的USB/SCSI 命令了。

相关源码如下:(In usbd_msc_scsi.c)

在 int8_t SCSI_ProcessCmd(USBD_HandleTypeDef  *pdev, uint8_t lun,  uint8_t *params)中:
......
case SCSI_VERIFY10:
    return SCSI_Verify10(pdev, lun, params);
  case SCSI_PROTOCOL_B_COMMAND:
          return SCSI_ProcessProtocol(pdev,params);

.......


然后在 SCSI_ProcessProtocol(pdev,params) 中:

static int8_t SCSI_ProcessProtocol(USBD_HandleTypeDef  *pdev,uint8_t *params)
{
    USBD_MSC_BOT_HandleTypeDef  *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData;
    uint16_t cmd;
    if(g_bDeviceOpened==FALSE){
       hmsc->bot_state=USBD_BOT_DATA_OUT;
       USBD_LL_PrepareReceive(pdev,MSC_EPOUT_ADDR, hmsc->bot_data,COMMAND_PACKET_LENGTH);
         g_bDeviceOpened=TRUE;
         return 0;
    }        
    cmd=MAKEWORD(hmsc->bot_data[4],hmsc->bot_data[5]);        
    switch(cmd){
                case CMD_TEST_CONNECTION:      <-设备打开成功后,即使PC_APP发出CMD_GET_PARAM命令,F756还是得到这个命令
                   hmsc->bot_state=USBD_BOT_DATA_OUT;
                        if(hmsc->cbw.bmFlags==0x0){
                           MSC_BOT_SendCSW(pdev,USBD_CSW_CMD_PASSED);
                           hmsc->bot_data_length=0;
                        }else{
                      MSC_BOT_SendCSW(pdev,USBD_CSW_CMD_PASSED);
                      InitResponsePacket(CMD_TEST_CONNECTION, 0, 0, NULL, 0,0);
                      memcpy(hmsc->bot_data,g_pRcmPacket,RESPONSE_PACKET_LENGTH);
                      hmsc->bot_data_length=RESPONSE_PACKET_LENGTH;        
                            }                        
                   return 0;
                case CMD_GET_PARAM:              <-------永远得不到这个协议命令!!!正常情况下,
                                                                PC_APP上发出CMD_GET_PARAM命令后,F756上应该得到这个命令
                     PROTOCOL_GetParam(hmsc);
                     break;

.........

请各位高手帮忙看看是不是我在得到CMD_TEST_CONNECTION命令后,还没有完全处理正确,因此使得下面的其他SCSI命令内容接收不到!!!
万分感激!



回帖(1)

卞轮辉

2024-4-28 17:50:19
USB MSC SCSI命令指纹头协议工作不正常可能有以下几个原因:

1. 数据缓冲区未正确处理:确保在STM32Cube FW_F7 V1.2.0中,USB MSC的数据缓冲区已正确初始化和处理。如果缓冲区未正确处理,可能会导致接收到的数据不准确,从而影响命令的识别。

2. 命令解析错误:检查STM32Cube FW_F7 V1.2.0中的命令解析逻辑,确保CMD_GET_PARAM命令(0x03)被正确识别。如果命令解析逻辑有误,可能会导致接收到的命令被错误地识别为其他命令。

3. USB MSC状态机问题:检查STM32Cube FW_F7 V1.2.0中的USB MSC状态机实现,确保状态转换正确。如果状态机实现有误,可能会导致USB MSC在接收数据时出现异常。

4. USB MSC中断处理问题:检查STM32Cube FW_F7 V1.2.0中的USB MSC中断处理逻辑,确保在接收到数据时,中断处理函数能够正确地处理数据。如果中断处理逻辑有误,可能会导致数据未被正确处理。

5. 固件版本问题:虽然STM32Cube FW_F7 V1.2.0是一个较新的固件版本,但仍有可能存在一些已知或未知的问题。尝试查找是否有关于此问题的已知问题,并查看是否有可用的固件更新或补丁。

6. 硬件问题:检查STM32F756硬件,确保硬件连接正确且没有损坏。硬件问题可能会导致数据传输不稳定,从而影响命令的识别。

为了解决这个问题,可以尝试以下步骤:

1. 仔细检查STM32Cube FW_F7 V1.2.0中的命令解析逻辑,确保CMD_GET_PARAM命令(0x03)被正确识别。

2. 检查STM32Cube FW_F7 V1.2.0中的USB MSC状态机实现,确保状态转换正确。

3. 检查STM32Cube FW_F7 V1.2.0中的USB MSC中断处理逻辑,确保在接收到数据时,中断处理函数能够正确地处理数据。

4. 查找是否有关于此问题的已知问题,并查看是否有可用的固件更新或补丁。

5. 检查STM32F756硬件连接,确保硬件连接正确且没有损坏。

6. 如果问题仍然存在,尝试使用其他开发环境或固件版本进行测试,以排除环境或固件版本问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分