找回密码
 注册
关于网站域名变更的通知
查看: 285|回复: 4
打印 上一主题 下一主题

模拟I2C读写24c02,可以写,但读出错

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-1-30 10:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
void IIC_write(u8 addr,u8 data)
    IIC_Start();
    IIC_Send_Byte(addr); //发送写命令
    IIC_Stop(); //发送停止信号   
0 D1 p: _/ ?+ t: K) R3 _  D; s
unsigned char IIC_Read(unsigned char addr)
6 v8 D. p' V, R5 b' o  k0 @8 C{& X7 w" o+ v; E( |
        unsigned char data;: p- u  y0 l2 U7 |; S! }0 _
    IIC_Start();: e3 w5 R+ ?$ ?: S' [8 P
        IIC_Send_Byte(0xa0); //发送写器件地址" f+ U. T' [1 [% I4 M8 i
        IIC_Send_Byte(addr); //发送要读取的地址( Y+ V, P) U, F+ X& a: J1 u$ o
    IIC_Start();( `8 t; @' v/ h8 D1 _9 i4 r* ?
        IIC_Send_Byte(0xa1); //发送读器件地址% u" K$ M8 \. X6 L9 e- |
        data=IIC_Read_Byte(); //读取数据
5 a% L( y: \! f" T8 i  C/ a        IIC_Stop();
# `3 G1 s4 B- f7 L        return data;
* _8 w; S8 j! S}- |; p% H- ]% B9 q; f
( M* Q* K; ^( d0 V

4 t% s' X1 N( U" t! F) k( O4 o1 G : P1 P* R  j( t
: F- n, r. m. w  ]

# k8 J9 E' D1 X

该用户从未签到

2#
 楼主| 发表于 2023-1-30 11:13 | 只看该作者
unsigned char IIC_Read_Byte(void)/ }. o- ~* c: d; l6 a( f7 K
{
% E8 e; d- J+ t4 v2 m        unsigned char a=0,data=0;! `5 S) o( o9 j! p1 \4 D& ^# p& l/ b
        TRISC4=0;    //设置为输出( @1 ~2 G% R* _6 q7 \, F8 G
        RC4=1;       //输出高电平9 L3 f8 {6 |& M+ C' L# G2 u5 C8 J: b
    delay_us();      
0 I$ x# V* S; c1 _        delay_us();      
5 f8 A3 n- L0 S, M( Z5 X: G        TRISC4=1;    //设置为输入/ M7 i2 B) j; r5 L2 W. j+ Q- S
    delay_us();       7 Z- n* v1 P! q
        for(a=0;a<8;a++)//接收8个字节6 I; {( P$ @5 a5 T( ^! U
        {
, q9 _3 I! ]9 T/ \7 O4 v               + f/ X- t0 l, @( `6 I' c  I
                delay_us();$ ]5 W: Q8 z8 V5 t) l
                IIC_SCL=1;
3 m+ @# X: M# U+ `: o               delay_us();      
* Y7 q4 `9 l9 K  i                data<<=1;4 [# X. N1 N) O# Z0 E
                data|=IIC_SDA;4 R/ i: j5 j/ a$ x2 X
               delay_us();       - I' Y/ J! c+ w, g! w; b
                IIC_SCL=0;) q0 L# V& D, c: [* K
               delay_us();      
. \+ Q  M8 k. H, ^8 `7 x0 V        }" f/ N3 L! l+ ^1 f! T( ~3 U
        return data;
* t  k* O. O. N}7 \4 {4 y9 F6 G

7 B/ G! `8 q; ^1 m4 ?已经设置上拉了,但是读取的时候一直是低电平

该用户从未签到

3#
发表于 2023-1-30 11:28 | 只看该作者
你都不管ACK的么,然后读的时候,第一次也也要STOP吧

该用户从未签到

4#
发表于 2023-1-30 14:03 | 只看该作者
时序要求太严格,干扰场合读出数据容易出错。

该用户从未签到

5#
发表于 2023-1-30 14:19 | 只看该作者
几点建议:. B5 ~+ c. {. n. F+ b) G
1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。
" u. q$ k" N1 J2、你写的时候为什么只有3句,写入的数据呢?7 U4 |* k! O* o7 e
3、写入1次有个5ms的事情,你是否知道?' T* r) L6 i9 S% F/ b5 ^+ g  v  o
讲个故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。) Y$ s5 I4 v/ j2 T
最后重点就是,不要抄别人的,会坑死你自己。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-29 18:04 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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