OpenEdv-开源电子网

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

帮忙看一下IIC SM9541 应答

[复制链接]

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
发表于 2016-6-24 09:03:14 | 显示全部楼层 |阅读模式
1金钱
u8 IIC_Read_ACK_A(void) 续传应答
{
        u8 ACK_NACK = 0;
        u16 temp;
       
        SCL_Low_A();

        SDA_SET_A;                       
       
        SCL_High_A();

        for(temp = 500; temp > 0; temp--)
        {
                if(!SDA_IN_NUM_A)
                {
                        ACK_NACK = 0;       
                        SCL_Low_A();
                        return ACK_NACK;                                                //over time,read NACK.return 1
                }
        }

        SCL_Low_A();
        return ACK_NACK = 1;                                                        //read ACK.return 0
}

void IIC_send_ACK_NACK_A(u8 ACK_NACK ) 停止应答
{
        SCL_Low_A();

       
        if(!ACK_NACK)
        {
                SDA_DOWN_A;                                                                                //send ACK,when ACK_NACK = 0
        }
        else
        {
                SDA_SET_A;       
        }
       
        SCL_High_A();
        SCL_Low_A();
}

(Z8TZ7DBXRJI]OX7UZ]U$`S.png
IBT7M8GJAVYLE_HUV6CX1]B.png
NLM58PCKQGF{RF](G@]DCKI.png

最佳答案

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

改好了 谢谢大家
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 09:03:15 | 显示全部楼层
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 09:28:55 | 显示全部楼层
资料是标准的iic的时序啊,感觉简单就好了,你写的复杂了。除非你要写应答超时的err程序
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 09:36:30 | 显示全部楼层
hgr211 发表于 2016-6-24 09:28
资料是标准的iic的时序啊,感觉简单就好了,你写的复杂了。除非你要写应答超时的err程序

公司的项目 只能按这个格式的基础上改啊 我感觉开关I2C应该没事 就应答这一段出问题了 你看这两个应答方法有错没
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 09:39:09 | 显示全部楼层
hgr211 发表于 2016-6-24 09:28
资料是标准的iic的时序啊,感觉简单就好了,你写的复杂了。除非你要写应答超时的err程序

而且我仿真读回来的数据是两组 0XFF 绝对不对啊
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 09:41:37 | 显示全部楼层
是对的,能不能直接定义ack=1啊,弄个ncak,然后!,看的好累
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 09:47:00 | 显示全部楼层
就这断子函数看不出来啊,也许你地址错了什么的

要测试的话只要检测发送iic地址,看有没有应答就好了,在应答程序里面打印一下,看是不是超时了
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 09:48:49 | 显示全部楼层
hgr211 发表于 2016-6-24 09:41
是对的,能不能直接定义ack=1啊,弄个ncak,然后!,看的好累

公司代码 我写的时候已经把好多参数都 直接写上了 原本代码很繁琐的 现在仿真就是不对 这程序是从一个成品NPA700传感器上挪过来的

现在仿真就是 两组 0XFF

成品代码 应该I2C 开关 和data 传输都不可能出错的 我感觉就应该是应答这块
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 10:00:38 | 显示全部楼层
hgr211 发表于 2016-6-24 09:47
就这断子函数看不出来啊,也许你地址错了什么的

要测试的话只要检测发送iic地址,看有没有应答就好了, ...

u8 IIC_Read_ACK_A(void)
{
        u8 ACK_NACK = 0;
        u16 temp;
       
        SCL_Low_A();

        SDA_SET_A;                       
       
        SCL_High_A();

        for(temp = 500; temp > 0; temp--)
        {
                if(!SDA_IN_NUM_A)
                {
                        ACK_NACK = 0;       
                        SCL_Low_A();
                        这里是有应答
                        return ACK_NACK;                                                //over time,read NACK.return 1
                }
        }

        SCL_Low_A();
        return ACK_NACK = 1;                                                        //read ACK.return 0
}
在应答函数里 加printf?我也是刚学 不会直接测试的方式啊 求知道
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 10:01:26 | 显示全部楼层
nack是1代表了应答,还是0啊,头晕。停止信号是在scl高阶段,sda,0-1,是不是没停止信号
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 10:03:57 | 显示全部楼层
hgr211 发表于 2016-6-24 09:47
就这断子函数看不出来啊,也许你地址错了什么的

要测试的话只要检测发送iic地址,看有没有应答就好了, ...

send_i2c_byte(0b10100001);   这是官方example 里的地址
手册上的地址28HEX

我用的是0X28
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 10:17:14 | 显示全部楼层
设置串口,然后这里有应答输出下就可以了。第一个字节发送iic地址就要应答,不然不用考虑后面的程序。拿原子的iic测试程序,改下io就可以用了,28是写,29是读,但不管读写,写第一个字节都要应答。你的应答函数是没问题的
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 10:17:25 | 显示全部楼层
hgr211 发表于 2016-6-24 10:01
nack是1代表了应答,还是0啊,头晕。停止信号是在scl高阶段,sda,0-1,是不是没停止信号

1是无应答
0是应答
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 10:19:13 | 显示全部楼层
你是不是读,写地址错了,最后一位代表读写,1是读,你要写0x29
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 10:22:18 | 显示全部楼层
hgr211 发表于 2016-6-24 10:19
你是不是读,写地址错了,最后一位代表读写,1是读,你要写0x29

     address=address<<1;
        IIC_SendByte_A(address | (RW?1:0));

这个不会错 我把读位空出来了
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 10:30:29 | 显示全部楼层
还不如直接的宏定义下读,写地址,简单,易懂,完全不用搞变量来定义,还要运算。你这样子写程序,基本上就自己看了。光看你的两个应答程序是没问题。其它的就不好说
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 10:38:54 | 显示全部楼层
hgr211 发表于 2016-6-24 10:30
还不如直接的宏定义下读,写地址,简单,易懂,完全不用搞变量来定义,还要运算。你这样子写程序,基本上就 ...

不是我写的 是单位的代码我来改啊 现在就是无应答不知道为什么
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2016-6-24 10:56:39 | 显示全部楼层
copy下原子的iic程序,改下io,就可以测试下行不行,这种,也许你硬件有问题,不好说。我也是在学stm32,ucosiii,刚跑起来,正在调试iic
回复

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-6-23
在线时间
5 小时
 楼主| 发表于 2016-6-24 11:34:18 | 显示全部楼层
现在就是地址问题
send_i2c_byte(0b10100001);      // Send Slave Adress+Read-Bit; wait for slave ACK-Bit
用这个0XA1了 还是没响应

回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
发表于 2016-6-24 11:42:43 | 显示全部楼层

很多人害怕用示波器。


回复

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-7-26
在线时间
31 小时
发表于 2016-7-21 16:57:34 | 显示全部楼层
能说下是什么问题吗?
怎么解决的?
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2016-10-14
在线时间
6 小时
发表于 2016-11-1 10:14:44 | 显示全部楼层
麻烦请问一下有SM9541传感器的资料吗?有的话能发我一下吗?
邮箱987318582@qq.com
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2019-5-8
在线时间
21 小时
发表于 2020-4-25 10:05:18 | 显示全部楼层
麻烦问下,你这边问题解决 了吗,我现在也是碰到没应答,能给点指导吗
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-5-14
在线时间
9 小时
发表于 2020-4-30 15:40:15 | 显示全部楼层
我今天也遇到了,不过解决了,不能用正点原子的那个IIC程序直接用。一开始我也用那个,死活不行,后来找代理商要了程序再改的
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-9-25
在线时间
0 小时
发表于 2020-9-25 20:10:29 | 显示全部楼层
cat151016 发表于 2020-4-30 15:40
我今天也遇到了,不过解决了,不能用正点原子的那个IIC程序直接用。一开始我也用那个,死活不行,后来找代 ...

大哥 我看您评论用了SM9541 我这边怎么也都是无应答 能把您程序发给我吗 邮箱 1491370322@qq.com 感谢您
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-9-25
在线时间
0 小时
发表于 2020-9-25 20:13:56 | 显示全部楼层
over8820 发表于 2020-4-25 10:05
麻烦问下,你这边问题解决 了吗,我现在也是碰到没应答,能给点指导吗

哥 你的SM9541的问题解决了  我怎么试都没反应 能把程序发给我看看吗  邮箱1491370322@qq.com
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-9-25
在线时间
0 小时
发表于 2020-9-25 20:18:32 | 显示全部楼层
fjl 发表于 2016-6-24 09:03
改好了 谢谢大家

哥 能把你SM9541的程序发给我看看嘛 我怎么搞都没反应 可以的话发邮箱1491370322@qq.com 谢谢您
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 04:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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