利用数字示波器调试嵌入式I2C总线
首先,需要确认通信环境无问题,即:总线连接无问题;DSP的I2C通信程序无问题;Cypress 68013A的I2C通信无问题。
经依次验证后发现以上各项均无问题,那么,只可能是在通信过程中发生了错误。但是,在参考手册中却没有找到关于68013A与EEPROM通信的详细描述。为获取两者间在初始通信阶段的详细数据,使用RIGOL公司的DS6104示波器来捕获初始阶段的通信数据。
DS6104示波器具有I2C触发及I2C解码套件,为捕获数据需设置如下:设置DS6104示波器触发方式为“I2C”、触发条件为“启动”;设置触发时钟信源、数据信源及合适的触发电平;打开I2C解码并设置解码阈值;设置示波器为单次触发。设置完毕后,通过监测I2C与EEPROM通信即可捕获全部的通信数据头,图3所示为所得解码数据。
![](http://m.amcfsurvey.com/editerupload/fetch/20131127/194699_2_0.jpg)
图3:Cypress 68013A与EEPROM I2C初始通信数据。
通过与读入DSP内存的固件数据(图4)对比可知,图中的“0xC2 0x47 ...”及后续数据才是真正的固件数据。因此,导致DSP模拟EEPROM通信失败的原因是从起始数据至固件数据间的I2C通信(后文将称其为握手通信)。使用DS6104的水平时基微调功能将图中波形展开之后,便可更清楚地看到握手通信过程(图5),其描述如下:读地址“0x50”,无数据返回;读地址“0x51”,返回“0xAD”;写地址“0x51”,写两个字节“0x00”。
![](http://m.amcfsurvey.com/editerupload/fetch/20131127/194699_2_1.jpg)
图4:读入DSP内存的68013A固件程序数据(部分)。
至此,问题得以简化为:怎样在DSP中模拟这部分的握手通信?通过示波器获取可视化握手通信数据以后,则模拟其通信过程仅需以下三步:设置DSP的I2C总线地址为“0x51”,与地址“0x50”不匹配则无返回;在DSP的I2C通信程序中,下载固件时先发送“0xAD”,满足“0x51”地址上读到的第一个数据为“0xAD”;DSP通过I2C下载固件时,可以接收“0x00”但不进行处理,保证握手通信的完整性。
如上所述,在DSP的I2C通信程序中包含此部分握手通信处理后,使用DSP模拟EEPROM与Cypress 68013A便可进行正常通信,并可成功地下载68013A固件。
![](http://m.amcfsurvey.com/editerupload/fetch/20131127/194699_2_2.jpg)
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论