今天学习 USB CDC 的记录和感受
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 进行通信测试成功了!
所以, 这次的教训就是:硬件电路还是要严格按照官方图纸来焊接,细节的差异就会影响性能;反而言之,如果硬件的走线长了,干扰大了,不得已的情况下,就得考虑降速运行,或许也是一条挽救的路!
更正一下,P3.2引脚上有焊接100R的串接电阻和5.1K的上拉电阻,由于焊的是0603的,刚才没有注意细看,对不起。 其他电容都是直插的电解和独石的,很明显。 我也犯过同样错误 ucap是接0.1uf接地吧 soma 发表于 2024-7-15 08:52
ucap是接0.1uf接地吧
是的 今天继续阅读文档,主要看了串口1和串口2;
其中,异步串口的收发功能基本都使用过;但是,相比传统的8051,串口接收超时的功能还是蛮有意思的:
对于一般没有使用 TLV 格式(标签,长度,数据段), 有头有尾固定长度的 串口数据包,数据接收啥时候结束不太好判断,要么需要自己加一个定时器来做接收超时,比较麻烦;
现在STC芯片为我们考虑周全了,只要设置 UR1TOCR,使能接收超时,使能超时中断(中断入口还是原来的串口中断入口),选择好超时计数时钟源,然后按照自己要求的超时时间,结合前面设置的超时计数时钟源,计算并设置 UR1TOTE/H/L 这3个寄存器(注意: 设置数据的寄存器顺序必须是 L/H/E);
需要注意的是,这个接收超时中断 实际是串口数据字节之间接收超时,可以理解为正常串口输入的数据字节之间的最大间隔时间的判断,超过这个设置的间隔时间,就认为接收超时了。 必须先正常接收首字节后才会触发硬件的接收超时判断和响应功能;
相比其他有些ARM芯片的固定的串口接收超时功能(某芯片是固定的3.5个波特率时间),STC的更加灵活,给用户自己来设置超时时间长度了!
另外有点遗憾的是,串口1.2涉及的LIN总线和smartcard,相关的基础知识描述比较少;
LIN这块,我看了一下,还好有例程提供,后面可以学习一下。smartcard 部分,貌似还没有提供相关的例程,也许将来也会提供的吧。
今天阅读了STC8051U 文档的 EEPROM的IAP操作 部分:
感觉操作模式和老的STC的8051芯片相比,差别不大, 但是操作速度有了明显的增加, 操作延时减少了;
差异就是:
以前2字节地址, 现在扩展为3字节地址;
以前不在程序烧写的时候划分出专门的EEPROM区,而是直接通过IAP指令对CODE区进行读,写,擦除操作;
现在也可以通过MOV指令跨区直接读EEPROM的字节内容; 以前是在一个区,直接用 movc 指令, 或者C语言的 CBYTE[]宏定义直接操作;
有一个小疑问: 有些型号的单片机, 在触发寄存器操作时, 即依次写入 5AH,A5H 时, 还有时间限制, 必须在4个指令周期内完成;
不知到STC8051 有没有这么严格要求触发时序?
我准备明天抽空来测试一下; {:4_174:}{:4_174:}{:4_174:}
页:
[1]