当前位置: 代码迷 >> 驱动开发 >> 疑难有关问题——
  详细解决方案

疑难有关问题——

热度:87   发布时间:2016-04-28 10:49:21.0
疑难问题——高手请进
各位好,
  许久没来,甚是想念^_^ 问题很没思路,还望各位帮忙~ 深表感谢!

GPIO模拟I2C,读写EEPROM的一个驱动程序,该驱动大概是半年前写的,在powerpc、arm
两个架构下运行一直正常,现由于需要,将其转到mips下,本以为很简单,但没想出了一
系列问题。(MCU是realtek8198)

目前无法实现EEPROM的读写,实在是找不出原因,以下是我已经做过的一些工作,麻烦各位出谋划策~


1、先确定是否将数据发送到了EEPROM的SCL,SDA管脚上.
  我在驱动里对data寄存器的对应位进行反复置10操作, 使用示波器,可看到连续的方波。
  即,信号是有发出并到达的。
 
2、按照I2C总线协议进行数据发送,按理说,只要协议部分代码没错,就搞定了。但...
  对于协议部分代码,由于之前两个架构下都是正常运行的,所以这部分代码应该是不会
  出错的。

以上两点无误后,基本就没什么思路了...还确认了下其他一些可能问题。

3、延时, 这个出问题可能性比较大,但我又不知道这个到底应该怎样设,查了内核这块代码,
  发现一般是udelay(1)或udelay(2),我从0尝试到10,以及20,30.均不行。 
  以前代码是使用的asm("nop");,一个asm表示1us,之前默认是5个, 我尝试了1,5,10,15,20
  也是均不行。 延时这部分就只做了这些工作,不知道如何完全确定延时大小,知道的还望指点下。

4、EEPROM地址问题。EEPROM型号一直是AT24C02,7位寻址, 前四位应该是固定的1010吧?昨天跟
  硬件确认了A0 A1 A2 wp均为接地, 则地址为: A0/A1,如果硬件没坑我的话,那地址问题也排除了。

5、大小端问题。 datasheet写的实在朦胧,在menuconfig里CPU又默认选中的大端。 但我一直感觉是小端,
  做了仔细的测试,对比了其操作reg的代码,反正按照现在对reg的操作,可以实现上面第1点的内容,即
  现在操作的reg位,就是需要控制的位。

能想到的差不多了,以下是乱想猜测...

6、硬件上是不是电阻,上拉下拉啥的没接对...

7、GPIO的寄存器设置不正确,但我反复检查了,ctl,dir,isr,imr,以及一个share pin reg,
  大小端没搞错,这块设置上,应该就没什么差错。
  控制寄存器选择该管脚是外围器件还是GPIO,我选的GPIO,难道选外围器件?
  isr,中断状态寄存器,选置1是清中断,0没说意思, 在imr中中断是关闭了的,则这个寄存器
  不用设置吧? 我设1,或不设都试过,不行...

8、内核里什么支持没开。 但基于第1点,信号可以过去,应该就不需要特意开什么了吧?
  对比了之前内核的选项,仿照选了几个I/O相关的,也不确定具体意思。

9、realtek的rootfs是只读的,当初为了创建个设备节点,编译个KO出来,等等都花了些力气,
  但现在根文件系统依然是只读的, 不知道这个会不会有影响? 基于第1点,应该不会吧??
   
10...

唉,迷茫费解了, 想不出啥原因了, 各位会的麻烦支支招,不会的,念在敲这么多字份上,帮忙顶下吧,


谢过~ 


------解决方案--------------------
看来你不懂硬件,那么找硬件人员跟你一起调试。你移植这个,要修改的只是GPIO寄存器的几个操作地址,确保GPIO的DIR设置正确,并保证延时没有问题(让硬件人员帮你量SCL的频率)
------解决方案--------------------
最高400K,最低看芯片,有的要求100K以上有的没要求
------解决方案--------------------
把start寻址波形抓出来,确认时钟小于400K,确认start波形正确,确认波形显示的地址部分正确。确认第九个时钟的高电平期间数据线被EEPROM拉低。
------解决方案--------------------
看了你前两个描述
 确定一下
 1 是否你的GPIO 模拟I2C,是在其他工程中正常使用的? 即没有问题?

 
 如果是:
 下面就假设你的GPIO模拟,I2C 的时序是符合要求的

再一个假设,就是硬件没有问题

则, 速度不能太快,,要检查时钟

 
 
  相关解决方案