系列文章目录
新建工程及点亮LED
文章目录
- 系列文章目录
- 前言
- 一、IIC操作
- 1.延时要求
- 2.开始条件:SCL 为高电平时,主机将SDA 拉低,表示数据传输即将开始。
- 3.停止条件:在SDA 为低电平时,主机将SCL 拉高并保持高电平,然后在将SDA 拉高,表示传输结束。
- 4.等待应答:SDA设置为输入,SCL输出高,然后等待STS30将SDA拉低如果超时未拉低则返回错误信号。SDA被STS30拉低后设置为输出模式为后续操作做准备,最后再把SCL输出第;
- 5.发送应答:SDA输出低,SCL输出由高变低;
- 6.发送非应答:SDA输出高,SCL输出由高变低;
- 7.发送一个字节数据:先发送高位再发送低位;
- 8.接收一个字节数据:先接收数据高位;
- 二、读取温度值
- 总结
前言
STS30:±0.2°C数字温度传感器 (0-65°C)
STS30:用的是IIC接口,这里为了方便直接用官方给的模拟IIC。
一、IIC操作
1.延时要求
操作的延时必须要再STS30的允许范围
2.开始条件:SCL 为高电平时,主机将SDA 拉低,表示数据传输即将开始。
void I2CStart2(void)
{
SDA_Output2(1);//SDA输出高电平
delay1(DELAY_TIME);//每个操作延时一段时间
SCL_Output2(1);//SCL输出高电平
delay1(DELAY_TIME);
SDA_Output2(0);//SDA输出低电平
delay1(DELAY_TIME);
SCL_Output2(0);//SCL输出高电平
delay1(DELAY_TIME);
}
3.停止条件:在SDA 为低电平时,主机将SCL 拉高并保持高电平,然后在将SDA 拉高,表示传输结束。
void I2CStop2(void)
{
SCL_Output2(0);//先将数据和时钟都拉低然后时钟拉高,数据拉高
delay1(DELAY_TIME);
SDA_Output2(0);
delay1(DELAY_TIME);
SCL_Output2(1);
delay1(DELAY_TIME);
SDA_Output2(1);
delay1(DELAY_TIME);
}
4.等待应答:SDA设置为输入,SCL输出高,然后等待STS30将SDA拉低如果超时未拉低则返回错误信号。SDA被STS30拉低后设置为输出模式为后续操作做准备,最后再把SCL输出第;
unsigned char I2CWaitAck2(void)
{
unsigned short cErrTime = 5;
SDA_Input_Mode2();//设置为输入模式
delay1(DELAY_TIME);
SCL_Output2(1);
delay1(DELAY_TIME);
while(SDA_Input2())
{
cErrTime--;
delay1(DELAY_TIME);
if (0 == cErrTime)
{
SDA_Output_Mode2();
I2CStop2();
return ERROR;
}
}
SDA_Output_Mode2();//设置为输出模式
SCL_Output2(0);
delay1(DELAY_TIME);
return SUCCESS;
}
5.发送应答:SDA输出低,SCL输出由高变低;
void I2CSendAck2(void)
{
SDA_Output2(0);
delay1(DELAY_TIME);
delay1(DELAY_TIME);
SCL_Output2(1);
delay1(DELAY_TIME);
SCL_Output2(0);
delay1(DELAY_TIME);
}
6.发送非应答:SDA输出高,SCL输出由高变低;
void I2CSendAck2(void)
{
SDA_Output2(0);
delay1(DELAY_TIME);
delay1(DELAY_TIME);
SCL_Output2(1);
delay1(DELAY_TIME);
SCL_Output2(0);
delay1(DELAY_TIME);
}
7.发送一个字节数据:先发送高位再发送低位;
void I2CSendByte2(unsigned char cSendByte)
{
unsigned char i = 8;
while (i--)//循环发送8个位
{
SCL_Output2(0); //SCL输出低电平
delay1(DELAY_TIME);
SDA_Output2(cSendByte & 0x80);//SDA发送高位数据
delay1(DELAY_TIME);
cSendByte += cSendByte;//每次循环,数据与自己相加相当于左移一位
delay1(DELAY_TIME);
SCL_Output2(1);//SCL输出高电平
delay1(DELAY_TIME);
}
SCL_Output2(0);//SCL输出低电平
delay1(DELAY_TIME);
}
8.接收一个字节数据:先接收数据高位;
unsigned char I2CReceiveByte2(void)
{
unsigned char i = 8;
unsigned char cR_Byte = 0;
SDA_Input_Mode2();
while (i--)//循环8次接收数据
{
cR_Byte += cR_Byte;//左移一位
SCL_Output2(0);
delay1(DELAY_TIME);
delay1(DELAY_TIME);
SCL_Output2(1);
delay1(DELAY_TIME);
cR_Byte |= SDA_Input2();//接收数据
}
SCL_Output2(0);
delay1(DELAY_TIME);
SDA_Output_Mode2();
return cR_Byte;//返回数据
}
二、读取温度值
STS30地址由引脚二决定这里引脚为低所以芯片地址为0X4A
float Get_Temperature(void)
{
uint8_t H_VALUE, L_VALUE, CRC_VALUE;
uint16_t T_VALUE; //转换完成的数字值
float temperature;//转换完成的温度值
I2CStart2();//发送开始信号
I2CSendByte2(0x4A << 1);//0表示写1表示读,这里最低位为0,0X4A为STS30地址
I2CWaitAck2();
I2CSendByte2(0x24);//不使能时钟伸缩
I2CWaitAck2();
I2CSendByte2(0x0b);//中重复性测量精度
I2CWaitAck2();
I2CStop2();
LL_mDelay(2);//scl free,最小为1ms
I2CStart2();
I2CSendByte2(0x4A << 1 | 1);//读操作
I2CWaitAck2();
I2CStop2();
LL_mDelay(2);//scl free,最小为1ms
I2CStart2();
I2CSendByte2(0x4A << 1 | 1);
I2CWaitAck2();
H_VALUE = I2CReceiveByte2();//读取数据高位
I2CSendAck2();
L_VALUE = I2CReceiveByte2();//读取数据低位
I2CSendAck2();
CRC_VALUE = I2CReceiveByte2();//获取校验
I2CSendNotAck2();
I2CStop2();
if (CRC_VALUE)
{
;
}
T_VALUE = H_VALUE << 8 | L_VALUE;//整个数据
temperature = -45 + 175.0 * T_VALUE / 65535;//这个公式在数据手册这里选择摄氏度
return (temperature);
}
总结
例如:把官方给的IIC驱动移植到自己建的工程里,然后记住温度获取函数Get_Temperature如何实现。需要获取温度是的时候直接调用Get_Temperature就可以了,就是不知道官方会不会给TST30传感器的驱动哈哈哈哈哈。写的不好献丑啦。