搜索
bottom↓
回复: 13

iic 发送程序问题

[复制链接]

出0入0汤圆

发表于 2013-8-23 22:14:19 | 显示全部楼层 |阅读模式
本帖最后由 镜中风铃 于 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;
    }
}

下面这个程序是可以通过的 请问区别在哪里

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出10入23汤圆

发表于 2013-8-23 22:17:20 | 显示全部楼层
半截程序?

出0入0汤圆

 楼主| 发表于 2013-8-23 22:19:09 | 显示全部楼层
zouzhichao 发表于 2013-8-23 22:17
半截程序?

现在 编辑好了

出10入23汤圆

发表于 2013-8-23 22:27:24 | 显示全部楼层
抛开前面和后面,for循环里要做的事:
for(i=0; i<8; i++)
{
}
(1)SDA准备好要传输的数据(0/1)。
(2)SCL来个时钟脉冲(delay,上升沿,delay,下降沿)。
(3)准备下一个要传输的数据(0/1),进入步骤(1),循环。

出10入23汤圆

发表于 2013-8-23 22:29:52 | 显示全部楼层
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;
    }
}

出10入23汤圆

发表于 2013-8-23 22:31:29 | 显示全部楼层
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;
}

出10入23汤圆

发表于 2013-8-23 22:41:40 | 显示全部楼层
附一张截图:
红色矩形框内为一个数据位的传输过程
四条蓝色标线是四个步骤
(A)SDA准备好数据
(A-B)延时
(B)SCL上升沿
(B-C)延时
(C)SCL下降沿
(C-D)延时
(D)下一位数据的(A)过程,如此循环

本帖子中包含更多资源

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

x

出10入23汤圆

发表于 2013-8-23 22:43:07 | 显示全部楼层
楼主明白否?

出0入0汤圆

 楼主| 发表于 2013-8-23 22:46:01 | 显示全部楼层
本帖最后由 镜中风铃 于 2013-8-23 22:51 编辑
zouzhichao 发表于 2013-8-23 22:31
void i2c_sendbyte(uint8 bt)
{
    uint8 i;


非常感谢, 现在懂了, 还有个问题是 为什么IIC 里没有,上升沿或者下降沿 ,打入数据这么一说,这个说法在SPI 里有。

出10入23汤圆

发表于 2013-8-23 22:49:54 | 显示全部楼层
datasheet是个好东西,IIC时序,SPI时序还有其他一些1-Wire的时序(18B20,AM2301之流),基本照着datasheet写就是了

出0入0汤圆

 楼主| 发表于 2013-8-23 22:52:18 | 显示全部楼层
zouzhichao 发表于 2013-8-23 22:49
datasheet是个好东西,IIC时序,SPI时序还有其他一些1-Wire的时序(18B20,AM2301之流),基本照着datashee ...

非常感谢, 现在懂了, 还有个问题是 为什么IIC 里没有,上升沿或者下降沿 ,打入数据这么一说,这个说法在SPI 里有。

PS , 悬赏币是怎么给回答者的

出10入23汤圆

发表于 2013-8-23 23:00:05 | 显示全部楼层
镜中风铃 发表于 2013-8-23 22:52
非常感谢, 现在懂了, 还有个问题是 为什么IIC 里没有,上升沿或者下降沿 ,打入数据这么一说,这个说法 ...

莫元倒是不要紧
你说的是“SPI的上升沿/下降沿采样"是吧?

出0入0汤圆

 楼主| 发表于 2013-8-23 23:19:06 | 显示全部楼层
zouzhichao 发表于 2013-8-23 23:00
莫元倒是不要紧
你说的是“SPI的上升沿/下降沿采样"是吧?

嗯,是的,SPI书上是写着 上升沿打入数据, 下降沿接受数据

出10入23汤圆

发表于 2013-8-23 23:32:53 | 显示全部楼层
镜中风铃 发表于 2013-8-23 23:19
嗯,是的,SPI书上是写着 上升沿打入数据, 下降沿接受数据

AVR的SPI有很多模式,可以通过寄存器设置,相信其他的带SPI的MCU也可以灵活设置

你看看他们俩的时序图就明白了
IIC无所谓上升沿采样还是下降沿采样,IIC的顺序是:数据——时钟——时钟——数据,上升沿,下降沿SDA的状态是一样的
SPI的顺序:数据——时钟——数据——时钟(起始沿采样),或者,时钟——数据——时钟——数据(结束沿采样),因此就有起始沿/结束沿采样的问题,同样也就有上升沿采样还是下降沿采样的问题了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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