找回密码
 立即注册
查看: 708|回复: 16

【已解决】SDCC移植USB例程后不能正常枚举(是字节序的问题)

[复制链接]
  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
    发表于 2024-3-18 09:32:49 | 显示全部楼层 |阅读模式
    本帖最后由 lzyor 于 2024-3-21 09:18 编辑

    芯片STC8H8K64U,试了STC8H8K64U-DEMO的提供的USB例程代码,直接烧录例程里提供的HEX都能正常运行
    移植到SDCC(4.4.0)编译后USB可以正常识别,不能正常枚举,Linux显示不能读配置错误-75,Win只能识别设备类型(HID,CDC)显示设备无法启动,请求的操作不成功。
    能正常发送第一个设备描述符,但是主机请求配置描述符时没有正常回复,然后就没下文了。

    几乎试了例程里全部关于USB的代码,都是这样。
    我没搞清楚是哪里的问题,能发包好像还是正常的,但是只能发一个包。。。


    USB抓包(前28个字节是抓包软件加上的),不同方式抓包看起来都是这样:

    USB抓包

    USB抓包

    配置描述符没有回应

    配置描述符没有回应

    第一个设备描述符是正确的,后一个配置描述符就没了。


    linux报错:

    linux报错

    linux报错

    Win上带个黄色警告,不能启动。


    移植仅做了如下修改:
    1. Keil的STC8H头文件换成了SDCC版本的头文件
    2. 用宏定义给关键词前面加上两个下划线
    3. 中断处理函数在main.c加上声明,SDCC在main.c没有这个声明会忽略中断处理函数

    应该不是他们的问题:
    1. 芯片是在这领的样品,STC8H8K64U-TSSOP20版本C
    2. 板子自己画的,但是烧录例程提供的HEX都能正常运行,也能正常USB下载,应该没有问题
    3. SDCC一直再用,换了几个版本还是一样的问题

    官方例程和移植代码.zip

    548.61 KB, 下载次数: 67

    本帖被以下淘专辑推荐:

    回复 送花

    使用道具 举报

    该用户从未签到

    640

    主题

    1万

    回帖

    1万

    积分

    管理员

    积分
    15687
    发表于 2024-3-18 13:13:22 | 显示全部楼层
    自己要用实验箱中有源代码, 不是打包成库的那种来改,
    先 KEIL C51验证完,再改成 SDCC的
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-18 14:59:10 | 显示全部楼层

     

    本帖最后由 lzyor 于 2024-3-18 15:00 编辑

      .
    回复 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-18 14:59:33 | 显示全部楼层
    神农鼎 发表于 2024-3-18 13:13
    自己要用实验箱中有源代码, 不是打包成库的那种来改,
    先 KEIL C51验证完,再改成 SDCC的
    ...

    移植显然移植的是有完整源码的例程,并且至少已经试过了:
    60-HID(Human Interface Device)协议范例、
    61-CDC(Communication Device Class)协议范例、
    62-基于HID协议的USB键盘范例、
    65-MSC(Mass Storage Class)协议范例、
    现象一致。

    最开始是我在自己的代码里复制了一些例程的usb_req_std.c函数,结果不能正确枚举,仔细读了几遍代码和反汇编也没发现问题;
    调试无果就直接试了例程,发现这几个例程都是这样。
    都是有完整代码,自带的HEX正常,移植过来就不行了。

    上面附件里附上了移植后的代码,和移植后编译出的HEX,bin文件夹里有每个源文件的汇编。

    我调试了很久也没搞清:
    1. 有什么BUG能导致第一次发包正常,后面就不行了?
    2. SDCC和Keil有什么差异能导致例程第一个描述符正常,后面的出BUG?
    3. 怎么调试出是那个环节出错了呢?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-19 16:34:49 | 显示全部楼层
    神农鼎 发表于 2024-3-18 13:13
    自己要用实验箱中有源代码, 不是打包成库的那种来改,
    先 KEIL C51验证完,再改成 SDCC的
    ...

    破案了,Keil是大端序,SDCC是小端序
    USB包是小端序,例程代码全都是为Keil写的,
    对字节序全部做了转换,去掉转换就全都对了。
    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-19 16:35:57 | 显示全部楼层
    没考虑字节序的问题,抓包发现长度数值不对才想起来
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-19 16:37:54 | 显示全部楼层
    神农鼎 发表于 2024-3-18 13:13
    自己要用实验箱中有源代码, 不是打包成库的那种来改,
    先 KEIL C51验证完,再改成 SDCC的
    ...

    STC不打算警告一下代码字节序的问题?

    点评

    我们暂时没人力研究 SDCC, 再等几个月,我们会研究 SDCC的  详情 回复 发表于 2024-3-19 17:18
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    640

    主题

    1万

    回帖

    1万

    积分

    管理员

    积分
    15687
    发表于 2024-3-19 17:18:29 | 显示全部楼层
    lzyor 发表于 2024-3-19 16:37
    STC不打算警告一下代码字节序的问题?

    我们暂时没人力研究 SDCC, 再等几个月,我们会研究 SDCC的
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-21 09:48:50 | 显示全部楼层
    【已解决】标记一下留给后人:
    例程本身是按照大端序编写的,小端序编译器编译正常0错误0警告,但是显然不能正常运行。

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    2024-8-8 21:16
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    5

    主题

    14

    回帖

    28

    积分

    新手上路

    积分
    28
     楼主| 发表于 2024-3-21 09:49:12 | 显示全部楼层
    【编译器端序】
    小端序SDCC表示:51指令集里只有DPTR自增指令没有自减,所以低字节放在低地址刚好可以顺序计算,并且x86和arm编译器都默认小端序,sdcc顺理成章的小端序。
    大端序Keil:我没找到Keil为什么大端序,似乎它自古以来就是大端序,也没有要修改的意思。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-11-1 08:00 , Processed in 0.151853 second(s), 80 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表