找回密码
 立即注册
查看: 725|回复: 8

今天学习 USB CDC 的记录和感受

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-05-06 16:45:31
已绑定手机

19

主题

208

回帖

522

积分

高级会员

积分
522
发表于 2024-7-14 22:48:51 | 显示全部楼层 |阅读模式
STC 网站下载了STC_USB_LIBRARY_DEMO-20240531.zip,  解压后使用一下其中的例程,增加一些感性认识;




1. 其中 \STC_CDC_QUERY_LIBRARY\stc32g_cdc_query_demo\                【使用 stc_usb_cdc_32.LIB, stc32_stc8_usb.h】
        使用我手头的 STC32G12K128核心板, C251编译, Source+Xmall+Large 64K 模式, HEX-80, REMOVEUNUSED 控制;
        CDC虚拟串口,查询工作模式,成功,设置时钟 24MHz, 板子接 typeC 电缆到PC机USB口后,设备管理器->端口(COM 和 LPT)分支下出现了 “STC USB-CDC(COM7)”,
        使用串口调试器连接COM7,可以发送并立即接收到核心板的同样数据返回! 【串口设置可以任意,这个有CDC虚拟串口特性决定的】




2. 其中 \STC_CDC_QUERY_LIBRARY\stc8h_cdc_xdata_query_demo\        【使用 stc_usb_cdc_8h_xdata.LIB, stc32_stc8_usb.h】
        使用我手头的STC8H8K64U核心板,        C51编译,使用LX51, Large Xdata + Large 64K 模式; HEX-80, REMOVEUNUSED 控制;
        CDC虚拟串口,查询工作模式,成功,设置时钟 24MHz, 板子接 typeC 电缆到PC机USB口后,设备管理器->端口(COM 和 LPT)分支下出现了 “STC USB-CDC(COM7)”,
        使用串口调试器连接COM7,可以发送并立即接收到核心板的同样数据返回!

3. 其中 \STC_CDC_INTERRUPT_LIBRARY\stc8h_cdc_xdata_interrupt_demo\        【使用 stc_usb_cdc_8h_xdata_interrupt.LIB, stc32_stc8_usb.h】
        使用STC8H8K64U核心板,        C51编译,使用LX51, Large Xdata + Large 64K 模式; HEX-80, REMOVEUNUSED 控制;
        CDC虚拟串口,中断工作模式,成功,设置时钟 24MHz, 板子接 typeC 电缆到PC机USB口后,设备管理器->端口(COM 和 LPT)分支下出现了 “STC USB-CDC(COM7)”,
        使用串口调试器连接COM7,可以发送并立即接收到核心板的同样数据返回!   【这个是中断模式,前面的是查询模式,中断模式 的数据响应能力更好!】

4. 将上一个工程目录复制,更改为当前的文件夹名称 stc8h_cdc_xdata_interrupt_demo-8051U\, 准备在我自己焊接的简易小板上测试,CPU 是 STC8051U-34K64-LQFP48
   \STC_CDC_INTERRUPT_LIBRARY\stc8h_cdc_xdata_interrupt_demo-8051U\        【使用 stc_usb_cdc_8h_xdata_interrupt.LIB, stc32_stc8_usb.h】
         为了在我 STC8051U 小板上进行 USB CDC 虚拟串口的测试(使用 xdata 中断模式的库), 到Keil C51目录下将 C51 编译器使用的 STC8051U.h 替代 原来的 STC8H.h;
        并且更改 main.c 中相应的头文件包含语句; 并在工程属性中,选择芯片为 STC8051U-8bit,其他属性设置和上一个工程的属性设置的保持一致, 然后进行编译,测试;
        使用我的 STC8051U-34K64 小板,        C51编译,使用LX51, Large Xdata + Large 64K 模式; HEX-80, REMOVEUNUSED 控制;
        CDC虚拟串口,中断工作模式,设置时钟 24MHz, 板子直接接XH-4芯简易电缆到PC机USB口后,设备管理器->端口(COM 和 LPT)分支下出现了 “STC USB-CDC(COM8)”,
        使用串口调试器连接COM8, 测试发现 不能够 发送并立即接收到我的小板的同样数据返回;
        为啥这里失败了?   
        
        搜索查看了STC论坛的许多帖子,又仔细看了芯片文档,慢慢理解到存在如下问题:
              我的小板太“简易”了,没有严格按照芯片文档中的图来做;  我的小板子上,只有一个 8051U 芯片,几个单排插针,飞线引出了串口1(P3.0/P3.1),VCC,GND, 芯片周围只有22uF+0.1uF对
       VCC滤波,1uF对 Ucap接地滤波,其他诸如 P3.0/P3.1 接口的22欧电阻,P3.2引脚的300R和10K上拉, 统统没有! 因为使用 LINK1D 进行程序下载,前面学习测试,点个流水灯啥的,倒也没有碰到大问题。
          想想现在既然PC能识别并显示 "STC USB-CDC(COM8)“, 那么USB的 枚举,配置过程应该是OK的,硬件上的通路肯定没有问题了。
          USB总线的高速信号传输,猜测22欧姆电阻可能是高速信号"阻抗匹配"之类的玩意,否则这个电阻值用于限流也太小了;
       所以,试试降速,就是烧写程序的时候,把前面 24MHz 时钟更改为 12MHz 试试, 果然,降速后PC上使用 COM8 进行通信测试成功了!

       所以, 这次的教训就是:硬件电路还是要严格按照官方图纸来焊接,细节的差异就会影响性能;反而言之,如果硬件的走线长了,干扰大了,不得已的情况下,就得考虑降速运行,或许也是一条挽救的路!

   

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-05-06 16:45:31
已绑定手机

