IIC EEPROM读取解析

1. 编译错误处理(这里可以忽略)

在解压包解压了程序后,直接编译,出现如下错误。

*** WARNING L14: INCOMPATIBLE MEMORY MODEL

MODULE:  .\EZUSB.LIB (RESUME)

MODEL:   SMALL

*** WARNING L14: INCOMPATIBLE MEMORY MODEL

MODULE:  .\EZUSB.LIB (DISCON)

MODEL:   SMALL

*** WARNING L14: INCOMPATIBLE MEMORY MODEL

MODULE:  .\EZUSB.LIB (EZREGS)

MODEL:   SMALL

*** WARNING L14: INCOMPATIBLE MEMORY MODEL

MODULE:  .\EZUSB.LIB (GET_STRD)

MODEL:   SMALL

*** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH

SYMBOL:  PSTRINGDSCR

MODULE:  .\EZUSB.LIB (GET_STRD)

*** WARNING L14: INCOMPATIBLE MEMORY MODEL

MODULE:  .\EZUSB.LIB (DELAY)

MODEL:   SMALL

*** ERROR L107: ADDRESS SPACE OVERFLOW

SPACE:   CODE

SEGMENT: ?C_INITSEG

LENGTH:  16BFH

*** ERROR L107: ADDRESS SPACE OVERFLOW

SPACE:   CODE

SEGMENT: ?C_INITSEG

LENGTH:  16BFH

*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT

SEGMENT: ?C_INITSEG

MODULE:  periph.obj (PERIPH)

*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL

SYMBOL:  PSTRINGDSCR

MODULE:  .\EZUSB.LIB (GET_STRD)

ADDRESS: 0B27H

*** ERROR L118: REFERENCE MADE TO ERRONEOUS EXTERNAL

SYMBOL:  PSTRINGDSCR

MODULE:  .\EZUSB.LIB (GET_STRD)

ADDRESS: 0B29H

*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT

SEGMENT: ?C_INITSEG

MODULE:  firmware.obj (FIRMWARE)

*** ERROR L119: REFERENCE MADE TO ERRONEOUS SEGMENT

SEGMENT: ?C_C51STARTUP

MODULE:  E:\SOFTWAREINSTALL\PROJECT\KEIL_FOR_51\C51\LIB\C51L.LIB (?C_INIT)

ADDRESS: 0838H

*** ERROR L120: CONTENT BELONGS TO ERRONEOUS SEGMENT

SEGMENT: ?C_INITSEG

MODULE:  E:\SOFTWAREINSTALL\PROJECT\KEIL_FOR_51\C51\LIB\C51L.LIB (?C_INIT)

面对错误,首先是百度了下,甚至还翻墙google,好多说是keil为不完全版本,只能编译2kB的程序,超出会报错overflow,给出的方案是

方案一:下载完整版keil,重装试一下。

方案二:对图 1中的箭头位置进行修改,在这里看出,方案一不适用。

图 1 修改配置

按照方案二试着修改(各种实验修改)配置后,warming消除了,但是对error没有什么卵用。后来发现图 2中所示的Device没有选对。

图 2 选择设备

修改图 2中的设备,选为CY7C68013×××-×后,还要在图 2中的可选项Use Extended Linker(LX51) instead of BL51选中,这样就可以编译通过了。

但是吧,这个虽然编译通过了,但是程序好像是错误的。因为通过0xED vendor command进行读取EEPROM的数据时,提示错误!

我之前用的是历程中已经解压的程序,后来讲例程中的压缩包程序解压后,编译直接通过,上面两处错误(设备和选项)没有改,下进了CY7C68013A中后,通过0xED vendor command进行读取EEPROM时,会有数据返回,虽然返回的不是预期的,再查证。

2. 程序解析

首先初始化:TD_init();

然后是设备描述符的相关处理;

接着是循环执行:TD_Poll()函数,在这个函数里,往IIC接口的EEPROM里面写入数据(写入是一次写一个),同时在EEPOM里面读出数据(读出是一次将写入的3个同时读出),并存入到寄存器中。

在循环函数中,检测控制传输令牌包的到来,一旦接收到令牌包,就会将存放IIC读书数据的寄存器中的数传到主机。

3. 运行错误处理

