iic 发送程序问题
本帖最后由 镜中风铃 于 2013-8-23 22:17 编辑/**
* 函数: i2c_sendbyte(uint8 bt)
* 功能: 将输入的一字节数据bt发送
*/
void i2c_sendbyte(uint8 bt)
{
uint8 i;
for(i=0; i<8; i++)
{
if (bt & 0x80)
SDA = 1;
else
SDA = 0;
SCL=0;
SCL = 1;
nops();
bt <<= 1;
}
SCL = 0;
}
这个IIC 发送程序通不过,请问问题出在哪里呢?
* 函数: i2c_sendbyte(uint8 bt)
* 功能: 将输入的一字节数据bt发送
*/
void i2c_sendbyte(uint8 bt)
{
uint8 i;
for(i=0; i<8; i++)
{
if (bt & 0x80)
SDA = 1;
else
SDA = 0;
nops();
SCL = 1;
bt <<= 1;
nops();
SCL = 0;
}
}
下面这个程序是可以通过的 请问区别在哪里 半截程序? zouzhichao 发表于 2013-8-23 22:17 static/image/common/back.gif
半截程序?
现在 编辑好了 抛开前面和后面,for循环里要做的事:
for(i=0; i<8; i++)
{
}
(1)SDA准备好要传输的数据(0/1)。
(2)SCL来个时钟脉冲(delay,上升沿,delay,下降沿)。
(3)准备下一个要传输的数据(0/1),进入步骤(1),循环。 void i2c_sendbyte(uint8 bt)
{
uint8 i;
for(i=0; i<8; i++)
{
//准备好要传输的数据
if (bt & 0x80)
SDA = 1;
else
SDA = 0;
//delay
nops();
//上升沿
SCL = 1;
bt <<= 1;//准备下一位数据,这一句也可往后挪
//delay
nops();
//下降沿
SCL = 0;
}
} void i2c_sendbyte(uint8 bt)
{
uint8 i;
for(i=0; i<8; i++)
{
//准备好要传输的数据
if (bt & 0x80)
SDA = 1;
else
SDA = 0;
//下降沿??????
SCL=0;
//delay这么短????
//上升沿??????
SCL = 1;
//delay
nops();
//准备下一位数据
bt <<= 1;
}
SCL = 0;
} 附一张截图:
红色矩形框内为一个数据位的传输过程
四条蓝色标线是四个步骤
(A)SDA准备好数据
(A-B)延时
(B)SCL上升沿
(B-C)延时
(C)SCL下降沿
(C-D)延时
(D)下一位数据的(A)过程,如此循环
楼主明白否? 本帖最后由 镜中风铃 于 2013-8-23 22:51 编辑
zouzhichao 发表于 2013-8-23 22:31 static/image/common/back.gif
void i2c_sendbyte(uint8 bt)
{
uint8 i;
非常感谢, 现在懂了, 还有个问题是 为什么IIC 里没有,上升沿或者下降沿 ,打入数据这么一说,这个说法在SPI 里有。 datasheet是个好东西,IIC时序,SPI时序还有其他一些1-Wire的时序(18B20,AM2301之流),基本照着datasheet写就是了 zouzhichao 发表于 2013-8-23 22:49 static/image/common/back.gif
datasheet是个好东西,IIC时序,SPI时序还有其他一些1-Wire的时序(18B20,AM2301之流),基本照着datashee ...
非常感谢, 现在懂了, 还有个问题是 为什么IIC 里没有,上升沿或者下降沿 ,打入数据这么一说,这个说法在SPI 里有。
PS , 悬赏币是怎么给回答者的 镜中风铃 发表于 2013-8-23 22:52 static/image/common/back.gif
非常感谢, 现在懂了, 还有个问题是 为什么IIC 里没有,上升沿或者下降沿 ,打入数据这么一说,这个说法 ...
莫元倒是不要紧
你说的是“SPI的上升沿/下降沿采样"是吧? zouzhichao 发表于 2013-8-23 23:00 static/image/common/back.gif
莫元倒是不要紧
你说的是“SPI的上升沿/下降沿采样"是吧?
嗯,是的,SPI书上是写着 上升沿打入数据, 下降沿接受数据 镜中风铃 发表于 2013-8-23 23:19 static/image/common/back.gif
嗯,是的,SPI书上是写着 上升沿打入数据, 下降沿接受数据
AVR的SPI有很多模式,可以通过寄存器设置,相信其他的带SPI的MCU也可以灵活设置
你看看他们俩的时序图就明白了
IIC无所谓上升沿采样还是下降沿采样,IIC的顺序是:数据——时钟——时钟——数据,上升沿,下降沿SDA的状态是一样的
SPI的顺序:数据——时钟——数据——时钟(起始沿采样),或者,时钟——数据——时钟——数据(结束沿采样),因此就有起始沿/结束沿采样的问题,同样也就有上升沿采样还是下降沿采样的问题了
页:
[1]