基于STM32的PD抓包器
目录
前言
一、实物展示
二、硬件设计
三、软件设计
四、GUI设计
总结
前言
平时经常做一些PD协议相关的开发,肯定少不了抓包器,目前市面上成熟的产品像Power-Z、GRL等都很好用,但是这些产品的vbus和cc波形采样速率有点低,且只有抓包的功能,就打算做一个高采样率的抓包器并带诱骗功能。闲来没事,就是干!
本项目旨在设计并实现一个基于STM32(或其他MCU)平台的USB PD抓包器,通过输入捕获、DMA和协议解析算法,实现对PD通信过程的实时采集与还原,可以更直观地理解PD协议流程、分析角色切换、诊断通信故障,同时也可以增加一些定制化的功能。
一、实物展示
STM32硬件:
手搓了一个简单的GUI上位机界面,目前的Log是Apple 18W充电头给小米充电宝充电,数据解析太多了,就做了简单几个
二、硬件设计
vbus采集使用分压电阻直接用内部ADC采集就可以,不讲究精度问题。
电流采集使用INA240A芯片,然后通过内部ADC采集,将电压数据转为电流值即可,原理图如下:
CC采集就比较简单了,直接一个运放做跟随器,连接到STM32即可。
三、软件设计
cubemx配置图:
1、比较器配置
选择比较器正极到CC引脚,负极通道到内部DAC,同时选择输出通道到定时器
2、DAC配置
设置CC信号的比较器负极的阈值,将CC低电压信号转为3.3V的数字信号,提供后级采样
3、ADC配置
目前只配置了CC采样的ADC,用于检查CC目前的电压状态,区分Vconn、attach、open,其对应的电压阈值可以参考USB-IFD的Type-C协议文档
4、串口配置
打印调试
5、USB_PD配置
打算做PD诱骗功能的,抓包器功能还没搞好,先配置在这里
6、USB_Device配置
只支持全速配置,打脑壳的很,每个端点只有64Byte,当时选型没注意这里,大意了。我没有c使用cubemx的usb类型配置,用的第三方库Cherryusb
7、Timer
采样核心,比较器的输出连接通道,使用DMA采集CC信号高低电平的时间,将时间信号转化为单独bit流,再将bit流转换为5B编码,5B编码转为4B编码后通过USB接口上传
可以看到Timer定时器干的事情很多,所以需要在一些数据转换的环节中插入fifo缓存,防止丢包!
8、Freertos
任务调度功能,代码模块化处理容易,其实裸机也可以,但是后期不好维护以及加其他功能。
四、GUI设计
用python-qt写的,比较简单,接收到STM32传输的数据后,解析数据,然后显示在界面上。解析的内容比较少,要根据USB-PD协议慢慢添加,东西太多了,精力有限。
总结
干了2-3周,感觉STM32的性能还是有限,计划增加ADC采集VBUS和CC电压的,但是目前PD信息传输还是会丢点包,因为用的USB通信(STM32无法支持高速通信,理论12M),只能靠加fifo,加了过多的fifo之后感觉RAM快爆了,所以后续还是考虑替换为FPGA接着干!!!这个STM32的方案就先放放....