注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
IamFoxdeng的个人空间 https://home.eeworld.com.cn/space-uid-579941.html [收藏] [复制] [分享] [RSS]
日志

从最低级的信号波形分析程序流程的关键节点

热度 1已有 993 次阅读2014-10-15 11:31 | 信号分析, 程序流程, 反向工程

嵌入式软件工程师可能经常会碰到如下的问题:
   “为什么厂家提供的demo板能够很好的运行,而我根据厂家提供的编程指南甚至实例代码所编写的程序就出现多个问题呢?”
   本人所经历的这个实例可以带给各位同行的一点启示。
  背 景分析:国内某家厂商的spi接口的电力载波芯片;获得了demo板datasheet(但是不是非常的详细,发现这是国内芯片厂家的通病),和实例程 序。使用实例程序在自己平台上改写的通信代码并不能很好的通信,经过多次分析,我认为:芯片厂家提供的实例代码是有问题的,其demo板内部MCU并不是 完全按照这个方式来处理的。
  本人拿出逻辑分析仪来分析厂家demo板(demo板能够很好的通信)的运行情况。
  如下是分析仪跟踪载波芯片所捕捉波形的一些片段:

注意的是:SPI通信为8bit MSB 方式,读芯片时地址最高位为1,写芯片则为0
 
如上的波形反复出现,表示的意思是:向地址寄存器0x01写入数据0x8D,并马上读取地址0x02(0x82,高位为1,即0x02寄存器所对应的读地址)的数据,获得二进制数据00100100即0x24
继续观察波形文件,上述的数据反复出现多次:

每次波形之间的时间比较固定,间隔可以利用工具测量出来。因为时间固定,可以推断代码定时执行。

图 片信息解读:程序在循环执行(写寄存器0x01-读寄存器0x02)的动作,其中读写动作是在一个循环体内部顺序执行的(所以时间上是连贯的)。时间间隔 大约为400us,这个时间很短,操作系统是不能提供这么小而精密的时间间隔。所以,这个循环动作是放在一个硬件定时器的ISR完成的。
为什么一直在执行这个循环呢?那它一定是等待一个可以改变程序流程的条件。
而这个条件一定与读取寄存器0x02所获得的数据有关键的关系(结合数据手册分析),因此接下来应当仔细寻找数据跳变的波形。

上图可以看出:寄存器0x02的数据出现01011100(b)时,紧跟的动作时向寄存器0x03写入0x00
而0x02之前的数据为01010100(b),即bit3置位时程序流程会改变。因此bit3是条件语句执行的一个条件
程序应该有类似
if(read(0x02)&0x08)
{
 xxxx
}
的语句片段
接下来波形

反复出现,说明程序在等待寄存器0x03和0x02的数据。
果然,出现如下波形

从寄存器0x03(读到数据00000101(b))和寄存器0x02分别读到了数据, 并且立即对寄存器0x3写入操作。
而这部分的写入,厂家提供的datasheet没有非常详细的说明,示例代码也没有这样操作!
由此可以在自己平台上做对应的修改了。
后续的步骤按照类似的方式进行。



发表评论 评论 (1 个评论)
回复 yunfenglw 2014-10-17 20:22
赞!~

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章