3019|0

282

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

GD32E231模拟IIC驱动STTS751 [复制链接]

  本帖最后由 hehung 于 2019-7-28 23:35 编辑

拿到这个板子已经有很长的时间了,但是前两周一直有事耽搁了,这周拿出来准备好好玩玩。

花费了大半天的时间下载,查看资料,还有很多资料是下载不了的,估计是需要科学上网才可以。

 

查看手册上填写到了需要用到一个配套的stm32的板子,但是我没有那种板子,而且使用的是硬件IIC,配套stm32的程序使用,没有stm32的板子很难使用,所以打算使用其他板子使用模拟IIC来实现。

 

最开始当然是使用最简单的STTS751开始下手了,这是一个温度芯片,通过查看原理图和芯片手册,在板子上找到了对应的芯片。如下图:

查看原理图:

 

从原理图上可以看出,这个芯片是连接到IIC总线的I2C1的,并且是2.5V供电,但是这个不用操心,后面有一个电压转换芯片,可以将输入电压Vio转换成2.5V。

 

在原理图上找到I2C1是连接到哪儿的?

 

找到了上图中的这个位置,现在可以通过板子上引出的IIC引脚进行连接。

PS:我最开始是连接到板子上的J的,但是发现通信不了,这个地方弄了我很多的时间,最开始以为是slave 的IIC地址不对,修改了很多还是不行,又以为是通信协议的问题,但是我的OLED也是IIC的就可以正常的通信,最后都快崩溃了,查看了原理图上写的接线帽接上之后可以与I2C2一起使用的呀?????。

最后我又在原理图上找到了一个I2C1的接口插上之后就可以正常的使用了,很奇怪,之后把OLED的IIC引脚换到了板子J2的IIC

接口上发现是可以正常的使用的????求高手解答

 

如上图,我使用的是图中的21,20这两个引脚,插上之后发现就可以正常的通信了。

 

查看手册:

这个芯片还支持一个叫做SMbus的通信协议,我听说过,我使用的是IIC。

有一个寄存器总结:

 

指出了STTS751所使用的所有寄存器地址和作用,其中最主要的几个寄存器是0x00, 0x02, 0xFE.

我在程序中就是用这几个。

0x00是读取温度的高位,

0x02是读取温度的低位。

0xfe是读取出厂的ID,可以用来识别这个芯片,同时也可以用来验证你的通信是不是正常的。

这几个寄存器不需要额外的操作,可以直接进行读取。

 

写程序:

首先是IIC程序,模拟IIC算是一种很简单的通信了,这里就不做过多的赘述了。

STTS751使用IIC写数据:

//STTS751写
static void IIC_WrDat_STTS751(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data)
{
	uint8_t succ, stime=0;
	
	IIC_Start();
	IIC_Send_Byte(IIC_Add);
	IIC_Wait_Ack();
	IIC_Send_Byte(IIC_Reg);			//write data
	IIC_Wait_Ack();
	IIC_Send_Byte(IIC_Data);
	IIC_Wait_Ack();
	IIC_Stop();
}

 

 

STTS751读数据:

//STTS751读
static uint8_t IIC_Read_STTS751(uint8_t IIC_Add, uint8_t IIC_Reg)
{
	char ret;
	uint8_t ret_suc = 1;
	
	IIC_Start();
	IIC_Send_Byte(IIC_Add & 0xfe);
	ret_suc = IIC_Wait_Ack();
	if(ret_suc == 1)
		return 1;			//失败

	IIC_Send_Byte(IIC_Reg);
	ret_suc = IIC_Wait_Ack();
	if(ret_suc == 1)
		return 1;			//失败
	
	IIC_Start();
	IIC_Send_Byte(IIC_Add | 0x01);
	ret_suc = IIC_Wait_Ack();
    ret=IIC_Read_Byte(1);
	IIC_Stop();
	
	return (uint8_t)ret;
}



 

 

设置寄存器,读寄存器:

//设置寄存器
void Set_Reg_STTS751(uint8_t add, uint8_t reg, uint8_t dat)
{
	IIC_WrDat_STTS751(add, reg, dat);
}

//读取寄存器
uint8_t Get_Reg_STTS751(uint8_t add, uint8_t reg)
{
	return IIC_Read_STTS751(add, reg);
}

 

 

读温度高字节,读温度低字节,读出厂ID,读产品ID:

//读取温度高字节
int Read_Temperature_H_STTS751(void)
{
	return Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_TEMPVH);	
}

//读取温度低字节
int Read_Temperature_L_STTS751(void)
{
	return Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_TEMPVL);
}

//获取Manualfacture ID
uint8_t	Read_STTS751_Manualfacture_ID(void)
{
	return (Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_MANUALID));
}

//获取产品ID
uint8_t	Read_STTS751_Product_ID(void)
{
	return (Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_PRODUCT));
}

 

串口发送:

//发送数据到串口
void Send_Uart_STTS751(void)
{	
	char str[35] = {0};
	
	send_str((uint8_t *)"<-----------START--------->\r\n");		
	sprintf(str,"Temp:%d.%d\r\n",Read_Temperature_H_STTS751(),Read_Temperature_L_STTS751());
	send_str((uint8_t *)str);				//发送温度	
	
	sprintf(str,"M_ID:%X\r\n",Read_STTS751_Manualfacture_ID());		//发送出厂ID
	send_str((uint8_t *)str);			
	
	sprintf(str,"P_ID:%d\r\n",Read_STTS751_Product_ID());			//发送产品ID
	send_str((uint8_t *)str);			
	send_str((uint8_t *)"<------------END---------->\r\n");			
}

 

OLED显示:

//显示数据到OLED
void OLED_Display_STTS751(void)
{
	char str_dis1[10], str_dis2[10];
	
	OLED_Clear();
	sprintf(str_dis1,"Temp:%d.%d\r\n",Read_Temperature_H_STTS751(),Read_Temperature_L_STTS751());
	sprintf(str_dis2,"ID  :%d\r\n",Read_STTS751_Manualfacture_ID());
	OLED_ShowString(0,16,(uint8_t *)str_dis1,16,1);
	OLED_ShowString(0,32,(uint8_t *)str_dis2,16,1);
	OLED_Refresh_Gram();
}

 

一些宏定义:

#define STTS751_REG_STATUS  	(0x01U)
#define STTS751_REG_CONFIG		(0x03U)
#define STTS751_REG_CONRAT		(0x04U)

#define STTS751_REG_TEMPVH		(0x00U)
#define STTS751_REG_TEMPVL		(0x02U)

#define STTS751_REG_TEMPHH		(0x05U)
#define STTS751_REG_TEMPHL		(0x06U)
#define STTS751_REG_TEMPLH		(0x07U)
#define STTS751_REG_TEMPLL		(0x08U)
#define STTS751_REG_ONESHOT		(0x0FU)
#define STTS751_REG_MANUALID	(0xFEU)
#define STTS751_REG_PRODUCT		(0xFDU)
	
/*IIC slave address*/
#define STTS751_ADDR			0x94U

 

上面就是完成STTS751读取的最主要的代码。

 

串口收到的数据,用手捏着传感器,温度变高:

 

 

下面展示一下成果:

读温度:

用手将STTS751传感器捏住,温度会上升:

 

整个接线的展示:

 

 

 

好了,下周开始完成其他部分的编写,时间所剩不多了.....

 

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表