找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1297|回复: 11
打印 上一主题 下一主题
收起左侧

单片机+AT24C02能读取不能写入?附程序

[复制链接]
跳转到指定楼层
楼主
代码如下
#include<i2.h>

void Delay10us()                //@11.0592MHz
{
        unsigned char i;

        i=2;
        while (--i);
}

void I2cStart()//I2c开始信号
{
        SCL=1;//SCL在高电平时SDA从高电平转为低电平就是开始信号
        Delay10us();
        SDA=1;
        Delay10us();//保持状态时间要大于4.7us以便读取
        SDA=0;
        Delay10us();//保持状态时间要大于4us以便读取
        SCL=0;//结束后恢复初始状态
        Delay10us();
}

void I2cStop()//I2c结束信号
{
        SCL=1;//SCL在高电平时SDA从低电平转为高电平就是结束信号
        Delay10us();
        SDA=0;
        Delay10us();//保持状态时间要大于4.7us以便读取
        SDA=1;
        Delay10us();//保持状态时间要大于4us以便读取
        SCL=0;//结束后恢复初始状态
        Delay10us();
}
u8 I2cSendBaty(u8 dat)//发送一个字节的数据
{
        
        //SCL在高电平时读取SDA数据在低电平时允许改变SDA数据改变
        u8 i,j=0,k=0;
        SCL=0;
        for(i=0;i<8;i++)
        {
                j=dat>>(7-i);
                SDA=j%2;
                Delay10us();
                SCL=1;//开始读取数据
                Delay10us();
                SCL=0;
        }
        SDA=1;//开始检测从机是否接收完成
        Delay10us();
        SCL=1;
        while(SDA)//判断SDA状态(低电平时说明接收完成)
        {
                k++;
                if(k>200)//超时判断
                {
                        SDA=0;
                        Delay10us();
                        return 0;//返回接收失败
                }
        }
        SCL=0;
        Delay10us();
        return 1;//返回接收完成
}

u8 I2cReadBaty()//读取一个字节的数据
{
        u8 i,dat=0;
        SDA=1;
        Delay10us();
        for(i=0;i<8;i++)
        {
                SCL=1;
                Delay10us();
                dat<<=1;
                dat|=SDA;
                Delay10us();
                SCL=0;
                Delay10us();
        }
        return dat;
}

void At24c02Write(u8 Chip_addr,u8 M_addr,u8 dat)//IC芯片写入数据
{
        I2cStart();//数据写入开始
        I2cSendBaty(Chip_addr);//发送储存芯片地址
        I2cSendBaty(M_addr);//发送储存芯片储存地址
        I2cSendBaty(dat);//发送储存数据
        I2cStop();//I2c结束信号
}

u8 At24c02Read(u8 Chip_addr,u8 M_addr,u8 dat)//IC芯片读取数据
{
        u8 ret=0;
        I2cStart();//数据写入开始
        I2cSendBaty(Chip_addr);//发送储存芯片地址
        I2cSendBaty(M_addr);//发送储存芯片储存地址
        I2cStart();//数据写入开始
        I2cSendBaty(Chip_addr+1);//发送储存芯片地址
        ret= I2cReadBaty();//读取一个字节的数据
        I2cStop();//I2c结束信号
        return ret;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:399179 发表于 2023-4-19 20:10 来自手机 | 只看该作者
24C02有个写保护引脚
回复

使用道具 举报

板凳
ID:123289 发表于 2023-4-20 15:08 | 只看该作者
再仔细阅读芯片的手册。
回复

使用道具 举报

地板
ID:807182 发表于 2023-4-21 19:39 | 只看该作者
引脚没有拉高

1.png (63.02 KB, 下载次数: 45)

1.png
回复

使用道具 举报

5#
ID:1073275 发表于 2023-4-21 21:56 来自手机 | 只看该作者
引脚拉高
回复

使用道具 举报

6#
ID:984048 发表于 2023-4-21 23:35 | 只看该作者
要把引脚拉高
回复

使用道具 举报

7#
ID:727796 发表于 2023-4-23 21:13 | 只看该作者

能正常读取数据就是不能写入,这个有问题的话不是也不能读取吗
回复

使用道具 举报

8#
ID:807182 发表于 2023-4-25 14:11 | 只看该作者
chenl_l_ 发表于 2023-4-23 21:13
能正常读取数据就是不能写入,这个有问题的话不是也不能读取吗

可能是这个原因啊,因为我看你在写进去的时候并没有对SDA引脚配置为输出模式
回复

使用道具 举报

9#
ID:807182 发表于 2023-4-25 14:12 | 只看该作者
发送和接收数据时是需要通过改变SDA引脚的输入输出模式的
回复

使用道具 举报

10#
ID:727796 发表于 2023-4-26 18:47 | 只看该作者
暖西夏 发表于 2023-4-25 14:12
发送和接收数据时是需要通过改变SDA引脚的输入输出模式的

不是地址最后以为来控制读写模式吗
回复

使用道具 举报

11#
ID:727796 发表于 2023-4-26 21:53 | 只看该作者
暖西夏 发表于 2023-4-25 14:12
发送和接收数据时是需要通过改变SDA引脚的输入输出模式的

知道咋回事儿了,发送写入24C02数据后从机不会拉低SDA的电平,使SDA处于高电平[img][/img]
回复

使用道具 举报

12#
ID:727796 发表于 2023-4-26 21:56 | 只看该作者

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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