OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 1363|回复: 9

SM5852微压传感器 ,IIC写器件地址时得不到应答是怎么回事呀?

[复制链接]

  离线 

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-20
在线时间
1 小时
发表于 2015-11-10 16:33:30 | 显示全部楼层 |阅读模式
5金钱
[C] 纯文本查看 复制代码
#include \"SM5852.h\"

unsigned char test1;


/*****************************************************************************
//函 数: IICDelay
//功 能: 本文件内的延时程序调用
*****************************************************************************/
void IICDelay(volatile unsigned char DelayCount)
{
    while(DelayCount --)
    {
      ;     //CLEARDOG;
    }

}

/*****************************************************************************
//函 数: I2C_Start
//功 能: IIC驱动程序之起始位
*****************************************************************************/
void I2C_Start(void)
{
	Sensor_SDA_OUT;
	Sensor_SDA = 1;
	Sensor_SCL = 1;
	IICDelay(5);
	Sensor_SDA = 0;
	IICDelay(5);
	Sensor_SCL = 0;
}

/*****************************************************************************
//函 数: I2C_Stop
//功 能: IIC驱动程序之停止位
*****************************************************************************/
void I2C_Stop(void)
{
    Sensor_SDA_OUT;
	Sensor_SCL = 0; 
	Sensor_SDA = 0; 
	IICDelay(5); 
	Sensor_SCL = 1;
	IICDelay(5);  
	Sensor_SDA = 1;
	IICDelay(5);
}

/*****************************************************************************
//函 数: I2C_WaitACK
//功 能: IIC驱动程序之等待ACK
*****************************************************************************/
void I2C_WaitACK(void)
{
	unsigned char errtime;
	errtime = 40;
    Sensor_SDA_OUT;
    Sensor_SDA = 1;
    IICDelay(10);	//读ACK
    Sensor_SCL = 1;
	IICDelay(10);	
	Sensor_SDA_IN;
	while(Sensor_SDA)
	{
        errtime --;
        if(!errtime)
        {
            I2C_Stop();
            test1 = 4;
            break;
        }
	}
    Sensor_SCL = 0;
    Sensor_SDA_OUT;
    IICDelay(5);
}

/*****************************************************************************
//函 数: I2C_SndAck
//功 能: IIC驱动程序之主机发送应答
*****************************************************************************/
void I2C_SndAck(void)
{ 
    Sensor_SDA_OUT;
	Sensor_SDA = 0;
	IICDelay(5);
	Sensor_SCL = 1;
	IICDelay(5);
	Sensor_SCL = 0;
}

/*****************************************************************************
//函 数: I2C_SndNoAck
//功 能: IIC驱动程序之主机发送非应答
*****************************************************************************/
void I2C_SndNoAck(void)
{ 
	Sensor_SDA_OUT;
	Sensor_SDA=1;
	IICDelay(5);
	Sensor_SCL=1;
	IICDelay(5);
	Sensor_SCL=0; 
}

/*****************************************************************************
//函 数: I2C_WriteByte
//功 能: IIC写字节 
*****************************************************************************/
void I2C_WriteByte(unsigned char data)
{
	unsigned char i;
	Sensor_SDA_OUT; 
	for(i = 0; i < 8; i++)//以最高为传输数据
    {
        if(data & 0x80)
        {
            Sensor_SDA = 1;
        }
        else
        {
            Sensor_SDA = 0;
        }
        data <<= 1;
        Sensor_SCL = 1;
        IICDelay(5);
        Sensor_SCL = 0;
    }
	I2C_WaitACK();   //如果通讯错误,将不能接收到ack 
}

