逆向工程协议
Reverse-Engineering Protocol
我有一个项目涉及鼠标的光学传感器。我有两个隔离的通信引脚(数据和时钟),但我没有数据表,我一直在用头撞墙试图弄清楚这个问题。我终于使用我的微控制器对协议进行了不错的捕获——虽然它不是完全同步的,但分辨率应该足够高以识别发生了什么——每个样本都被采集,然后是 ~4us 延迟
当我查看绘制的数据时,我看到数据线有时在时钟不移动时移动 - 并且数据线似乎比时钟移动得更一致,这让我相信我的假设哪个是数据,哪个是时钟可能已经落后了。但是,我也看到时钟线在数据不移动时移动 - 这对我的猜想没有任何意义。
我希望在这里看到的是 - 尽管我越来越相信协议是以这种方式设置的 - 是一些关于特定注册信息的请求,然后是 return信息。也许在通信的最开始也有配对或初始化(这是捕获开始的地方)。
如果有人能帮助我弄清楚这里发生了什么,我将不胜感激,因为我对此还很陌生,而且完全迷失了方向。
可在此处找到 CSV 格式的数据:https://pastebin.com/h9Hx1dyw
前 50 行只是原始粘贴在这里,因为该网站不允许我在没有代码的情况下提问:
Time Index,Data,Clock
0,0,1
1,1,1
2,1,1
3,1,1
4,1,1
5,1,1
6,1,1
7,1,1
8,1,1
9,1,1
10,1,1
11,1,1
12,1,1
13,1,1
14,1,1
15,1,1
16,1,1
17,1,1
18,1,1
19,1,1
20,1,1
21,1,1
22,1,1
23,1,1
24,1,1
25,1,1
26,1,1
27,1,1
28,1,1
29,1,1
30,1,1
31,1,1
32,1,1
33,1,1
34,1,1
35,1,1
36,1,1
37,1,1
38,1,1
39,1,1
40,1,1
41,1,1
42,1,1
43,1,1
44,1,1
45,1,1
46,1,1
47,1,1
48,1,1
49,1,1
50,1,1
我会用gtkwave来分析你的样本,事实上我做了,它支持.vcd
个文件作为输入,这似乎很容易生成。
有一个工具可以将 .csv
文件转换为 .vcd
、csv2vcd,但是您的 csv 首先需要进行一些格式化,我使用命令 awk
来移动第一列到最后一列并将其值转换为微秒"us"(时间0虽然需要以秒为单位,后缀's',或者 csv2vcd 会失败)
cat input.csv | awk -F',' 'FNR==1{print ","","; next}{print "," "," (*4)".0 us"}' >output.vcd
output.csv
会需要手动编辑那么,就这样
"d0","d1","Time"
0,1,0.0 s
1,1,4.0 us
...
and 删除文件中的最后一行 否则 csv2vcd 将失败(d0 and d1例如我想你可以随意命名)
此时可以将vcd文件载入gtkwave,将信号拖入Time[=] 52=](至少在 linux 中是这样)并分析您的样本。
您可以使用combine up/down(多次)将位组合为两个位、一个半字节、一个字节等。我试过你的数据,但没有解码协议(ack/nack/stop/sync/whatever 位)似乎没用。
但问题是 vcd 文件可能更复杂并且包含更多数据,请参阅屏幕截图 there 以获取包含解码数据和协议的示例。
这可能对您有用,如果您要尝试解码协议,验证解码器,请参阅 ArduLogic 项目中的模块 decode_i2c.cc从 i2c 2 位输入创建一个 vcd 文件。
我有一个项目涉及鼠标的光学传感器。我有两个隔离的通信引脚(数据和时钟),但我没有数据表,我一直在用头撞墙试图弄清楚这个问题。我终于使用我的微控制器对协议进行了不错的捕获——虽然它不是完全同步的,但分辨率应该足够高以识别发生了什么——每个样本都被采集,然后是 ~4us 延迟
当我查看绘制的数据时,我看到数据线有时在时钟不移动时移动 - 并且数据线似乎比时钟移动得更一致,这让我相信我的假设哪个是数据,哪个是时钟可能已经落后了。但是,我也看到时钟线在数据不移动时移动 - 这对我的猜想没有任何意义。
我希望在这里看到的是 - 尽管我越来越相信协议是以这种方式设置的 - 是一些关于特定注册信息的请求,然后是 return信息。也许在通信的最开始也有配对或初始化(这是捕获开始的地方)。
如果有人能帮助我弄清楚这里发生了什么,我将不胜感激,因为我对此还很陌生,而且完全迷失了方向。
可在此处找到 CSV 格式的数据:https://pastebin.com/h9Hx1dyw
前 50 行只是原始粘贴在这里,因为该网站不允许我在没有代码的情况下提问:
Time Index,Data,Clock
0,0,1
1,1,1
2,1,1
3,1,1
4,1,1
5,1,1
6,1,1
7,1,1
8,1,1
9,1,1
10,1,1
11,1,1
12,1,1
13,1,1
14,1,1
15,1,1
16,1,1
17,1,1
18,1,1
19,1,1
20,1,1
21,1,1
22,1,1
23,1,1
24,1,1
25,1,1
26,1,1
27,1,1
28,1,1
29,1,1
30,1,1
31,1,1
32,1,1
33,1,1
34,1,1
35,1,1
36,1,1
37,1,1
38,1,1
39,1,1
40,1,1
41,1,1
42,1,1
43,1,1
44,1,1
45,1,1
46,1,1
47,1,1
48,1,1
49,1,1
50,1,1
我会用gtkwave来分析你的样本,事实上我做了,它支持.vcd
个文件作为输入,这似乎很容易生成。
有一个工具可以将 .csv
文件转换为 .vcd
、csv2vcd,但是您的 csv 首先需要进行一些格式化,我使用命令 awk
来移动第一列到最后一列并将其值转换为微秒"us"(时间0虽然需要以秒为单位,后缀's',或者 csv2vcd 会失败)
cat input.csv | awk -F',' 'FNR==1{print ","","; next}{print "," "," (*4)".0 us"}' >output.vcd
output.csv
会需要手动编辑那么,就这样
"d0","d1","Time"
0,1,0.0 s
1,1,4.0 us
...
and 删除文件中的最后一行 否则 csv2vcd 将失败(d0 and d1例如我想你可以随意命名)
此时可以将vcd文件载入gtkwave,将信号拖入Time[=] 52=](至少在 linux 中是这样)并分析您的样本。
您可以使用combine up/down(多次)将位组合为两个位、一个半字节、一个字节等。我试过你的数据,但没有解码协议(ack/nack/stop/sync/whatever 位)似乎没用。
但问题是 vcd 文件可能更复杂并且包含更多数据,请参阅屏幕截图 there 以获取包含解码数据和协议的示例。
这可能对您有用,如果您要尝试解码协议,验证解码器,请参阅 ArduLogic 项目中的模块 decode_i2c.cc从 i2c 2 位输入创建一个 vcd 文件。