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

关于I2C的读写问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
下面两个程序都是关于I2C的写数据程序,为什么第二个程序就不行呢??
% F6 u% k& t4 m6 G8 T" L# @7 D2 @9 J/ ?6 x( E

  E4 o( a$ f- e- h第一个程序:void Write_A_Byte(uchar b) //向 24C16 中写一字节数据2 B8 D! L5 h6 i+ \5 m
{" M( a4 q+ w5 t! L. ?; {* L
uchar i;
( c- d* c+ c4 @! m+ B% Sfor(i=0;i<8;i++)
5 B- M$ {+ {+ k, i! U, h{
. w) A( `2 z: B: o* q* A/ _4 ub<<=1;
& y+ M  `  x! ZSDA=CY;3 l# G6 C8 T$ c; D5 x
_nop_();0 B8 Y  Q3 P. y
SCL=1;
6 f2 M+ D1 o3 s7 R  i" ?8 yNOP4();9 e7 s, E: c, l* h* q+ J/ ^0 B4 f
SCL=0;2 S0 Y2 e6 U  F, a; Z; g' e" E- B
}$ O6 [3 Q, Y5 P, V0 l
Read_ACK();3 w/ S3 ~9 S6 V0 ^7 s- ^# a  M; w
}        
+ e" H6 s! ~( H' L4 Y
" b; U. c) H3 l3 V$ t: d) T第二个程序:void  Write_A_Byte(uchar dat) //写一个字节/ Q1 f/ u5 U0 {5 n1 b
{
: [3 q0 Z3 Z3 g2 h" b" b  }, h  uchar i; ( l( U# G& j6 y, [' o
  uchar temp;$ p6 \" n$ f6 D& D
  temp=dat;1 S1 c6 T: w9 m$ m) Y* L/ r; \4 `
  SCL=0;   //释放时钟信号  让数据总线变化4 z4 q/ \1 p4 I- k! ?& w8 \
  for(i=0;i<8;i++) 2 m4 U& K( v8 z. O
  {
6 i5 O. q- J6 {& H, c  d$ m    IF(temp&0x80) ' I5 G' S4 I+ d
      SDA=1; , m/ O# m8 H& F2 Z. O1 s
    else 4 T, Q7 Z& @: Y8 j& L& D
      SDA=0;  / ?7 i3 _# V4 ^3 A: C2 u
    //SCL=1; 7 Y* s8 i5 z& R6 |6 _
    temp<<=1; 3 x3 z5 f& I* B% m3 m
        NOP4();
& \( i0 |- ~; g- k) Z    SCL=1; ) J; H1 C! x: V/ x7 ?4 i
        NOP4();
% S0 ^8 t; m) {+ J4 U: c, p  }  ; D* K# H6 T5 Q  m3 }
  SDA = 1;
# l* @9 i# o9 v& Q1 o( K$ E  NOP4();
9 D$ p; {0 z9 u: T}2 _2 _0 l3 w2 x( c8 s
! i) C$ \: |- N/ `1 S

该用户从未签到

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:444 u/ @1 D4 v1 {9 w- u& X
第二个程序在发送完一位数据后,scl没置0,却置了1,手误吧。
) d8 _" v& B. ^/ ?8 z# i3 I
void  Write_A_Byte(uchar dat) //写一个字节
3 v5 I$ o2 v/ M6 W{
/ m% {3 P- k9 Q* H3 P) A  uchar i; ( a/ t( U8 z4 Y$ O8 D* X/ q( i+ M* N* R
  uchar temp;/ P9 W9 z. J0 {* q& s2 R
  temp=dat;" A" B$ K: J8 O: Z. p
  SCL=0;   //释放时钟信号  让数据总线变化  i0 h$ G' l% r5 ~  H
  for(i=0;i<8;i++)
. g7 j, ?, {- _( j  {0 ?/ w) V4 u2 N7 s8 q
    if(temp&0x80) , s( Z) e' T0 u% \; |' f
      SDA=1;
9 H! @, b0 o0 S! Y9 e* D! F    else 7 z9 N8 l; J9 R+ `2 M% V. H
      SDA=0;  1 X8 @# k( T+ N1 s8 x- T
    SCL=1; ; ^& k$ G! |3 [1 F! D: V# ?
    temp<<=1;
8 }% V; C& a* u        NOP4();
& z3 P( c% n, u0 {+ L+ H    SCL=0; # Z6 D& W7 ?2 s% ?
        NOP4();
0 a" s2 v& z- M" h) m  }  / i( ^2 _7 S4 U" M
}
* g9 E+ j; Z; `( c4 E* a8 J$ o是这样的,但是还是不行啊…………
% T$ ~7 a9 ~/ z8 Q% l

点评

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
) ?+ T4 p& q  j! W, B% O; Q$ Evoid  Write_A_Byte(uchar dat) //写一个字节+ `4 U5 [, a' h9 x8 E! {
{
# ^1 ?3 A0 _7 ?; i, F/ X  uchar i;
! W: A2 r( Y/ K* `$ g
if(temp&0x80) , ?% m6 ~% J4 x' l1 M. j
      SDA=1; 4 k. [5 e; Q& h4 D
    else 9 ]6 _5 X9 J: U" Z( Q& u3 J
      SDA=0;  # u9 A6 H! _* [: d' Y7 D
在这加一个NOP4();试试
, y' s0 _# v$ ~    SCL=1;
' F2 C  `+ u+ w( M    temp<<=1; 5 T; w, t" y- w/ G' A; q
        NOP4();( k: o# D+ b, v- j! o2 x4 K3 @9 D
    SCL=0;
/ U, W  |+ w7 b  ~) g/ K) H        NOP4();
* x# }( g1 G+ k) u另外你如何判断写入是否成功呢% G4 F- J3 f* h8 U3 G

点评

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

该用户从未签到

5#
 楼主| 发表于 2019-6-28 16:17 | 只看该作者
helendcany 发表于 2019-6-28 16:13
$ U) m0 K! _/ \8 w1 b+ ?& \if(temp&0x80) 0 a7 _' M/ n: ]  `$ F% l
      SDA=1;   \; Z5 {) `4 b" W5 p
    else

" r: B3 B5 C; W) X1 l还是不行,我是用24c04在仿真软件上仿真的3 U, S" F! x3 f1 d! t7 w( m

点评

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

该用户从未签到

6#
发表于 2019-6-28 16:23 | 只看该作者
yigeqdaizouni 发表于 2019-6-28 16:176 W  z) r" R7 n7 c! Z
还是不行,我是用24c04在仿真软件上仿真的

3 c( B+ E# V/ q( }- v- x用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Read_ACK();吗,加了的话,应该和第一段程序没什么区别了! J& F) O6 \! g* J3 O# \3 Q9 }

点评

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

该用户从未签到

7#
 楼主| 发表于 2019-6-28 16:44 | 只看该作者
helendcany 发表于 2019-6-28 16:23
& j, L/ a; x- ~用第一段程序代替这段能成功吗,sda和slk引脚有接上拉电阻吗,现在这段程序应该可以了,另外在末尾有加Re ...
0 Z: p9 v/ t. {+ V! G" |
嗯嗯,谢谢指导,找到问题了,是没有加Read_ACK();谢谢。7 \/ Z% N7 p% ]0 E/ T2 z3 W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-11 22:49 , Processed in 0.140625 second(s), 31 queries , Gzip On.

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

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

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