/*****************************************************************************
//函 数: I2C_ReadByte
//功 能: IIC读字节 
*****************************************************************************/
unsigned char I2C_ReadByte(void)
{
	unsigned char i,bytedata; 
	Sensor_SDA_IN;
	for(i = 0; i < 8; i++)//以最高为传输数据
    {
		Sensor_SCL = 1;
        bytedata <<= 1;
        bytedata |= Sensor_SDA;
        Sensor_SCL = 0;
        IICDelay(5);
	}
	Sensor_SDA_OUT;
	return(bytedata);
}
/*****************************************************************************
//函 数: InitSensor
//功 能: 初始化传感器
*****************************************************************************/
void InitSensor(void)
{
	Sensor_SCL_OUT;   //传感器时钟线 
	Sensor_SCL = 1;   //传感器时钟线
	
	Sensor_SDA_OUT;   //传感器数据线 
	Sensor_SDA = 1;   //传感器数据线
} 

/*****************************************************************************
//函 数: Sensor_ReadOneByte
//功 能: 从片内指定地址读一个字节数据
*****************************************************************************/
unsigned char Sensor_ReadOneByte(unsigned char RegAddr)
{
	unsigned char mdata;
    I2C_Start();
    I2C_WriteByte(ADDRESS_SM5852_WR);
	I2C_WriteByte(RegAddr);
	I2C_Start();
    I2C_WriteByte(ADDRESS_SM5852_RE);
    mdata = I2C_ReadByte();
    I2C_SndNoAck();
    I2C_Stop(); //停止I2C
    IICDelay(100);//此处延时根据实际情况,如果不延时,可能会不正常
    return(mdata);
}

/*****************************************************************************
//函 数: Sensor_ReadMultiByte
//功 能: 从片内指定地址读出多个字节的数据
*****************************************************************************/
void Sensor_ReadMultiByte(unsigned char ucStartAddress,volatile unsigned char *datebuffer,unsigned char ucByteCounter)
{
    I2C_Start();
    I2C_WriteByte(ADDRESS_SM5852_WR);
    I2C_WriteByte(ucStartAddress);
    I2C_Start();
    I2C_WriteByte(ADDRESS_SM5852_RE);
    while(-- ucByteCounter)
    {
        *datebuffer ++= I2C_ReadByte();
        I2C_SndAck();
    }
    *datebuffer = I2C_ReadByte();
    I2C_SndNoAck();
    I2C_Stop();
    IICDelay(200);//此处延时根据实际情况,如果不延时,可能会不正常
}

回复

使用道具 举报

  离线 

14

主题

1568

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2481
金钱
2481
注册时间
2014-7-17
在线时间
326 小时
发表于 2015-11-10 22:32:39 | 显示全部楼层
帮顶!!!!
回复

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128283
金钱
128283
注册时间
2010-12-1
在线时间
1134 小时
发表于 2015-11-10 23:05:02 | 显示全部楼层
慢慢调试...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

  离线 

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-6-5
在线时间
1 小时
发表于 2016-11-2 10:37:32 | 显示全部楼层
你写的地址是多少?
加油!
回复

使用道具 举报

  离线 

8

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2014-7-4
在线时间
5 小时
发表于 2016-12-21 16:27:07 | 显示全部楼层
正点原子公众号
你好    你手里有SM5852的IIC手册吗  要是有我可以帮忙看看的
呵呵
回复

使用道具 举报

  离线 

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-4-13
在线时间
12 小时
发表于 2017-6-30 14:56:09 | 显示全部楼层
qujian55 发表于 2016-11-2 10:37
你写的地址是多少?

你好,你的IIC从机地址找到了吗,是多少?求告知
回复

使用道具 举报

  离线 

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-4-13
在线时间
12 小时
发表于 2017-6-30 14:58:24 | 显示全部楼层

你好,请问这个传感器挂在IIC上时,地址是多少?
回复

使用道具 举报

  离线 

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-4-13
在线时间
12 小时
发表于 2017-7-4 11:30:14 | 显示全部楼层
我把0-255都试了一下,没一个能得到应答的。。。
回复

使用道具 举报

  离线 

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-20
在线时间
1 小时
 楼主| 发表于 2017-7-20 14:20:08 | 显示全部楼层
调试OK,是配置的问题
回复

使用道具 举报

  离线 

2

主题

67

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-9-1
在线时间
31 小时
发表于 2018-2-5 10:30:04 | 显示全部楼层
地址95
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-6-23 16:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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