OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3889|回复: 8

关于i2c的读写操作

[复制链接]

11

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-11-20
在线时间
24 小时
发表于 2017-12-28 10:54:35 | 显示全部楼层 |阅读模式
1金钱
我将f407开发板的24c02换成了24c256,项目需要。我在例程中,将check函数改成这样如图那样,不知是否正确?我的定义也已经改了。

微信截图_20171228105423.png

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=applescript,true]/* * 函数名 24c256_readOneByte * 功能 从24c256特定位置读取一字节数据 * 返回值 0 成功 * 1 失败 */ u8 at24c256_readOneByte(u16 readAddr, u8 *data) { u8 getRetval; IIC_Start(); IIC_Send_Byte(0xA0); getRetval = IIC_Wait_Ack(); if(getRetval) { return 1; } IIC_Send_Byte((u8)(rea ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-2-24
在线时间
6 小时
发表于 2017-12-28 10:54:36 | 显示全部楼层
本帖最后由 SHIGUOZHU 于 2017-12-29 09:08 编辑

[mw_shl_code=applescript,true]/*
* 函数名    24c256_readOneByte
* 功能        从24c256特定位置读取一字节数据
* 返回值    0 成功
*            1 失败
*/
u8 at24c256_readOneByte(u16 readAddr, u8 *data)
{
    u8 getRetval;
   
    IIC_Start();
    IIC_Send_Byte(0xA0);
   
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
    IIC_Send_Byte((u8)(readAddr>>8&0xff));
   
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
    IIC_Send_Byte((u8)(readAddr&0xff));
   
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }

    IIC_Start();
    IIC_Send_Byte(0XA1);

    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
   
    *data = IIC_Read_Byte(0);
    IIC_Stop();
   
    return 0;
}


/*
* 函数名    24c256_writeOneByte
* 功能        向24c256特定位置写入一字节数据
* 返回值    0 成功
*            1 失败
*/
u8 at24c256_writeOneByte(u16 writeAddr, const u8 data)
{
    u8 getRetval;
   
    IIC_Start();
    IIC_Send_Byte(0xA0);
   
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
    IIC_Send_Byte((u8)(writeAddr>>8&0xff));
   
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
    IIC_Send_Byte((u8)(writeAddr&0xff));
   
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
   
    IIC_Send_Byte(data);
    getRetval = IIC_Wait_Ack();
    if(getRetval)
    {
        return 1;
    }
   
    IIC_Stop();
   
    delay_ms(5);
   
    return 0;
}


/*
* 函数名    24c256_check
* 功能        检查24C256是否正常
* 返回值    0 正常
*            1 异常
*/
u8 at24c256_check(void)
{
    u8 getData;
    u8 ret;
   
    ret = at24c256_readOneByte(0x7fff, &getData);
    if(getData==0x55){
        return 0;
    }
    else{
        at24c256_writeOneByte(0x7fff, 0x55);
        ret = at24c256_readOneByte(0x7fff, &getData);
        if(getData==0x55){
            return 0;
        }
    }
    return 1;
}


/*
* 函数名    at24c256_w_parameter
* 功能        向AT24c256特定位置写入特定参数,并写入校验位
* 返回值    0 成功
*            1 失败
*/
u8 at24c256_w_parameter(u16 writeAddr, const u8 *writeData, u8 dataLen)
{
    u8 i;
    u8 checkData;
    u8 ret;
   
    //此处该校验参数合法性
   
    for(i=0; i<dataLen; i++, writeAddr++)
    {
        ret = at24c256_writeOneByte(writeAddr, writeData);
        if(ret==1){
            return 1;
        }
    }
    //写入取反校验位
    for(i=0; i<dataLen; i++, writeAddr++)
    {
        checkData = ~(writeData);
        ret = at24c256_writeOneByte(writeAddr, checkData);
        if(ret==1){
            return 1;
        }
    }
   
    return 0;
}

/*
* 函数名    at24c256_r_parameter
* 功能        从AT24c256特定位置读取特定参数,并根据校验位判断
* 返回值    0 成功
*            1 失败
*            2 校验失败
*/
u8 at24c256_r_parameter(u16 readAddr, u8 *readData, u8 dataLen)
{
    u8 i;
    u8 checkData;
    u8 retval;
   
    //此处该校验参数合法性
   
    for(i=0; i<dataLen; i++, readAddr++)
    {
        retval = at24c256_readOneByte(readAddr, (readData+i));
        if(retval==1){
            return 1;
        }
        retval = at24c256_readOneByte(readAddr+dataLen, &checkData);
        if(retval==1){
            return 1;
        }
        checkData = ~checkData;
        if(readData!=checkData){
            return 2;
        }
    }
   
    return 0;
}

}[/mw_shl_code]
回复

使用道具 举报

11

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-11-20
在线时间
24 小时
 楼主| 发表于 2017-12-28 10:58:44 | 显示全部楼层
读写全部失败,不知道是什么原因
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-28 13:36:28 | 显示全部楼层
楼主,换了芯片,当然要看一下芯片资料吧.除非.
我已经也成过,这些芯片.
24c02与24C256有点区别.不是光是容量上有区别.操作上也有区别.缓冲区大小也有区别.
回复

使用道具 举报

35

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2016-10-12
在线时间
53 小时
发表于 2017-12-28 14:16:04 | 显示全部楼层
读写时序要调整,24C256的地址码是两个字节(或是3个),其它的基本没变
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-28 14:17:51 | 显示全部楼层
又一个写代码不看手册的人,注意操作时序
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-12-28 16:57:12 | 显示全部楼层
你这个读出来0xff,写入也写入0xff,本身初始的时候就是0xff,你这程序写的没啥意义,也就不知道正确性了,你写入其他的数,再读。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-2-24
在线时间
6 小时
发表于 2017-12-29 09:04:39 | 显示全部楼层
u8 at24c256_check(void) {         u8 getData;         u8 ret;                  ret = at24c256_readOneByte(0x7fff, &getData);         if(getData==0x55){                 return 0;         }         else{                 at24c256_writeOneByte(0x7fff, 0x55);                 ret = at24c256_readOneByte(0x7fff, &getData);                 if(getData==0x55){                         return 0;                 }         }         return 1; }
回复

使用道具 举报

0

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
502
金钱
502
注册时间
2016-11-28
在线时间
97 小时
发表于 2017-12-31 10:02:20 | 显示全部楼层
不管你们是怎么折腾的,我反正是256没有读出来,可能是还没有足够深入。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 20:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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