shiweicl1314 发表于 2021-9-6 09:37

下载官方USB虚拟串口的例程运行不成功--done

本帖最后由 muyichuan2012 于 2021-9-13 09:22 编辑

之前采购了一批415C8芯片现在准备用上,用官方USB虚拟串口例程简单修改下载测试后发现无法成功,板子外部使用8M晶体,做了以下修改







修改了芯片型号、启动文件等,直接下载程序运行时连上USB后电脑上没有任何提示,也没有声音。在线调试发现连上程序根本无法进入中断程序,停止后程序一直在大循环处,试了很多次没有一次能成功,这里只需要测试虚拟串口所以并没有增加其他代码,想问一下还有哪里需要修改的?

shiweicl1314 发表于 2021-9-6 14:40

现在论坛跟群里都没有售后支持了吗?

ArterySW 发表于 2021-9-6 15:43

shiweicl1314 发表于 2021-9-6 14:40
现在论坛跟群里都没有售后支持了吗?

这边有按照您说的修改方式修改测试,能正常枚举成功。是否还有其他修改的地方没有说明呢?又或者可以检查一下电路连接有没有问题,正常情况下,电路正常,就算代码有问题,PC端也会提示有设备插入,只是枚举失败,无法识别

shiweicl1314 发表于 2021-9-6 16:01

ArterySW 发表于 2021-9-6 15:43
这边有按照您说的修改方式修改测试,能正常枚举成功。是否还有其他修改的地方没有说明呢?又或者可以检查 ...

你好,首先感谢您的回复。

   我已经换过2片板子结果是一样的,代码就是上图修改的那些,没有在修改任何地方。我尝试在USB_D+上拉1.5k电阻到3.3V发现居然枚举成功了,但用串口助手发送数据测试发现数据传输不正常(返回数据过多或不正确,又或者一直重复返回0数据),而且加了上拉之后也不是每次都能枚举成功。

shiweicl1314 发表于 2021-9-6 16:20

ArterySW 发表于 2021-9-6 15:43
这边有按照您说的修改方式修改测试,能正常枚举成功。是否还有其他修改的地方没有说明呢?又或者可以检查 ...

还有我调试时发现在初始化USB库的过程中,程序经常会卡在这个延时函数中出不来,因为我在main()函数的while处设置断点发现程序经常无法运行到那里,单步发现程序卡在了下图位置。

ArterySW 发表于 2021-9-6 16:40

shiweicl1314 发表于 2021-9-6 16:01
你好,首先感谢您的回复。

   我已经换过2片板子结果是一样的,代码就是上图修改的那些,没有在修改任 ...

OTG在device模式下,内部自带上拉电阻,不需要额外提供上拉才对。您这边的现象比较奇怪,可否将使用的BSP版本告知一下,我们这边看呢能否复现您说的现象。

shiweicl1314 发表于 2021-9-6 20:10

ArterySW 发表于 2021-9-6 16:40
OTG在device模式下,内部自带上拉电阻,不需要额外提供上拉才对。您这边的现象比较奇怪,可否将使用的BSP ...

我换了几块新板子结果都是一样,我现在基本可以肯定这个BSP有BUG,我测试403RC跟403ARC都是一切正常,唯独415C8T7不行。

muyichuan2012 发表于 2021-9-7 08:00

请问你用的bsp版本是?

自己的灌饼 发表于 2021-9-7 08:44

你的设置有问题的。仔细看看。

ArterySW 发表于 2021-9-7 09:36

shiweicl1314 发表于 2021-9-6 20:10
我换了几块新板子结果都是一样,我现在基本可以肯定这个BSP有BUG,我测试403RC跟403ARC都是一切正常,唯 ...

感谢您的反馈。对于您那边不能识别设备的问题,我们使用你所使用的BSP版本在AT-START板子上实验没有复现问题。但是对于您提到的收发数据问题,这边已找到问题原因;请按照如下修改代码,测试看看。

将usbd_cdc_vcp.c文件内的CDC_DataTx函数替换如下即可:

static uint16_t CDC_DataTx (void)
{
uint16_t dwSendLen = 0;
        uint32_t SendPtr = 0;
static uint8_t send0packet = 0;
if (usb_txfifo.wrpointer == usb_txfifo.curpointer )
{
    if(send0packet == 1)
    {
      USB_DCD_EPT_Tx (&USB_OTG_dev, CDC_IN_EP, &usb_txfifo.fifo , 0 );
      send0packet = 0;
    return USB_DEVICE_OK;
    }
    else
    {
      return USB_DEVICE_FAIL;
    }
}
       
        if ( usb_txfifo.wrpointer > usb_txfifo.curpointer )
        {
          dwSendLen = usb_txfifo.wrpointer - usb_txfifo.curpointer;
        }               
        else
        {
                dwSendLen = USB_FIFO_MAX - usb_txfifo.curpointer;
        }
        SendPtr = usb_txfifo.curpointer;
        if ( dwSendLen > 64 )
        {
                dwSendLen = 64;
        }
        usb_txfifo.curpointer += dwSendLen;
       
        if ( usb_txfifo.curpointer >= USB_FIFO_MAX )
                usb_txfifo.curpointer = 0;

send0packet = 1;

USB_DCD_EPT_Tx (&USB_OTG_dev, CDC_IN_EP, &usb_txfifo.fifo , dwSendLen );
return USB_DEVICE_OK;
}

shiweicl1314 发表于 2021-9-7 20:33

在没有连接USB数据线的时候给板子上电,之后万用表量D+上的电压发现是0V,也就是说明内部的电阻并没有开启。

shiweicl1314 发表于 2021-9-7 22:42

测试发现通过程序主动写OTG_FS_DCTL寄存器的SFTDIS位,无论是置位还是执行清除操作,在D+管脚上始终都是0V电压,无法设置为高电平状态。



数据采集存储 发表于 2021-9-8 08:37

这个配置太详细了。

shiweicl1314 发表于 2021-9-8 10:39

我感觉问题应该快要解决了,经过反复测试确定是D+内置电阻没有被使能,查看寄存器手册看到了这么一段话


在usb库的gpio初始化中看到PA9被设置为输入模式,于是我将VBUS接入高电平后发现USB被计算机识别了(断开高电平后USB跟计算机会失去连接),也就是此时D+的电阻发挥了作用,我想知道415的USB当做设备使用时PA9必须要做为输入模式并且接入高电平才会使能USB的内置电阻吗?

shiweicl1314 发表于 2021-9-8 10:44

@ArterySW 麻烦您帮我看一下楼上

shiweicl1314 发表于 2021-9-8 23:05

问题已经解决了。

自己造声卡 发表于 2021-9-10 10:14

这个帖子,太赞了。不错。

sparrow054 发表于 2021-10-9 14:02

好贴!非常的棒
页: [1]
查看完整版本: 下载官方USB虚拟串口的例程运行不成功--done