找回密码
 注册
关于网站域名变更的通知
查看: 283|回复: 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(); //发送停止信号   
: S8 h- i# \( L* q
unsigned char IIC_Read(unsigned char addr)
! M" k% J& D. o" p+ O' q  t  p2 ?{- T% B# E& R% W: k4 S4 \& b* m, H: y* ~0 m
        unsigned char data;" u: I- f1 u* _6 Q, F6 z7 T; c; ^
    IIC_Start();- Y' q( x2 ~. p$ [8 e, e
        IIC_Send_Byte(0xa0); //发送写器件地址, w" d$ b& O5 \0 ^. e; v& U( W6 q
        IIC_Send_Byte(addr); //发送要读取的地址- r0 g  J  E! H  r8 E( p+ ^
    IIC_Start();
: o# o; R# u& I, R2 f3 T        IIC_Send_Byte(0xa1); //发送读器件地址9 W1 e* x/ B& P% ^  k% N/ Y* X
        data=IIC_Read_Byte(); //读取数据
1 \5 e' z! H$ p* u! u- m1 i9 d1 g        IIC_Stop();( K0 B3 Y3 i+ b- H+ ^# t; L/ I- m
        return data; 0 V1 N" W' O: L
}4 `" {' M/ w) }8 O9 O

5 a8 j  A6 ^& y; x! C$ q- i  W
# F, z4 X/ _" C6 j1 l  s , h7 A% C) Y/ Y% Q
, L2 _5 O/ a, D5 w: A9 [& X
) ~$ \4 p$ l  g; ~

该用户从未签到

2#
 楼主| 发表于 2023-1-30 11:13 | 只看该作者
unsigned char IIC_Read_Byte(void)9 h7 S1 T9 E' G) l; g
{
' t* F% h0 |( O% N        unsigned char a=0,data=0;
( c5 G7 g* m% Q* W6 Y        TRISC4=0;    //设置为输出
& G" ?( K0 M. R( B' M4 j) c        RC4=1;       //输出高电平
: G% w' Q& O' W2 b    delay_us();       ; N+ `) ]9 c8 S
        delay_us();      
# v2 G' X" y/ v6 v6 g        TRISC4=1;    //设置为输入
% Q- X+ ]1 H. b, Z" ?( w    delay_us();      
8 {8 G7 J* @( s- |& E$ Y( O        for(a=0;a<8;a++)//接收8个字节
, I# @2 @2 I. i4 k! R; r3 u        {
( A2 k9 W1 @7 D% M/ g: j               
6 W: v1 A4 X: N; m                delay_us();
( h) w% U; t2 p                IIC_SCL=1;
% J( \6 @7 K7 M5 G8 U               delay_us();      
2 C/ P% [+ {0 }; {7 U                data<<=1;
" o5 C+ |. x! U  M9 D                data|=IIC_SDA;
- U% o$ ~1 e4 x  N               delay_us();       ' M) F/ F$ H+ E% G; @
                IIC_SCL=0;; [2 W. u1 L' Y6 L4 A
               delay_us();       % h6 Y$ ^. ~$ n# Y' l4 _3 }
        }
/ g9 T3 x1 p5 v- W, G$ i6 e        return data;6 k9 m- X% F% w, r
}
, K& j4 h+ j; @+ L2 D; R! @1 a& F% A9 i/ ?
已经设置上拉了,但是读取的时候一直是低电平

该用户从未签到

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

该用户从未签到

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

该用户从未签到

5#
发表于 2023-1-30 14:19 | 只看该作者
几点建议:
; b/ _% _8 W# x8 _& j, C1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。& t4 ~3 L1 n5 ~# K+ |( {
2、你写的时候为什么只有3句,写入的数据呢?
+ b+ p3 ?* i( Y" I8 Y  j3、写入1次有个5ms的事情,你是否知道?
# f  \' t& C$ n2 A2 P  t; J7 }9 l' \讲个故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。
, w- [' r6 h/ c7 u& U( l- O* l: B' p1 ~最后重点就是,不要抄别人的,会坑死你自己。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-17 07:29 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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