这个程序可以直接用。并且将1错误处理中的device改为CY7C68013和option选上了。

其实PDF(CE63180)文档里面已经写得非常详细。

就是在上电之前,将EEPROM的跳线帽拔下来,不让他在EEPROM中启动,这样PC才可以识别到设备,上电后,下载程序前将跳线帽插上,这样在下载了程序后,会自动的往EEPROM中写数据。

在PC的上位机软件中做如图 3配置,点击Vend Req按钮,即可读取程序自动写入EEPROM中的数据。但是不知道是没有写入,还是读取不成功,返回来的数据都是00,00,00 ,显然,这是不正确的。经过示波器测试IIC的数字信号,发现发出的都是10100000。再结合IIC的通信协议,发现这是发送的IIC 芯片的地址。读出来的数据时00,00,00是因为程序是按照官方的开发板写的,但是淘宝的开发板和官方的有点区别。图 3和图 4对比所示。由两个不同IC(24LC00和24L128)的datasheet可以看出,他们IIC地址的前4为均为1010,后面三位由电平决定。图 3中A2,A1,A0均为0,所以地址为1010_0000(0xA0)。而淘宝开发板的A0被拉高,所以地址为1010_0010(0xA2)。因为用的是淘宝的开发板,所以这里要修改。

在程序中Periph.c文件中有一个宏定义:#define   EEPROM_ADDR   0x50,这个宏在TD_init()函数中赋值给了IIC地址:I2C_Addr = EEPROM_ADDR;

因为在写地址时,先把地址左移一位(I2DAT = I2C_Addr << 1),所以这里的宏定义为地址的右移一位值:0x50 = 0xA0 >> 1。

由于使用了淘宝货,这里没有改的话,就不能往EEPROM中写入数据,也不能读取,所以返回来的是00,00,00,如图 5。这里要在程序中将宏的值改为EEPROM地址的右移一位值:0x51 = 0xA2 >> 1。

图 3 官方开发板原理图

图 4 淘宝开发板原理图

图 5 上位机的配置

进行了如上修改之后,再次烧录,读取。发现读出来的数据不正确如图 6所示,用示波器测试,发现现在不只是发送0xA0那么简单了,具体是什么也没有细究。

接下来继续看程序。在图 7所示的TD_init()中的注释引起了注意,DB_Addr = 1 if the EEPROM is double byte addressing(双字节寻址)

图 6 修改地址后的读取值

图 7 TD_init()函数

将TD_init()中的DB_Addr = 0改为DB_Addr = 1后,下载读取,可以实现将TD_Poll()中写入EEPROM中的数据读出来并返回到host。如图 8所示

图 8 读取正确数据

通过此实验可以证明,开发板上用的ATMEL的24C128 EEPROM是双字节寻址。下了数据手册,看数据手册,在第7页的Device addressing中,如图 9所示,但是这里的8bit是device addressing,是IIC的地址,不是我们写入和读取的存储空间的地址。所以不是看这里。

图 9 datasheet 的描述

接着往下看,在第8页和第9页中,写入时序和读取时序分别如图 10和图 11所示,可以明确看出,前面方框中的device address与上面的描述对应,椭圆中的word address分为了1st,2nd两个字节byte,为double byte addressing(双字节寻址),可以与24LC00 datasheet中的时序图作对比,发现它是单字节寻址,因此官方例程中的DB_Addr = 0。完美解决。睡

图 10 写入时序

图 11 读取时序

此问题的解决,也是通过翻墙,在google搜索中,搜到的别人的答案。连接为:https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=17590

在连接中有启发的回答为图 12所示

图 12 有启示的回答

