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

关于I2C的读写问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面两个程序都是关于I2C的写数据程序,为什么第二个程序就不行呢??" {* e- M; j0 G5 {. h

" H( _8 {, K  k$ w7 h5 @7 X" f( S1 F- B5 G2 H7 G
第一个程序:void Write_A_Byte(uchar b) //向 24C16 中写一字节数据9 E6 O- a% X3 O3 W* s
{4 S; o! q; n* Z* d9 o% w/ k/ B
uchar i;) [' ~" \3 Y8 ~
for(i=0;i<8;i++)3 }8 f8 i0 @0 Z4 o% q
{
) M; R! t$ C2 {5 \$ F0 Q" sb<<=1;8 Y$ Y' F0 F' _* Y* p$ J4 z% ~
SDA=CY;+ q$ G: A5 w( Z+ P" @1 l6 u
_nop_();
# J4 ]4 L+ |- [; h. D% F8 \4 s0 _SCL=1;0 s5 i* F' U, j* N
NOP4();+ G/ p0 k( h8 F0 b# X6 C
SCL=0;( @  e2 D# n$ s7 o/ T" _5 Q9 A" N; r
}
% s* z. _+ d) q$ I. z0 K4 K3 iRead_ACK();
1 L& _) C9 y4 ^* a; g! [& m}        
# d4 b) F$ N8 F4 m9 p$ P! w) Y3 o3 A+ B
第二个程序:void  Write_A_Byte(uchar dat) //写一个字节
! t5 P* L5 h: \! y6 Z* V! {{
  y) J" H+ [8 j' ~' i  uchar i;
& Z, S- z5 Q( l3 d- ^# W  uchar temp;
6 I# r) z8 w  v' ]* `0 o7 n  temp=dat;0 a* M& f" l# W+ D
  SCL=0;   //释放时钟信号  让数据总线变化
2 C; M0 t; T: G5 t1 D8 H& t9 g9 ~  for(i=0;i<8;i++)
+ i9 r) N; p$ j  {
. A% J1 a8 f( Y/ m" U7 q    IF(temp&0x80) 9 d# r" Q8 Z! T  e3 M. `: r9 L2 g: G
      SDA=1;
  E6 q, W) A# ^4 N' @& s    else % X, c8 _! U/ t" w4 v! P% z
      SDA=0;  4 V" M4 T, @& Q- q0 C
    //SCL=1; 3 S6 p, }; c, a3 [+ w; \
    temp<<=1;
, V/ ?  r* I% ]9 K# y1 {        NOP4();
, D9 {: n5 p0 S: r    SCL=1;
, d, z' y7 D" D6 }9 d7 E: q        NOP4();
' }8 P/ ]. {/ H4 g' {& Z  }  7 ?* l- |$ b: q2 A* X" F& x5 ]0 D
  SDA = 1;
4 @" x1 K2 y0 e  B' z  NOP4();1 p7 e! k" d$ T/ G# ]" D* q
}3 l7 S% J! |: I# g/ P

4 x6 e" j. h# D/ x7 A

该用户从未签到

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
7 o' `0 w) Z, G2 l, b0 e+ W7 n第二个程序在发送完一位数据后,scl没置0,却置了1,手误吧。

7 e; ]$ R* _- ~$ [4 zvoid  Write_A_Byte(uchar dat) //写一个字节: m6 f  e7 l! Y: R
{
. X; x* G% H# m% h3 J7 W  uchar i;
7 ^; P2 |% W% D9 x1 y  uchar temp;$ v/ z- Y0 A+ P6 i
  temp=dat;
7 I' m7 ]! C* b( ?3 B; J  SCL=0;   //释放时钟信号  让数据总线变化& I$ b+ Q2 a% D; v9 U1 Q& d$ Y7 t
  for(i=0;i<8;i++) 8 W- q- {3 F( o( b( Q
  {
7 q2 ?/ N+ f# N' s    if(temp&0x80)
$ z" c2 O9 {/ Y8 S+ J( a* y( O, ?) b      SDA=1;
# K/ d0 Z0 N" I% ?; ~! o' F    else
  x6 a# T' l2 ]( J3 k2 e      SDA=0;  $ R. t4 K$ R  f/ z
    SCL=1; / }+ `6 P9 X' C* u, r; |; m
    temp<<=1; : K2 x# D& ?7 F) ^0 ~$ F1 A/ L
        NOP4();+ i$ J8 P1 S$ E% F: w
    SCL=0;
" ^, z( t4 J  @7 f. f        NOP4(); % S0 B: A. W( s) w* U2 T
  }  
2 K# }7 G/ E; t+ G# d6 Y0 u}" t4 H, B& g& c% _+ }
是这样的,但是还是不行啊…………! A' Q; [4 c7 O9 v

该用户从未签到

4#
发表于 2019-6-28 16:13 | 只看该作者
yigeqdaizouni 发表于 2019-6-28 16:09. T( @, U. N8 `3 q8 n- a8 [' J
void  Write_A_Byte(uchar dat) //写一个字节
) E6 b3 [% O$ `. R{
9 n& `* I0 e, E2 N' e/ _/ s  uchar i;
7 R4 ^; Q1 Y" p6 B/ O+ @$ Z
if(temp&0x80)
6 _' `4 H7 [2 B- o+ n/ x      SDA=1; 8 L! e! Q4 x) s7 A6 K9 d( O: I
    else ' Y" S% ~* `1 `
      SDA=0;  
0 W, N; ~8 d8 C在这加一个NOP4();试试
4 q. X* o% l# X# P7 g* L  M    SCL=1;
+ }5 z6 q3 }! R% {  _2 V    temp<<=1;
) q4 ~% L; w6 f6 F2 V        NOP4();
5 i' A8 c, C, g+ g- j' \    SCL=0;
' T; m2 J) p/ o2 U" X        NOP4(); 7 `( U9 N) [+ j6 v6 W
另外你如何判断写入是否成功呢
% u8 N: y  E% w- @* s9 q

点评

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

该用户从未签到

5#
 楼主| 发表于 2019-6-28 16:17 | 只看该作者
helendcany 发表于 2019-6-28 16:13' ~( v5 z1 }7 |! U& ^" }% z
if(temp&0x80)
3 ^3 S2 N6 F* r/ `9 f+ Q      SDA=1;
& A2 O- K/ N$ L% `0 n6 T    else

( u' U& n* c# h( K; G! T3 m还是不行,我是用24c04在仿真软件上仿真的+ g4 P% W3 _+ E/ a: G

该用户从未签到

6#
发表于 2019-6-28 16:23 | 只看该作者
yigeqdaizouni 发表于 2019-6-28 16:175 J- ]9 {  o# ]" d* H# l
还是不行,我是用24c04在仿真软件上仿真的
. V7 D3 i, k: I6 P. J% B7 A1 J! y
用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Read_ACK();吗,加了的话,应该和第一段程序没什么区别了
  y" ]+ k+ {' v7 u9 d6 h# l

点评

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

该用户从未签到

7#
 楼主| 发表于 2019-6-28 16:44 | 只看该作者
helendcany 发表于 2019-6-28 16:23, l+ ]3 s! a+ d
用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Re ...
4 c/ b/ y* ]+ K* Y% l$ h: N
嗯嗯,谢谢指导,找到问题了,是没有加Read_ACK();谢谢。) B9 y: d9 z7 t  ]; G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-23 12:21 , Processed in 0.078125 second(s), 29 queries , Gzip On.

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

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

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