搜索
bottom↓
回复: 8

亲身测试过的AVR和51通用的IIC读写eeprom协议

[复制链接]

出0入0汤圆

发表于 2012-6-30 13:37:15 | 显示全部楼层 |阅读模式
本帖最后由 YS126 于 2012-6-30 13:41 编辑

              
      某日在论坛里无意看到网友上传的AVR和51通用的IIC代码,于是下载下来试用,发现问题不少。      
      于是忍不住修改了一下,并亲身测试了一番。51是在keil上编译的, AVR是在CVAVR2.053上编译。
      现在的版本只要修改一下宏定义就可以在51和AVR上应用了。
      理论 上支持EEPROM全系列的的片子,因为手头只有24C32,所以只是测试了24C32,所以请有其他系列的网友测试下,并反馈下问题,好完善这个驱动~~~
     
     

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-30 14:02:56 | 显示全部楼层
支持下楼主了

出0入0汤圆

发表于 2012-6-30 21:12:11 | 显示全部楼层
小白路过!!!不太懂,不过还是要支持楼主!!

出0入0汤圆

发表于 2012-9-25 22:43:19 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2012-9-25 23:17:12 | 显示全部楼层
感谢楼主的分享,小弟菜鸟一个,有个问题不知道该如何解释希望楼主可以帮忙分享下答案,问题描述如下:
小弟现在使用的是24LC04B这款芯片,看数据手册的时候,数据手册里面说到,“接收的重器件没接收到8个bit的字符之后都需要返回一个确认信号”。
您给出的启动信号以及写8位数据和返回应答信号的代码如下:

/*============================================================
起始信号:   时钟(SCL)为高电平时, SDA 从高电平变为低电平
------------------------------------------------------------*/
void  i2cStart(void)
{
    SCL_H;
    SDA_H;
        DELAY_us;
    while((SDA_IF_L) || (SCL_IF_L)) {;}  //总线空闲
    DELAY_us;
    DELAY_us;
    while((SDA_IF_L) || (SCL_IF_L)) {;}
    DELAY_us;
    SDA_L;
        DELAY_us;
    SCL_L;
        DELAY_us;
}

/*============================================================
写数据u8a, 并返回应答信号,
写入成功返回1,失败返回0
------------------------------------------------------------*/
u8  i2cWrite(u8 a)
{
        u8 i;

    for(i=0;i<8;i++)     // 发送一个字节的数据
    {
            if(a & 0x80)
        {
            SDA_H;
        }
        else
        {
            SDA_L;
        }
            SCL_H;
        DELAY_us;
        SCL_L;
        a = a<<1;
        DELAY_us;
    }
    DELAY_us;
    SDA_H;               //准备接受应答
    DELAY_us;
    SCL_H;
    DELAY_us;
    if(SDA_IF_L)                //测试应答,有应答
    {
                __Gu8Ack = TRUE;
    }
    else                //无应答
    {
                __Gu8Ack = FALSE;
    }
    SCL_L;               // 钳住时钟线
    DELAY_us;
    return __Gu8Ack;
}

总体的时序小弟大概都理解,就是对里面的一个细节不知道该如何理解。
在i2cWrite函数中,写完8位数据之后,在for循环之内将SCL设置为低电平。在结束for循环之后,
您首先延时一段时间,然后拉高SDA_H准备接受应答,可是延时之后您又拉高了SCL。对于拉高SCL之后的代码小弟个疑问:
为什么不是在SCL为低的状态下,而是在高的状态下准备接受应答信号?
希望楼主前辈可以不吝赐教,谢谢!

出0入0汤圆

 楼主| 发表于 2012-9-26 22:12:52 | 显示全部楼层
本帖最后由 YS126 于 2012-9-26 22:14 编辑
eleven_sue 发表于 2012-9-25 23:17
感谢楼主的分享,小弟菜鸟一个,有个问题不知道该如何解释希望楼主可以帮忙分享下答案,问题描述如下:
小 ...



你详细参考下周立功的I2C协议~~~~          7.2  响应


里面说到:   数据传输必须带响应 ,相关的响应时钟脉冲由主机产生, 在响应的时钟脉冲期间 发送器释放 SDA 线(高),
在响应的时钟脉冲期间, 接收器必须将 SDA 线拉低,
使它在这个时钟脉冲的高电平期间保持稳定的低
电平 (见图 7)
当然, 必须考虑建立和保持时间 (在第 15 章详细说明)

你下一份,周立功的I2C协议,仔细看下图7 ~

出0入0汤圆

 楼主| 发表于 2012-9-26 22:14:01 | 显示全部楼层
给你附上响应的时序图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入213汤圆

发表于 2012-9-27 11:00:19 | 显示全部楼层
坛上好人多.不过我基本用的芯片很杂,有时还需引脚共用,所以楼主好意俺心受了.

出0入0汤圆

发表于 2012-10-2 08:10:21 | 显示全部楼层
感谢分享!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表