USB小白学习之路(6) IIC EEPROM读取解析的更多相关文章

  1. USB小白学习之路(10) CY7C68013A Slave FIFO模式下的标志位(转)

    转自良子:http://www.eefocus.com/liangziusb/blog/12-11/288618_bdaf9.html CY7C68013含有4个大端点,可以用来处理数据量较大的传输, ...

  2. USB小白学习之路(11) Cy7c68013A驱动电路设计注意事项(转)

    Cy7c68013A驱动电路设计注意事项 转自:http://group.chinaaet.com/116/79029#0-tsina-1-71467-397232819ff9a47a7b7e80a4 ...

  3. USB小白学习之路(8)FX2LP cy7c68013A——Slave FIFO 与FPGA通信(转)

    此博客转自CSDN:http://blog.csdn.net/xx116213/article/details/50535682 这个博客只对自己理解CY7C68013的配置有一定的帮助,对于配置CY ...

  4. USB小白学习之路(5) HID鼠标程序

    HID鼠标程序 1. 特别注意 需要特别注意,各个例程中的设备描述符,配置描述符等各种描述符都是已经配置好了的,我们需要做的只是在例程中将代码修改为自己需要的部分即可,一般情况下是不可以串搭配的. 2 ...

  5. USB小白学习之路(4)HID键盘程序

    HID键盘程序 1. 特别注意 需要特别注意,各个例程中的设备描述符,配置描述符等各种描述符都是已经配置好了的,我们需要做的只是在例程中将代码修改为自己需要的部分即可,一般情况下是不可以串搭配的. 2 ...

  6. USB小白学习之路(3) 通过自定义请求存取外部RAM

    通过自定义请求存取外部RAM 1. 实验简述 此实验是对自定义的供应商特殊命令(vendor specific command bRequest = 0xA3)进行解析,程序中的read me说明如下 ...

  7. USB小白学习之路(2)端点IN/OUT互换

    端点2(out)和端点6(in)的out_in互换 注:这里的out和in都是以host为标准说的,out是host的out,在设备(Cy7c68013)这里其实是输入端口:in是host的in,在设 ...

  8. USB小白学习之路(1) Cypress固件架构解析

    Cypress固件架构彻底解析及USB枚举 1. RAM的区别 56pin或者100pin的cy7c68013A,只有内部RAM,不支持外部RAM 128pin的cy7c68013A在pin脚EA=0 ...

  9. USB小白学习之路(12) Cy7c68013A固件之Slave FIFO(转)

    Cy7c68013固件之Slave FIFO 转自:http://blog.csdn.net/zengshaoqing/article/details/53053539 选择SlaveFIFO传输方式 ...

随机推荐

  1. Keywords|Result|Final check

    科研论文写作 风格最好是excited,不要过于谦虚. Reference不要过多引用自己的paper,可以多引用本刊物的paper. Acknowledgement:感谢帮助input的人员,可以n ...

  2. /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin/java: No such file or directory

    在linux使用两个tomcat的时候, 执行./shutdown.sh的时候, 遇到了这个问题 这个可怎么办呢 原来是我的java下面的文件目录是/java-1.8.0-openjdk-1.8.0. ...

  3. iso镜像文件的挂载和yum库的搭建

    挂载镜像文件 1.上传镜像文件到服务器(或电脑)的某一目录下   如:(/media/rpm_pack/rhel...iso) 2.root 用户下创建镜像文件挂载目录 mkdir  /mnt/vcd ...

  4. RDD(七)——依赖

    概述 RDD只支持粗粒度转换,即在大量记录上执行的单个操作.将创建RDD的一系列Lineage(血统)记录下来,以便恢复丢失的分区.RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD ...

  5. word打印,和打印预览

    public void Print(object fileName)        {            try            {                foreach (Syst ...

  6. Tript协议|伯尔尼公约|著作权|立法宗旨|自动保护|著作权集体管理|

    知识产权 国际条约: Tript协议是国际性公约,<与贸易有关的知识产权协定>(英文:Agreement on Trade-Related Aspects of Intellectual ...

  7. VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【VB.Net版】

    VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.vb这个默认文件中. 大家可以在Visual Studio中创建 ...

  8. kettle的基本使用

    一.下载下载kettlehttp://sourceforge.net/projects/pentaho/files/Data%20Integration/7.0/pdi-ce-7.0.0.0-25.z ...

  9. java后端导出excel

    最近工作中需要导出excel.这次机智一点做个笔记,顺便写了一个比较通用的工具类.自然目前不能生成java实体类属性嵌套多次的这种没办法导出了,后续有需要的时候我再改改. 首先,java后端导出exc ...

  10. windows下面apache配置虚拟目录(测试使用,发布网站不建议目录访问)

    windows下面是这样简单设置 1 Apache虚拟目录: 针对某一目录可以这么设置: Alias /aidd2008 "D:/php/web/aidd2008" <Dir ...