本帖最后由 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);
}
uint8_t Read_STTS751_Manualfacture_ID(void)
{
return (Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_MANUALID));
}
uint8_t Read_STTS751_Product_ID(void)
{
return (Get_Reg_STTS751(STTS751_ADDR, STTS751_REG_PRODUCT));
}
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) ![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
串口发送:
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());
send_str((uint8_t *)str);
sprintf(str,"P_ID:%d\r\n",Read_STTS751_Product_ID());
send_str((uint8_t *)str);
send_str((uint8_t *)"<------------END---------->\r\n");
}
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) ![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
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();
}
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) ![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
一些宏定义:
#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)
#define STTS751_ADDR 0x94U
![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) ![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)
上面就是完成STTS751读取的最主要的代码。
串口收到的数据,用手捏着传感器,温度变高:
下面展示一下成果:
读温度:
用手将STTS751传感器捏住,温度会上升:
整个接线的展示:
好了,下周开始完成其他部分的编写,时间所剩不多了.....
|