2023/10/22 SD5075驱动

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>&copy; 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****/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值