找回密码
 注册
关于网站域名变更的通知
查看: 287|回复: 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(); //发送停止信号   
% ]8 {$ V* A+ w
unsigned char IIC_Read(unsigned char addr)
, C5 v* U/ q$ G, r{
. X5 d$ Z- x' R" P8 C/ `3 D" f        unsigned char data;
" n$ `/ q( o0 M" R    IIC_Start();
( v( i. r2 @( |' h        IIC_Send_Byte(0xa0); //发送写器件地址
1 _1 G: z2 w% M% U        IIC_Send_Byte(addr); //发送要读取的地址
" k! F! H8 r$ o# }# Z0 @    IIC_Start();* y* e+ h( a8 i4 D
        IIC_Send_Byte(0xa1); //发送读器件地址. k' ]$ W7 o' d! J4 }$ U
        data=IIC_Read_Byte(); //读取数据5 f. e- @4 {) l( V
        IIC_Stop();
- A# H+ l3 U# k' A& o        return data;
1 i, K/ s' b7 i7 |/ e$ C+ s}
4 [$ L9 S) _9 M* e
( _) l' k  G% c# t0 E6 R
2 ~/ I3 c: w) E & [& d6 c! u2 i/ f$ A- S9 C8 l6 B
2 N- L, D8 @/ v
/ Z# F& a  r. V: X# Q

该用户从未签到

2#
 楼主| 发表于 2023-1-30 11:13 | 只看该作者
unsigned char IIC_Read_Byte(void)
: C- n6 ~5 L/ A{
2 m) j9 V9 j: H7 I0 @        unsigned char a=0,data=0;0 `* `) d1 ?5 u8 D; J8 w" K
        TRISC4=0;    //设置为输出* b% R( L9 J  }" n) {
        RC4=1;       //输出高电平/ L, i/ W( V3 x+ k
    delay_us();       4 r; t  Z) w# D' @+ ]: Y
        delay_us();      
4 Q1 K6 C0 E& u0 a6 |% _3 l        TRISC4=1;    //设置为输入
* N; {- v3 ^- D7 `, b    delay_us();      
  \7 U% S6 z+ J; ~8 s- s) G2 U: i% `        for(a=0;a<8;a++)//接收8个字节
) z2 O) S2 P5 y* P- }- O9 {        {2 g! f$ Z2 v2 ^7 Y/ B
               - l# [7 E4 S9 `$ m) x: D( y
                delay_us();5 S% n' R6 w0 h( W
                IIC_SCL=1;
- g( k: F* `6 [0 t               delay_us();      
1 `; G  i7 \( T- R* O0 z                data<<=1;; o- q8 H7 A1 u. c
                data|=IIC_SDA;
4 `) j2 W+ o; E( J               delay_us();      
$ P& }% Y0 \( y( \                IIC_SCL=0;
! v( m  c6 W* ?& P8 \; ~8 X/ Y               delay_us();      
) i8 ^' o, f9 H3 j7 ?        }
5 t6 ~) p  J0 S8 a        return data;
) O  K9 K- H- h# i+ X}/ L4 b( Z# m1 L0 `% O( ^( p
7 S# t/ J  ?+ R+ N' k( S
已经设置上拉了,但是读取的时候一直是低电平

该用户从未签到

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

该用户从未签到

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

该用户从未签到

5#
发表于 2023-1-30 14:19 | 只看该作者
几点建议:: R' U, r+ |3 d) N5 u+ Q- N+ r
1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。: s2 @% `+ @+ `; \& c
2、你写的时候为什么只有3句,写入的数据呢?* f3 o$ \% _; ~- c  F
3、写入1次有个5ms的事情,你是否知道?
' I9 x5 p% u+ L' t6 T讲个故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。3 q0 ~$ z" ~( @; V$ @; ?* d3 O
最后重点就是,不要抄别人的,会坑死你自己。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-2 03:11 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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