找回密码
 注册
查看: 268|回复: 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(); //发送停止信号   
- l1 `; ~$ b/ p* ]
unsigned char IIC_Read(unsigned char addr)+ x" b6 N) A$ A9 T4 v
{
2 {, P+ W% B) X. L6 x9 W1 h% C* F6 ]        unsigned char data;
* q2 Z& C1 q  U! u5 ^    IIC_Start();! n% Y/ W* C) K7 O! a: q% |
        IIC_Send_Byte(0xa0); //发送写器件地址, W0 b8 Q  z# Z% x" Z/ V" y" y
        IIC_Send_Byte(addr); //发送要读取的地址
( Z; j  a8 m& t; p/ u' f    IIC_Start();1 Z/ i$ t, ~( M" t- J
        IIC_Send_Byte(0xa1); //发送读器件地址; J8 m% p' Z+ \: E4 h- q! Z6 e
        data=IIC_Read_Byte(); //读取数据
7 G$ [* x0 d# _; P4 c% ~        IIC_Stop();! o; G8 q& E0 `7 P' l
        return data; # \$ R0 Q* r+ f& ?8 ]1 S. g2 R3 k  O0 e
}
' W( e6 m" r4 U! I9 R2 c2 z1 u 1 [5 l+ e1 p# @5 `0 I# _" r

+ ~9 r. l! P8 D/ l   n5 X: e) e4 O

2 D8 M2 n7 b8 h+ k& R5 Y
2 o# k1 b2 c. A+ M

该用户从未签到

2#
 楼主| 发表于 2023-1-30 11:13 | 只看该作者
unsigned char IIC_Read_Byte(void)  E9 ]2 k& q: [4 u6 Y: v
{
- s6 U- w$ [! |' E& V) M7 R        unsigned char a=0,data=0;
6 E, p% ?6 g6 b7 x        TRISC4=0;    //设置为输出
0 M1 A' h; Q9 h7 F& K, d& J* R        RC4=1;       //输出高电平5 r1 o7 C  w3 @" q1 k
    delay_us();      
' v8 Z. d9 y( i        delay_us();      
! n1 Z9 @. @+ X5 s        TRISC4=1;    //设置为输入
$ L3 b' s: Z1 e; m" ^    delay_us();      
* m6 _' @" m4 k8 R* I        for(a=0;a<8;a++)//接收8个字节
* Y( }: P4 V" y1 q# T        {
8 E3 O  e% W3 g               
+ i: P& N. ^8 X" ~0 F/ B                delay_us();
6 Q9 `2 e4 f: U' I3 c% l0 r                IIC_SCL=1;
/ p9 [, ~) V. A; ~6 e7 H4 M" u2 F               delay_us();       9 z( e- X% F7 o+ w6 g# h7 T0 G0 L- [- [
                data<<=1;! v' s1 F9 B, I+ b1 i- u
                data|=IIC_SDA;7 R! y" ^# Q; C$ a0 `' ^
               delay_us();       / {/ j- n" v+ \) x) ^  {
                IIC_SCL=0;
9 R! ~% q' F) U$ Q/ L: s; K) \               delay_us();       ! z& z) Y4 ~. Q# {0 e+ I
        }
4 K4 y+ q; c, \  v# }        return data;  b5 K4 x8 M) @1 L* I; F
}
% F, K2 S9 \3 }2 `9 I# r3 Y7 }9 w8 F3 _* L% W
已经设置上拉了,但是读取的时候一直是低电平

该用户从未签到

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

该用户从未签到

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

该用户从未签到

5#
发表于 2023-1-30 14:19 | 只看该作者
几点建议:
& K# d) C* p+ q4 a1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。$ [) S& E; Q6 b& B" {
2、你写的时候为什么只有3句,写入的数据呢?! E  g# R7 _2 N9 Q0 `
3、写入1次有个5ms的事情,你是否知道?
. N9 _  C$ R2 v$ z讲个故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。
4 C- I. [: @- `/ V: ^最后重点就是,不要抄别人的,会坑死你自己。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-5-26 07:23 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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