查看: 1008|回复: 0
打印 上一主题 下一主题

为 STM8 USB 再添一把火 —— 固件讨论帖

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-7 13:12:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先整理一下资料:
        1. 俄罗斯原作者网站
        2. 本坛之前的讨论,STM8软件模拟USB国外已经有人搞定【有源码】
        3. 我的编译工具 为 STM8 USB 添一把火 —— 编译工具
        3. 我的原理图和 PCB 为 STM8 USB 再添一把火 —— 适合热转印的开发板

固件在Github上更新:https://github.com/wlianmin/stm8_usb

目前的状况: 可以枚举为 HID 设备, 但兼容性还有待提高, 在我的笔记本上可以识别, 台式机的3.0接口可以识别, 但台式机的2.0 接口不行. 时许还需要优化以下.

注意:需要配置 option byte 的 AFR0, 使能 PC6,PC7 的 alternate function  

详细说明:
先说一下大体的流程:
首先,通过中断来接收USB数据,接收完后,调用 void usb_rx_ok(void) 来应答或不应答,并识别数据包,把相应的状态写usb这个结构体里面。
然后,在主循环中不断的调用 void usb_process(void) 来根据 usb 里面的状态来做相应的动作。
设备描述符的发送是这样的:调用 void usb_send_data(uint8_t * buffer, uint8_t lenght), 将描述符打包,放到 usb.tx_buffer 里面,然后将状态改为已经准备好发送usb.event = USB_EVENT_READY_DATA_IN,等待主机发送 DATA IN 包。
usb_rx_ok 识别到 DATA IN 包并且 usb.event 为准备发送, 就会调用 void usb_send_answer(void)  来完成数据发送。
收藏收藏82
可以枚举为 HID 设备, 但兼容性还有待提高, 在我的笔记本上可以识别, 台式机的3.0接口可以识别, 但台式机的2.0 接口不行. 时许还需要优化以下.
代码已经更新到github上



这是抓到的数据和分析:
PID,Address,Endpoint,Frame #,Data,CRC
SETUP,0x00,0x00,,,0x02
DATA0,,,,0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00,0x94DD        //请求设备描述符
ACK,,,,,
IN,0x00,0x00,,,0x02
DATA1,,,,0x12 0x01 0x00 0x01 0xFF 0x00 0x00 0x08,0xF323
ACK,,,,,
IN,0x00,0x00,,,0x02
DATA0,,,,0x11 0x22 0x33 0x44 0x55 0x66 0x00 0x00,0x2979
ACK,,,,,
IN,0x00,0x00,,,0x02
DATA1,,,,0x00 0x01,0x8F3F
ACK,,,,,
OUT,0x00,0x00,,,0x02
DATA1,,,,,0x0000
ACK,,,,,
//////////////////////////////////////////////////////////设备描述符上传完成

SETUP,0x00,0x00,,,0x02
DATA0,,,,0x00 0x05 0x01 0x00 0x00 0x00 0x00 0x00,0x25EB        //设置地址
ACK,,,,,
IN,0x00,0x00,,,0x02
DATA1,,,,,0x0000
ACK,,,,,
//////////////////////////////////////////////////////////设置地址完成

SETUP,0x01,0x00,,,0x1D
DATA0,,,,0x80 0x06 0x00 0x01 0x00 0x00 0x12 0x00,0xF4E0        //使用新地址重新请求设备描述符
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x12 0x01 0x00 0x01 0xFF 0x00 0x00 0x08,0xF323
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA0,,,,0x11 0x22 0x33 0x44 0x55 0x66 0x00 0x00,0x2979
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x00 0x01,0x8F3F
ACK,,,,,
OUT,0x01,0x00,,,0x1D
DATA1,,,,,0x0000
ACK,,,,,
//////////////////////////////////////////////////////////设备描述符上传完成

SETUP,0x01,0x00,,,0x1D
DATA0,,,,0x80 0x06 0x00 0x02 0x00 0x00 0xFF 0x00,0xA4E9        //请求配置描述符
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x09 0x02 0x12 0x00 0x01 0x01 0x00 0x80,0xB00E
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA0,,,,0x32 0x09 0x04 0x00 0x00 0x00 0x03 0x00,0x4DA5
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x01 0x00,0xDFFF
ACK,,,,,
OUT,0x01,0x00,,,0x1D
DATA1,,,,,0x0000
ACK,,,,,
//////////////////////////////////////////////////////////配置描述符上传完成

SETUP,0x01,0x00,,,0x1D
DATA0,,,,0x80 0x06 0x00 0x01 0x00 0x00 0x12 0x00,0xF4E0        //请求设备描述符
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x12 0x01 0x00 0x01 0xFF 0x00 0x00 0x08,0xF323
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA0,,,,0x11 0x22 0x33 0x44 0x55 0x66 0x00 0x00,0x2979
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x00 0x01,0x8F3F
ACK,,,,,
OUT,0x01,0x00,,,0x1D
DATA1,,,,,0x0000
ACK,,,,,
//////////////////////////////////////////////////////////设备描述符上传完成

SETUP,0x01,0x00,,,0x1D
DATA0,,,,0x80 0x06 0x00 0x02 0x00 0x00 0x09 0x00,0x04AE        //请求配置描述符
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA1,,,,0x09 0x02 0x12 0x00 0x01 0x01 0x00 0x80,0xB00E
ACK,,,,,
IN,0x01,0x00,,,0x1D
DATA0,,,,0x32 0x09 0x04 0x00 0x00 0x00 0x03 0x00,0x4DA5
//////////////////////////////////////////////////////////配置描述符上传完成

SETUP,0x01,0x00,,,0x1D
DATA0,,,,0x00 0x09 0x00 0x00 0x00 0x00 0x00 0x00,0xF426        //SET_CONFIGURATION
ACK,,,,,
IN,0x01,0x00,,,0x1D
IN,0x01,0x00,,,0x1D转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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