打印

关于i2c的一个问题

[复制链接]
1309|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bryanlee512|  楼主 | 2015-7-9 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, FOR, TE, sd, AD
本帖最后由 bryanlee512 于 2015-7-10 16:21 编辑

最近在看郭天祥51的书 i2c里读一个字节 怎么理解
uchar readbyte()
{
   uchar i,k;
   SCL=0;
   delay();
   SDA=1;
   for(i=0;i<8;i++)
   {
       SCL=1;
       delay();
       k=(k<<1)|SDA;     //这句不理解了,运算结束后k值是否为一个独立位?还是一个字节?还有此时SDA为何值?由发送硬件决定?
       SCL=0;
       delay();
   }
   delay();
   return k;
}

相关帖子

沙发
dirtwillfly| | 2015-7-9 22:50 | 只看该作者
没看过这本书。从这段代码看,是用普通io来模拟i2c通讯。

使用特权

评论回复
板凳
dirtwillfly| | 2015-7-9 22:50 | 只看该作者
本帖最后由 dirtwillfly 于 2015-7-9 22:53 编辑

k是用来把接收到的bit位组合成一个字节

使用特权

评论回复
地板
Hu.Te| | 2015-7-10 09:59 | 只看该作者
我觉得这个代码有些怪怪的,你的“K”在使用的前要初始化一下,习惯不好~
K不会是个独立的位,是一个字节。SDA为何值不用你去担心,那是硬件需要告诉你的,不是1就是0.

使用特权

评论回复
5
huayuliang| | 2015-7-10 10:33 | 只看该作者
SDA 是数据线。。你程序里应该有引脚定义。。
一个字节8个位,读取时,SDA就是每个位的逻辑状态。

k=(k<<1)|SDA;

每次左移,都与当前SDA做或运算,8次左移之后,k就存储了整个一个字节。

使用特权

评论回复
6
bryanlee512|  楼主 | 2015-7-10 12:38 | 只看该作者
huayuliang 发表于 2015-7-10 10:33
SDA 是数据线。。你程序里应该有引脚定义。。
一个字节8个位,读取时,SDA就是每个位的逻辑状态。

是的sda事先是有引脚定义了的

使用特权

评论回复
7
bryanlee512|  楼主 | 2015-7-10 12:47 | 只看该作者
huayuliang 发表于 2015-7-10 10:33
SDA 是数据线。。你程序里应该有引脚定义。。
一个字节8个位,读取时,SDA就是每个位的逻辑状态。

明白了。
补充下,k在初始的时候ucar k这句定义完了以后,k是不是默认等于0x00000000?

使用特权

评论回复
评论
datouyuan 2015-7-15 17:50 回复TA
不是的,k可以未任意值,不需要初始化。 因为经过8次左移后,以前是什么值已经没关系了。 
huayuliang 2015-7-12 14:51 回复TA
是的,一般定义后默认初始化为0x00...,如果不是,自己初始化吧。 
8
bryanlee512|  楼主 | 2015-7-10 12:49 | 只看该作者
Hu.Te 发表于 2015-7-10 09:59
我觉得这个代码有些怪怪的,你的“K”在使用的前要初始化一下,习惯不好~
K不会是个独立的位,是一个字节。 ...

应该这么理解 如果不初始化 怎么把sda的状态写到一个char类型的变量k中呢?

使用特权

评论回复
9
bryanlee512|  楼主 | 2015-7-10 12:49 | 只看该作者
dirtwillfly 发表于 2015-7-9 22:50
k是用来把接收到的bit位组合成一个字节

高手正解

使用特权

评论回复
10
Hu.Te| | 2015-7-10 13:45 | 只看该作者
bryanlee512 发表于 2015-7-10 12:47
明白了。
补充下,k在初始的时候ucar k这句定义完了以后,k是不是默认等于0x00000000? ...

这个问题问的好~
或许大部分的编译器会将"K"设置为0x0(unsigned char), 但是如果你的代码要移植到其它的平台,其它的编译器如果对"K"有严格的检测机制,编译则可能不会通过。则你又要返回修改的。
好的习惯太重要了, 最近我也在学习编程的,看了一Bjarne介绍C++方面的书籍,很有启发。
推荐你也可以找找电子书看一下,会获益非浅的。

使用特权

评论回复
11
bryanlee512|  楼主 | 2015-7-10 16:18 | 只看该作者
Hu.Te 发表于 2015-7-10 13:45
这个问题问的好~
或许大部分的编译器会将"K"设置为0x0(unsigned char), 但是如果你的代码要移植到其它的 ...

平台移植现在还不考虑 毕竟刚摸单片机 以前读书的时候倒是看过谭浩强的c++

使用特权

评论回复
12
lgq1542380129| | 2015-7-10 17:13 | 只看该作者
IIC的理解无外乎主要是对读写时序的理解。IIC操作主要是注意,时钟信号为低时,数据可以改变,为高时数据必须稳定。这里我们可以这样理解:写数据:时钟为低时,数据可由控制器写入SDA线上,此时当时钟线为高时,SDA线上的数据写入外设IIC设备中;读数据:由于我们要读的数据必须是稳定的数据,时钟线为高时,外设IIC设备中被读取的稳定数据,在SDA线上,时钟为低时,外设IIC设备中被读取的数据写到SDA上。如此完成循环。

使用特权

评论回复
13
630183258| | 2015-7-10 17:34 | 只看该作者
楼主,这个结束后是一个字节,向左移位后,后面会补零,再与SDA或就会得到相应为的值,这个的原理是存储器由高到低一次发送8个bit的数据,单片机接收后再把收到的数据拼接成1个字节。

使用特权

评论回复
14
bryanlee512|  楼主 | 2015-7-10 17:42 | 只看该作者
论看了回复,论坛里权威资深人士很多,解决了问题,感谢所有回复!

使用特权

评论回复
15
Hu.Te| | 2015-7-10 21:34 | 只看该作者
bryanlee512 发表于 2015-7-10 16:18
平台移植现在还不考虑 毕竟刚摸单片机 以前读书的时候倒是看过谭浩强的c++ ...

谭的书也被人批评的蛮多的~我没看过,不过我相信还是可以的。

使用特权

评论回复
16
bryanlee512|  楼主 | 2015-7-11 10:49 | 只看该作者
Hu.Te 发表于 2015-7-10 21:34
谭的书也被人批评的蛮多的~我没看过,不过我相信还是可以的。

你推荐Bjarne那本书也是不错 谭至少在中国还是很权威的 中国
c的鼻祖

使用特权

评论回复
17
Hu.Te| | 2015-7-14 19:51 | 只看该作者
bryanlee512 发表于 2015-7-11 10:49
你推荐Bjarne那本书也是不错 谭至少在中国还是很权威的 中国
c的鼻祖

计算机语言真正的鼻祖应该是算法和数据结构,这是真内功,写代码或是什么语言只是个形,就像中国的武侠小说一样,内功打通者,分分钟钟学会一门的。但是要把内功练好多难啊~

使用特权

评论回复
18
hejianguo5515| | 2015-7-14 20:01 | 只看该作者
为什么所有单片机教材书都使用独占式延时,这不是很浪费资源吗?

使用特权

评论回复
19
bryanlee512|  楼主 | 2015-7-14 21:03 | 只看该作者
hejianguo5515 发表于 2015-7-14 20:01
为什么所有单片机教材书都使用独占式延时,这不是很浪费资源吗?

可能是入门的原因吧 不然讲起来可能就抽象了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

72

帖子

0

粉丝