c文件
#include "sd5075.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define SD5075_CLK LL_AHB1_GRP1_PERIPH_GPIOB
#define SD5075_SCL_GPIO_Port GPIOB
#define SD5075_SCL_Pin LL_GPIO_PIN_8
#define SD5075_SDA_GPIO_Port GPIOB
#define SD5075_SDA_Pin LL_GPIO_PIN_9
#define SCL_L LL_GPIO_ResetOutputPin(SD5075_SCL_GPIO_Port,SD5075_SCL_Pin)
#define SCL_H LL_GPIO_SetOutputPin(SD5075_SCL_GPIO_Port,SD5075_SCL_Pin)
#define SDA_L LL_GPIO_ResetOutputPin(SD5075_SDA_GPIO_Port,SD5075_SDA_Pin)
#define SDA_H LL_GPIO_SetOutputPin(SD5075_SDA_GPIO_Port, SD5075_SDA_Pin)
#define SDA_IN LL_GPIO_SetPinMode(SD5075_SDA_GPIO_Port,SD5075_SDA_Pin,LL_GPIO_MODE_INPUT)
#define SDA_OUT LL_GPIO_SetPinMode(SD5075_SDA_GPIO_Port,SD5075_SDA_Pin,LL_GPIO_MODE_OUTPUT)
/*开漏 无需切换输入输出*/
//#define SDA_IN {;}
//#define SDA_OUT {;}
#define SDA_READ (uint8_t)(LL_GPIO_IsInputPinSet(SD5075_SDA_GPIO_Port,SD5075_SDA_Pin))
float tempreture[10] = {0};
void sa5075_config(void)
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_AHB1_GRP1_EnableClock(SD5075_CLK);
/*scl*/
GPIO_InitStruct.Pin = SD5075_SCL_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
LL_GPIO_Init(SD5075_SCL_GPIO_Port,&GPIO_InitStruct);
/*sda*/
GPIO_InitStruct.Pin = SD5075_SDA_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
LL_GPIO_Init(SD5075_SDA_GPIO_Port,&GPIO_InitStruct);
SCL_H;
SDA_H;
}
__IO int8_t sd5075delay = 2;
/***********************iic**************************/
void delay_nop(void)
{
unsigned int i;
for(i=0;i<sd5075delay;i++)
__ASM("nop");
}
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT;//sda线输出
SDA_H;
SCL_H;
delay_nop();
SDA_L;//START:when CLK is high,DATA change form high to low
delay_nop();
SCL_L;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_L;
SDA_OUT;//sda线输出
SCL_L;
delay_nop();
SCL_H;
delay_nop();
SDA_H;//发送I2C总线结束信号
delay_nop();
}
//等待应答信号到来
//返回值:
// 1,接收应答失败
// 0,接收应答成功
uint8_t IIC_Wait_Ack(void)
{
uint8_t flag;
SDA_IN; //SDA设置为输入
SDA_H;
delay_nop();
SCL_H;
delay_nop();
if(SDA_READ)
flag=1;
else
flag=0;
SCL_L; //时钟输出0
return flag;
}
//产生ACK应答
void IIC_Ack(void)
{
SCL_L;
SDA_OUT;
SDA_L;
delay_nop();
SCL_H;
delay_nop();
SCL_L;
}
//不产生ACK应答
void IIC_NAck(void)
{
SCL_L;
SDA_OUT;
SDA_H;
delay_nop();
SCL_H;
delay_nop();
SCL_L;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT;
SCL_L;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
SDA_H;
else SDA_L;
txd<<=1;
delay_nop();
SCL_H;
delay_nop();
SCL_L;
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t IIC_Read_Byte(uint8_t ack)
{
uint8_t i,receive=0;
SDA_IN;
for(i=0;i<8;i++ )
{
SCL_L;
delay_nop();
SCL_H;
delay_nop();
receive<<=1;
if(SDA_READ)
receive++;
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
double sa5075_temp_get(void)
{
uint16_t temp,i;
double tempre,sum;
IIC_Start();
IIC_Send_Byte(0x91);
IIC_Wait_Ack();
temp = IIC_Read_Byte(1);
temp <<= 8;
temp += IIC_Read_Byte(0);
IIC_Stop();
if((temp&0x8000)!=0)// -
{
tempre = ((temp>>4) - 4096.0)/16.0;
}
else
{
tempre = (temp>>4)/16.0;
}
sum = 0;
for(i=0;i<9;i++)
{
tempreture[i] = tempreture[i+1];
sum += tempreture[i+1];
}
tempreture[9] = tempre;
sum += tempre;
return sum/10.0;
}
头文件
/**
******************************************************************************
* File Name : SPI.h
* Description : This file provides code for the configuration
* of the SPI instances.
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __sa5075_H
#define __sa5075_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
double sa5075_temp_get(void);
void sa5075_config(void);
#ifdef __cplusplus
}
#endif
#endif /*__ spi_H */
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/