找回密码
 注册
关于网站域名变更的通知
查看: 515|回复: 7
打印 上一主题 下一主题

关于I2C的读写问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-6-28 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
下面两个程序都是关于I2C的写数据程序,为什么第二个程序就不行呢??2 [) l& I6 a7 c. V2 \
/ e8 t1 _! W1 i, v, f  p

! G) U2 s: V1 O" }1 H第一个程序:void Write_A_Byte(uchar b) //向 24C16 中写一字节数据4 a; G2 V1 w5 w1 \& G% n* b$ ^. s
{
( G$ {+ I+ i2 p8 p) K5 S+ z8 Iuchar i;. Z2 k( F0 R8 H: e2 _6 x
for(i=0;i<8;i++)
) f$ w. j- M9 g5 h5 X+ j{; B5 G2 {3 J% N! W- y
b<<=1;
) t  x' ?( Z1 G# ASDA=CY;) n. _' B* F6 _) A% ~# V
_nop_();1 y) W1 g" o$ T
SCL=1;
  A' W/ i; @7 t' P  l& c- dNOP4();
% ^' m3 d1 T! r5 c; cSCL=0;
$ `5 A6 S; b9 ]. e/ b" S0 G}
. t# {  R# `# K/ q# aRead_ACK();3 x9 O  l  s+ l1 \4 A
}        
$ P) t: s& m8 M
. j8 {+ V& h$ ]* j; }6 H第二个程序:void  Write_A_Byte(uchar dat) //写一个字节! c- H, w  W# \/ _, S+ m( ~7 ]5 N
{
$ t' r* s5 x4 d* W% b9 Q. f  uchar i; ) D. o( z3 Y8 |
  uchar temp;- B) w$ x. p: L+ e
  temp=dat;% w2 J) o: a* a& D% ^3 J( x( E
  SCL=0;   //释放时钟信号  让数据总线变化" x" `1 D1 O; J6 E+ W
  for(i=0;i<8;i++) 1 k& @2 [. D9 m
  {2 }! A4 z  [& i: q: p! G* e' {1 c0 W
    IF(temp&0x80) 9 \( k$ x3 l& P& g$ m/ T
      SDA=1;
/ R  \( ^7 O/ |' A) T2 T+ t; N% M    else # w; W5 D# G2 g4 t, L2 a+ Q+ g
      SDA=0;  2 X% d, t7 v# y
    //SCL=1; ; u2 e7 v8 l% J
    temp<<=1; # x  P4 d+ t3 y- i
        NOP4();2 c' G: g" p4 p
    SCL=1; ' O! u( [% _4 }% B
        NOP4(); ) d* m  y  s) q# I/ |; C. Q
  }  
4 ~# T. s& E) L. {! v# x. M  SDA = 1;. s6 ]7 m3 s8 g1 p1 L! Z% V4 r# Y' j& Z4 S
  NOP4();: j2 o, |3 O. a
}9 U# w8 N1 {, i. I2 J: @$ A  S

5 x3 n. e! m& C9 V

该用户从未签到

2#
发表于 2019-6-28 15:44 | 只看该作者
第二个程序在发送完一位数据后,scl没置0,却置了1,手误吧。

点评

void Write_A_Byte(uchar dat) //写一个字节 { uchar i; uchar temp; temp=dat; SCL=0; //释放时钟信号 让数据总线变化 for(i=0;i  详情 回复 发表于 2019-6-28 16:09

该用户从未签到

3#
 楼主| 发表于 2019-6-28 16:09 | 只看该作者
helendcany 发表于 2019-6-28 15:44: Z, i# |+ @/ f4 K- B) g" G: r
第二个程序在发送完一位数据后,scl没置0,却置了1,手误吧。

: Q$ D! Z+ D  B3 g& o1 t/ Z- Wvoid  Write_A_Byte(uchar dat) //写一个字节7 X% p  @0 ~& {/ @
{
( Y* Y0 b/ X; a  K- Q  uchar i; 8 v2 ~+ z" _) e7 R/ b
  uchar temp;  E  \# a0 N" I, a1 `3 Z
  temp=dat;
# D( S9 k0 P* j* t" p4 M  F" x7 O  SCL=0;   //释放时钟信号  让数据总线变化
0 d8 B3 B% v' q4 {; D  for(i=0;i<8;i++) ' K3 Y$ m- o" u" ]: C( b
  {: w4 f5 z! n4 h
    if(temp&0x80)
: O* j" G0 c- ]3 ~# G      SDA=1;
" Y; k& V" B) [9 ?$ S) b$ K# b+ t    else
! A+ X& N" X( e- N5 T4 A      SDA=0;  8 s5 a% q1 H" }4 h$ K
    SCL=1; 6 c$ B, Z, c+ a& V( w$ D) w
    temp<<=1; % v( C  s9 h6 c  i' G
        NOP4();
/ m0 \, L& t6 \$ k, i5 ^! {5 X    SCL=0;
  c/ \0 B, |; S        NOP4();
# d" ]. W) Q% I" ~. A9 F1 l/ }  }  
; k+ p' a8 _: W. J}
$ f. f) G. s% ]7 x3 h是这样的,但是还是不行啊…………
% W5 g9 W: A+ k6 S

点评

if(temp&0x80) SDA=1; else SDA=0; 在这加一个NOP4();试试 SCL=1; temp  详情 回复 发表于 2019-6-28 16:13

该用户从未签到

4#
发表于 2019-6-28 16:13 | 只看该作者
yigeqdaizouni 发表于 2019-6-28 16:09
- U0 E8 a- Z. bvoid  Write_A_Byte(uchar dat) //写一个字节1 n3 m  k  c# X) g  L! _
{
' x4 i+ v0 \! {: ?  uchar i;

6 v2 M0 v6 ]  Q6 n' j/ u+ h9 Xif(temp&0x80)
+ H( O( U) R: P, g% j# V" U1 Y9 X$ \      SDA=1; + J: C1 B6 ?3 L. ~
    else
( e) a7 K4 R! |& |4 x! f/ o      SDA=0;  
' z. s& o: ^; q1 s在这加一个NOP4();试试& J9 K) f& S6 O  M3 Y
    SCL=1; % V/ c5 a1 I( K5 }9 }7 a- o
    temp<<=1;
. C" z' F/ u# q- |) e        NOP4();, m. k4 U9 K" y: Z8 D
    SCL=0;
2 v8 q. y' N  h1 v9 |3 r  |- L        NOP4();
5 q" \! u  W" L( _+ g- X: J/ F4 U1 b另外你如何判断写入是否成功呢% l+ o0 p  {7 W7 K7 A3 T3 i' |

点评

还是不行,我是用24c04在仿真软件上仿真的  详情 回复 发表于 2019-6-28 16:17

该用户从未签到

5#
 楼主| 发表于 2019-6-28 16:17 | 只看该作者
helendcany 发表于 2019-6-28 16:13. W* a  `% f0 v. g
if(temp&0x80) + ?# X6 z$ C+ Y! A  K
      SDA=1; 6 c2 l/ c8 n3 w% z9 _: L- p# b
    else

' D( o5 X8 Y; s2 A还是不行,我是用24c04在仿真软件上仿真的# q6 O, }3 a% V& [8 N8 @/ J9 L% }/ }! s

点评

用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Read_ACK();吗,加了的话,应该和第一段程序没什么区别了  详情 回复 发表于 2019-6-28 16:23

该用户从未签到

6#
发表于 2019-6-28 16:23 | 只看该作者
yigeqdaizouni 发表于 2019-6-28 16:17
* r' b3 j! a8 F& s6 d' Q还是不行,我是用24c04在仿真软件上仿真的
2 e1 ~+ U) o9 u$ M' s  e
用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Read_ACK();吗,加了的话,应该和第一段程序没什么区别了
9 T) W9 ^5 A- [5 v. X

点评

嗯嗯,谢谢指导,找到问题了,是没有加Read_ACK();谢谢。  详情 回复 发表于 2019-6-28 16:44

该用户从未签到

7#
 楼主| 发表于 2019-6-28 16:44 | 只看该作者
helendcany 发表于 2019-6-28 16:23
2 u3 J% o& k4 p( b用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Re ...
* {$ p+ P6 d1 h& h5 ]
嗯嗯,谢谢指导,找到问题了,是没有加Read_ACK();谢谢。
& D0 ^, L2 S1 h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-17 23:36 , Processed in 0.156250 second(s), 31 queries , Gzip On.

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

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

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