找回密码
 注册
关于网站域名变更的通知
查看: 300|回复: 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(); //发送停止信号   

* N! J, g- ?  G0 xunsigned char IIC_Read(unsigned char addr)" }. Q* g. p2 S- `' a: y
{
1 o8 i* `( x3 b# P+ B" ~        unsigned char data;0 E" E% C3 G- N/ ?( g8 X
    IIC_Start();
8 ~. s! c8 D3 w, `* g0 Q" v        IIC_Send_Byte(0xa0); //发送写器件地址
7 M0 Q/ B7 [$ \        IIC_Send_Byte(addr); //发送要读取的地址
' M1 t: ]0 r0 i/ u* `% H* v    IIC_Start();1 D; O1 z+ j. u+ W' ]3 P8 ?. E( W
        IIC_Send_Byte(0xa1); //发送读器件地址
$ P1 K6 T! W4 ?: u        data=IIC_Read_Byte(); //读取数据/ g# Y& M6 X8 i4 }' u
        IIC_Stop();
5 N# t3 m1 h! t0 Z6 M! i        return data;
3 S% s' b8 v- V0 c}
* A, R3 F! R1 @
0 G$ M& }1 H: i+ Y" y
& w' B; a9 }1 r
5 x* `& |" r, W+ n, G% _6 ]
) E# c7 B3 W  W2 L  X- A$ D
  Z9 i% s0 i1 l' @, }& [

该用户从未签到

2#
 楼主| 发表于 2023-1-30 11:13 | 只看该作者
unsigned char IIC_Read_Byte(void)
: _4 i+ F* ~5 F$ ]) x2 m& T{
8 E! u) J- ^' F6 N+ R  x3 |& P& V        unsigned char a=0,data=0;
; Z; `) X; M: X# T) J1 L        TRISC4=0;    //设置为输出
* ^$ S8 v  O* y" l. p9 g        RC4=1;       //输出高电平
- R* O' j, ]  b9 T    delay_us();       2 d+ C2 G. l$ {3 J
        delay_us();       / L, u2 R% `( a9 ^; j+ b$ F9 @
        TRISC4=1;    //设置为输入
' _2 e& }& C1 x( h2 m8 E9 r+ j    delay_us();       9 n3 h1 k# a( @- y
        for(a=0;a<8;a++)//接收8个字节
0 [# w% w. v& t/ Y        {" y! }3 x$ J) k6 p; I5 B# |2 f
               
9 C$ F: J' N3 n2 @                delay_us();  o: c6 Y2 @" E$ a- _( W( H
                IIC_SCL=1;, q7 }0 y; O$ P2 ^
               delay_us();         D# I2 m" ]; v( k/ }5 Z- l
                data<<=1;
+ k; G! i7 b4 a/ i( H5 v' o! F$ i; a                data|=IIC_SDA;  I1 ]+ D' J' }7 \5 E0 }% u) P+ U9 C  `5 P
               delay_us();       0 z" _" ~! t8 W5 u: h& j& m  Y! {
                IIC_SCL=0;
" i. m, l4 ~4 [% g- w               delay_us();      
8 G9 E7 y- B' T, Z8 b1 A        }
& Y( {) L/ D' Z, J/ {2 h, T& \9 Q        return data;( B/ _/ |( n8 f* b
}
+ k# t+ |- Z* q* s, B4 y7 u
$ {0 f& u0 d: q. N, u- v已经设置上拉了,但是读取的时候一直是低电平

该用户从未签到

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

该用户从未签到

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

该用户从未签到

5#
发表于 2023-1-30 14:19 | 只看该作者
几点建议:% M2 u3 d( V: ?6 V6 S1 w9 h' x. V
1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。: f1 S7 \/ y" D, H  q! q! o: [$ X
2、你写的时候为什么只有3句,写入的数据呢?
- i: G5 f) m! N3、写入1次有个5ms的事情,你是否知道?
& a1 W! l# D5 A1 H1 O讲个故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。0 W7 Y, F. r! x9 P/ T
最后重点就是,不要抄别人的,会坑死你自己。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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