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

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

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

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, 下载次数: 125

本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

点评

借楼淘理由:楼主在使用USB时在不同平台下由于字节序不同导致代码编译正确,运行有错误的问题。11#楼中楼主做了总结说明,楼主威武  发表于 2024-4-10 10:34
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

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

 

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

  .
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

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. 怎么调试出是那个环节出错了呢?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

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

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

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

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

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

STC不打算警告一下代码字节序的问题?{:5_358:}

点评

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 08:28 , Processed in 0.122995 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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