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

关于I2C的读写问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面两个程序都是关于I2C的写数据程序,为什么第二个程序就不行呢??9 Y3 Z$ [8 c7 V& n/ \

2 x9 m5 g6 X7 o$ V- R& P/ H5 y1 p  O3 ]7 Y4 \+ L6 V7 _
第一个程序:void Write_A_Byte(uchar b) //向 24C16 中写一字节数据
. m7 R! w( X% A$ f  t  q# Y{
" Q4 ?# P+ I& ~6 f. puchar i;; w5 V2 ^: H: O  |6 Y6 e- e. @& h
for(i=0;i<8;i++)
$ E/ W0 ]) S3 O! l0 f! S0 o{6 g! N7 G! P) h
b<<=1;
& K$ v5 F9 r# G( _7 V1 iSDA=CY;$ {" ~; o: f9 U0 G/ x3 I
_nop_();
% Q( }- z8 N% q% l, A# mSCL=1;+ W) v! @6 ?$ j; X  u4 X) E0 m
NOP4();
  l) u& J0 v# Y7 }SCL=0;! E8 M! G$ a9 j2 M  `2 H& {0 T. `. {
}
9 z0 B7 E- X/ I& O) hRead_ACK();1 n5 O1 f- Q9 r/ D
}         $ b% D6 w7 q, b* c
. z! t0 M8 k( m& l1 @+ m# N7 k
第二个程序:void  Write_A_Byte(uchar dat) //写一个字节4 F$ k- L% d  M8 R9 n3 c# C
{
& U4 V6 ]) N! C" M1 a( c  uchar i; : H& H- Y& U7 v+ r1 \) c4 T+ L! b
  uchar temp;
6 H: F3 V, H4 w! L3 h% |0 g  temp=dat;
# R3 |% c1 T5 L, O3 @* N  SCL=0;   //释放时钟信号  让数据总线变化6 g- g3 q8 K$ k5 j+ `
  for(i=0;i<8;i++) ; ~( [4 r0 J( K6 v4 h
  {! e* @0 n+ v) W4 S4 B* N
    IF(temp&0x80) 4 q: }1 e5 t) a1 a2 f4 Y" o
      SDA=1; / s' _  Q, T' P# z
    else 0 ?% z' p7 T1 \& G# |) }. U+ }( u
      SDA=0;  
( b8 _9 [) W3 r- U+ F    //SCL=1;
% e. _5 Q: [& U$ o8 x2 P    temp<<=1;
3 p5 N3 \5 J$ L& ?        NOP4();. C4 D/ S: c( D
    SCL=1;
; _% s6 u/ N( m- i- k        NOP4(); / }2 w, A$ `+ i+ V: W/ N
  }  
. U( k/ C% L# \7 T  SDA = 1;
  L: l2 q( Z3 R9 x( ]! E: b  NOP4();
# l1 W* |% `# [1 }}
- Y1 v" h& _7 n" {- e4 `# y% o2 I- i5 P3 e$ n

该用户从未签到

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
0 E8 }) r  I  t( H: n第二个程序在发送完一位数据后,scl没置0,却置了1,手误吧。

& a9 f0 s0 i$ L. ]6 b/ R/ A" Lvoid  Write_A_Byte(uchar dat) //写一个字节4 d# A" n0 H. ^* o/ X! C: Q8 y
{
3 X5 h, ]. C& I+ {, Z5 K  uchar i; & A& q2 B4 ?8 [6 ~: i+ F" c
  uchar temp;, `0 c8 F+ R6 X/ x3 Q, u
  temp=dat;
: G& b0 N' `+ }) [1 Y  C: V) x6 K  SCL=0;   //释放时钟信号  让数据总线变化
' G  p/ `9 Q; \  for(i=0;i<8;i++)
! C) o4 z& e/ T) {3 D  {
+ P6 b, S& o  u* ?    if(temp&0x80)
" D" J  n6 r$ m( P/ a/ ]      SDA=1; : V+ }4 n4 ^; ^8 U
    else $ Y8 E+ P( f( \2 \
      SDA=0;  
( Z" A7 T+ z3 R: @: B    SCL=1;
3 D$ @1 j4 }: j9 j& g7 O# ]    temp<<=1; 0 D: ]0 V! Z. o$ l% l
        NOP4();
' k7 S& ?2 b6 z    SCL=0; 4 P: [$ O9 k  v0 F# c6 p2 w, E8 e4 D
        NOP4(); / n2 E' a7 [7 e' Y) _3 V1 b! O* R
  }  : Q: R& w' R0 i0 z/ n: g2 D$ S
}4 S1 }! q' O- o. J5 h
是这样的,但是还是不行啊…………
9 b7 t  ^- Z8 A( P

点评

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:090 x9 |9 E% z9 ~
void  Write_A_Byte(uchar dat) //写一个字节) q5 t- f. Y# A2 [& R9 V
{ 8 h# X: g4 l. E$ v; k$ ~: U/ a7 X
  uchar i;

1 N' K( R8 H) ]! B1 W; mif(temp&0x80)
& w" n! L- e! w5 I: `4 ^1 c& \      SDA=1;
! b: H. p% b+ w' L5 c0 Y    else
% z+ |) T: g" u8 A3 Q) N5 b! U$ a      SDA=0;  
3 E$ e* k0 U: h1 H* C4 i在这加一个NOP4();试试
+ M. R* O0 I; [, W    SCL=1;
  P9 Q. c7 I# x+ f    temp<<=1;   a' D$ _7 L& k7 g8 E& H" d6 l- S
        NOP4();0 `. w3 J2 s/ o4 w  e
    SCL=0;
9 _/ E. A, i- s2 S$ \        NOP4(); $ X6 Y' t* Z1 a0 q' h& C4 f
另外你如何判断写入是否成功呢
% R/ V9 w& U" r# Q% @6 y5 W

点评

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

该用户从未签到

5#
 楼主| 发表于 2019-6-28 16:17 | 只看该作者
helendcany 发表于 2019-6-28 16:13" t% z, ^: Z. ?# ?6 c6 T0 y2 h6 U% H
if(temp&0x80) ; V& z' K' V% b+ {
      SDA=1;
# n3 @6 z# b% v, A    else
9 D& Y7 w' @- b" u$ ]
还是不行,我是用24c04在仿真软件上仿真的
- d, B9 R* P& X: ~+ X9 g# Y

点评

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

该用户从未签到

6#
发表于 2019-6-28 16:23 | 只看该作者
yigeqdaizouni 发表于 2019-6-28 16:177 e; y' I' Z- a6 E4 N+ }6 E4 t
还是不行,我是用24c04在仿真软件上仿真的

( b/ r, x) `- ?用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Read_ACK();吗,加了的话,应该和第一段程序没什么区别了6 J7 ^7 O  f  O% M8 _9 I) L

点评

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

该用户从未签到

7#
 楼主| 发表于 2019-6-28 16:44 | 只看该作者
helendcany 发表于 2019-6-28 16:23! }# O" \( Y4 D% S6 Z" v) e. L$ b
用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Re ...

" a. [" k( ^( ~嗯嗯,谢谢指导,找到问题了,是没有加Read_ACK();谢谢。
$ r5 K& z2 i+ O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-25 08:22 , Processed in 0.140625 second(s), 31 queries , Gzip On.

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

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

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