OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5434|回复: 11

对原子哥的库函数的IIC例程的停止信号的疑问?

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-24
在线时间
1 小时
发表于 2015-7-19 21:11:23 | 显示全部楼层 |阅读模式
5金钱
我们都知道,IIC产生停止信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
原子哥的例程是这样的
[mw_shl_code=c,true]//产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SCL=0; IIC_SDA=0; delay_us(4); IIC_SCL=1;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SDA=1;//发送I2C总线结束信号 }[/mw_shl_code]
可见,这个函数的意思是,SCL为低电平时,SDA由低电平向高电平跳变,产生结束信号。这里是不是错了,还是我理解错了呢?
个人感觉是这样的吧:
[mw_shl_code=c,true]//产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SCL=1; IIC_SDA=0; delay_us(4); IIC_SCL=1;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SDA=1;//发送I2C总线结束信号 }[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]//产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SCL=0; IIC_SDA=0; delay_us(4); IIC_SCL=1;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SDA=1;//发送I2C总线结束信号 }[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-19 21:11:24 | 显示全部楼层
[mw_shl_code=c,true]//产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SCL=0; IIC_SDA=0; delay_us(4); IIC_SCL=1;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SDA=1;//发送I2C总线结束信号 }[/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-7-17
在线时间
0 小时
发表于 2015-7-19 21:11:24 | 显示全部楼层
回复【5楼】悳龍的傳仁:
---------------------------------
{
    SDA_OUT();//sda线输出
    IIC_SCL=0;
    IIC_SDA=0;
    delay_us(4);
    IIC_SCL=1;//STOP:when CLK is high DATA change form low to high
    delay_us(4);//  这条语句结束后  SCL是不是高电平 下面那句IIC_SDA=A 是不是执行上升沿  你根据语句画图  就很好理解了
    IIC_SDA=1;//发送I2C总线结束信号 
}
颠沛流离
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-24
在线时间
1 小时
 楼主| 发表于 2015-7-19 22:36:08 | 显示全部楼层
个人感觉是这样的吧:
[mw_shl_code=c,true]{ SDA_OUT();//sda线输出 IIC_SCL=1; IIC_SDA=0; delay_us(4); IIC_SCL=1;//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SDA=1;//发送I2C总线结束信号 }[/mw_shl_code]

[mw_shl_code=c,true][/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-19 23:22:07 | 显示全部楼层
回复【3楼】悳龍的傳仁:
---------------------------------
那你可以改成这样试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-4-24
在线时间
1 小时
 楼主| 发表于 2015-7-20 11:52:44 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
改成这样就不行了,但说不过去啊?原子哥,这个底层都错了,后面的怎么会能正常工作呢?
回复

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-4-17
在线时间
18 小时
发表于 2016-10-17 19:37:06 | 显示全部楼层
悳龍的傳仁 发表于 2015-7-20 11:52
回复【4楼】正点原子:
---------------------------------
改成这样就不行了,但说不过去啊?原子哥,这个 ...

解决没 我也感觉是你说的那样
回复

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-4-17
在线时间
18 小时
发表于 2016-10-17 19:38:15 | 显示全部楼层
正点原子 发表于 2015-7-19 23:22
回复【3楼】悳龍的傳仁:
---------------------------------
那你可以改成这样试试

他说的 是对 是错 ?
我和他的想法一样
回复

使用道具 举报

6

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1581
金钱
1581
注册时间
2016-7-2
在线时间
277 小时
发表于 2016-11-3 16:31:33 | 显示全部楼层
本帖最后由 迪拜大呲花 于 2016-11-3 16:51 编辑

我感觉正确的应该是下面这样
[mw_shl_code=c,true]//产生IIC停止信号
void IIC_Stop(void)
{
    SDA_OUT();
    IIC_SCL=0;
    IIC_SDA=0;
    delay_us(4);
    IIC_SCL=1;
    delay_us(4);
    IIC_SDA=1;                        
}[/mw_shl_code]
下面是例程里的,我测试过也是正常的,但我觉得这个时序是有问题的啊,求大神解答
[mw_shl_code=c,true]void IIC_Stop(void)
{
    SDA_OUT();
    IIC_SCL=0;
    IIC_SDA=0;
    delay_us(4);
    IIC_SCL=1;
    IIC_SDA=1;
    delay_us(4);                              
}[/mw_shl_code]
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-7-30 09:04:00 | 显示全部楼层
迪拜大呲花 发表于 2016-11-3 16:31
我感觉正确的应该是下面这样
[mw_shl_code=c,true]//产生IIC停止信号
void IIC_Stop(void)

试出来结果了吗
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-17
在线时间
5 小时
发表于 2019-7-20 11:17:25 | 显示全部楼层
正点原子 发表于 2015-7-19 21:11
[mw_shl_code=c,true]//产生IIC停止信号
void IIC_Stop(void)
{

感觉没修改什么鸭。在SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;  
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);               
IIC_SCL=1之后要不要给它延个时呢                                                  
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-6
在线时间
4 小时
发表于 2020-3-23 15:55:41 | 显示全部楼层
noki 发表于 2019-7-20 11:17
感觉没修改什么鸭。在SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA ch ...

响应ack失败时候stop不给他加个延时会直接进行下一步操作不会产生停止条件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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