19

主题

208

回帖

522

积分

高级会员

积分
522
发表于 2024-7-14 23:00:13 | 显示全部楼层
更正一下,P3.2引脚上有焊接100R的串接电阻和5.1K的上拉电阻,由于焊的是0603的,刚才没有注意细看,对不起。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-05-06 16:45:31
已绑定手机

19

主题

208

回帖

522

积分

高级会员

积分
522
发表于 2024-7-14 23:01:48 | 显示全部楼层
其他电容都是直插的电解和独石的,很明显。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:525
  • 最近打卡:2025-05-08 07:50:51
已绑定手机

47

主题

1749

回帖

2731

积分

金牌会员

积分
2731
发表于 2024-7-15 06:52:27 | 显示全部楼层
我也犯过同样错误
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-05-08 00:01:49
已绑定手机

19

主题

3196

回帖

4956

积分

论坛元老

积分
4956
发表于 2024-7-15 08:52:27 来自手机 | 显示全部楼层
ucap是接0.1uf接地吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-05-06 16:45:31
已绑定手机

19

主题

208

回帖

522

积分

高级会员

积分
522
发表于 2024-7-15 19:39:14 | 显示全部楼层
so*** 发表于 2024-7-15 08:52
ucap是接0.1uf接地吧

是的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-05-06 16:45:31
已绑定手机

19

主题

208

回帖

522

积分

高级会员

积分
522
发表于 2024-7-15 22:44:28 | 显示全部楼层
今天继续阅读文档,主要看了串口1和串口2;

其中,异步串口的收发功能基本都使用过;但是,相比传统的8051,串口接收超时的功能还是蛮有意思的:
  对于一般没有使用 TLV 格式(标签,长度,数据段), 有头有尾固定长度的 串口数据包,数据接收啥时候结束不太好判断,要么需要自己加一个定时器来做接收超时,比较麻烦;

  现在STC芯片为我们考虑周全了,  只要设置 UR1TOCR,使能接收超时,使能超时中断(中断入口还是原来的串口中断入口),选择好超时计数时钟源,  然后按照自己要求的超时时间,结合前面设置的超时计数时钟源,计算并设置 UR1TOTE/H/L 这3个寄存器(注意: 设置数据的寄存器顺序必须是 L/H/E);

需要注意的是,这个接收超时中断 实际是串口数据字节之间接收超时,可以理解为正常串口输入的数据字节之间的最大间隔时间的判断,超过这个设置的间隔时间,就认为接收超时了。 必须先正常接收首字节后才会触发硬件的接收超时判断和响应功能;  

相比其他有些ARM芯片的固定的串口接收超时功能(某芯片是固定的3.5个波特率时间),STC的更加灵活,给用户自己来设置超时时间长度了!

另外有点遗憾的是,串口1.2涉及的LIN总线和smartcard,相关的基础知识描述比较少;
LIN这块,我看了一下,还好有例程提供,后面可以学习一下。smartcard 部分,貌似还没有提供相关的例程,也许将来也会提供的吧。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-05-06 16:45:31
已绑定手机

19

主题

208

回帖

522

积分

高级会员

积分
522
发表于 2024-7-16 22:47:49 | 显示全部楼层
今天阅读了STC8051U 文档的 EEPROM的IAP操作 部分:
  感觉操作模式和老的STC的8051芯片相比,差别不大, 但是操作速度有了明显的增加, 操作延时减少了;
  差异就是:
  以前2字节地址, 现在扩展为3字节地址;
  以前不在程序烧写的时候划分出专门的EEPROM区,而是直接通过IAP指令对CODE区进行读,写,擦除操作;
  现在也可以通过MOV指令跨区直接读EEPROM的字节内容; 以前是在一个区,直接用 movc 指令, 或者C语言的 CBYTE[]  宏定义直接操作;

有一个小疑问: 有些型号的单片机, 在触发寄存器操作时, 即依次写入 5AH,A5H 时, 还有时间限制, 必须在4个指令周期内完成;
                     不知到STC8051 有没有这么严格要求触发时序?
我准备明天抽空来测试一下;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:240
  • 最近打卡:2025-05-08 07:04:54

61

主题

818

回帖

1518

积分

金牌会员

积分
1518
发表于 2024-7-17 06:32:10 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-9 02:11 , Processed in 0.130067 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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