找回密码
 注册
关于网站域名变更的通知
查看: 273|回复: 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(); //发送停止信号   
; c5 v5 L% f$ s7 l, ^
unsigned char IIC_Read(unsigned char addr)* C8 J8 l1 R( A  a0 e4 C
{
. [" N* e1 l0 w3 t! S5 G        unsigned char data;7 g( |) |( N# @; S2 G% A- q' H" t' b% U
    IIC_Start();
* `2 f0 }  D: b8 B9 Y5 O$ ^8 m        IIC_Send_Byte(0xa0); //发送写器件地址
9 d0 t- e% ?5 F5 _1 N+ @. ~        IIC_Send_Byte(addr); //发送要读取的地址* z3 b% D, A/ O
    IIC_Start();
5 ]( F+ ~4 l  B7 J' Y        IIC_Send_Byte(0xa1); //发送读器件地址
, b* N% o5 I! {# a% `        data=IIC_Read_Byte(); //读取数据1 A6 i- U5 ~4 M/ l& @0 \7 G: \- k5 j
        IIC_Stop();
* ]7 `8 X# K' C& b' u        return data; 1 p( s$ Z! D. U, u
}% x& n, h7 H0 k; G$ e

' O" \" h0 M7 [  g  U4 D' r% W & ~3 c. d/ U# F# ^; r. \
0 s2 H* u& v/ A5 d0 q

/ X: D+ w9 Y! x; f
1 ?$ T; W8 x# x1 W5 R+ F; f

该用户从未签到

2#
 楼主| 发表于 2023-1-30 11:13 | 只看该作者
unsigned char IIC_Read_Byte(void)
9 x# i  a6 R; m8 }{- U! S" q1 B) x& q/ H  D0 F* n7 P
        unsigned char a=0,data=0;, E4 k2 n$ ~! Z# q( r, m4 q, x
        TRISC4=0;    //设置为输出# P$ ^( Y" k! t( e2 U
        RC4=1;       //输出高电平
& j; D+ ~* V) N# U5 y: h    delay_us();       % ~8 |7 U% l8 r
        delay_us();      
* B/ D. p% }: E/ J: y7 l        TRISC4=1;    //设置为输入; h6 L- Q" Z) D5 ]
    delay_us();       3 v8 C$ ^# S0 ?! C  }; T) Q
        for(a=0;a<8;a++)//接收8个字节+ O4 u6 [. o" M% H, S
        {
8 J5 X/ G5 C4 z% Y4 b               
6 R( k# P& t/ u. R9 Q: v3 E                delay_us();
1 N; z  O5 _# e' `5 }( a                IIC_SCL=1;! W# X" h& @7 F( Q  u$ ?
               delay_us();       8 z; \; N3 |6 C, d. x4 Y, v" h
                data<<=1;7 @% _" {, j! L0 b( M
                data|=IIC_SDA;# C4 U- X! w& Z
               delay_us();      
& K5 u; i+ k& p                IIC_SCL=0;% j1 Z3 g5 h* [; _4 v5 _
               delay_us();      
% q/ m: \4 E6 i* ]$ h        }; T# j5 N0 e) p. ]: k- {& T
        return data;
+ o. }- R- S; `: ]3 U4 z4 d0 e}
; J6 {/ D1 s5 H. O/ Z* O% v6 L8 J5 y1 X' U
已经设置上拉了,但是读取的时候一直是低电平

该用户从未签到

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

该用户从未签到

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

该用户从未签到

5#
发表于 2023-1-30 14:19 | 只看该作者
几点建议:
7 B% [% h4 O- @/ J( S1、严格按照时序写。软实现是最好调整时序的,但细心一点。看你的时序就比较乱。. o4 f) W  a( S# X7 E! B# p
2、你写的时候为什么只有3句,写入的数据呢?$ T0 [" {$ X- |4 V$ f! d
3、写入1次有个5ms的事情,你是否知道?
4 m! x% E% u4 Y# ^3 Z) @$ q" ^讲个故事:时序写不好,只有最高位读取出错,并且是第二字节,当为01xxxxxx时,会读成11xxxxxx,所以自己一点点看时序,从软件,从示波器,明确知道自己什么时候拉低的,什么时候拉高的,宽度是否符合芯片电气特性。
# X8 E5 ]( F8 Q1 L. A1 L最后重点就是,不要抄别人的,会坑死你自己。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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