基于STM32的软件IIC实现TC74温度采集

芯片地址


根据芯片的订货号,查看对应的地址。

拷贝标准的IIC程序


 #include "TC74.h"                  // Device header
#include "stm32g0xx_hal.h"
#include "config.h" 
#include "globalvariable.h" 
#include "SEGGER_RTT.h"  

void MyI2C_W_SCL(uint8_t BitValue)
{
  
HAL_GPIO_WritePin(GPIOC,IIC_SCL1_Pin,(GPIO_PinState) BitValue); 
    delay_us(10);
}

void MyI2C_W_SDA(uint8_t BitValue)
{
	HAL_GPIO_WritePin(GPIOC,IIC_SDA1_Pin,(GPIO_PinState) BitValue);  
    delay_us(10);
}

/***********************************************************
*@fuction	:MyI2C_R_SDA
*@brief		:?SDA????
*@param		:--
*@return	:void
*@author	:--
*@date		:2023-07-24
***********************************************************/

uint8_t MyI2C_R_SDA(void)
{
    uint8_t BitValue;
		BitValue = HAL_GPIO_ReadPin(GPIOC,IIC_SDA1_Pin); 
	
    delay_us(10);
    return BitValue;
}

/***********************************************************
*@fuction	:MyI2C_Init
*@brief		:???
*@param		:--
*@return	:void
*@author	:--
*@date		:2023-07-24
***********************************************************/

void MyI2C_Init(void)
{
    //在单独的初始化程序里面初始化了
}

/***********************************************************
*@fuction	:MyI2C_Start
*@brief		:????
*@param		:--
*@return	:void
*@author	:--??SCL?SDA???:??1;???SDA;???SCL:?????????????
*@date		:2023-07-24
***********************************************************/

void MyI2C_Start(void)
{
    MyI2C_W_SDA(1);
    MyI2C_W_SCL(1);
    MyI2C_W_SDA(0);		//???SDA
    MyI2C_W_SCL(0);		//???SCL
}

/***********************************************************
*@fuction	:MyI2C_Stop
*@brief		:????
*@param		:--
*@return	:void
*@author	:--:???SDA;???SCL;???SDA
*@date		:2023-07-24
***********************************************************/

void MyI2C_Stop(void)
{
    MyI2C_W_SDA(0);
    MyI2C_W_SCL(1);
    MyI2C_W_SDA(1);
}

/***********************************************************
*@fuction	:MyI2C_SendByte
*@brief		:??????
*@param		:--
*@return	:void
*@author	:--
*@date		:2023-07-24
***********************************************************/

void MyI2C_SendByte(uint8_t Byte)
{
    uint8_t i;
    for (i = 0; i < 8; i ++)	//??8?
    {
        MyI2C_W_SDA(Byte & (0x80 >> i));//???Byte????xxxx xxxx & 1000 0000 = x000 0000 = 0x80(1) | 0x00(0)
        MyI2C_W_SCL(1);		
        MyI2C_W_SCL(0);
    }
}

/***********************************************************
*@fuction	:MyI2C_ReceiveByte
*@brief		:??????
*@param		:--
*@return	:uint8_t Byte
*@author	:--
*@date		:2023-07-24
***********************************************************/

uint8_t MyI2C_ReceiveByte(void)
{
    uint8_t i, Byte = 0x00;
    MyI2C_W_SDA(1);	//????SDA//???????SDA
    for (i = 0; i < 8; i ++)	//??8?
    {
        MyI2C_W_SCL(1);		//?????
	 
        if (MyI2C_R_SDA() == 1)//??SDA????????
        {
            Byte |= (0x80 >> i);//??????,??????Byte,???????????(Byte????????)
				 
        }
        MyI2C_W_SCL(0);		//??SCL,??????
			 
    }
    return Byte;
}

/***********************************************************
*@fuction	:MyI2C_SendAck
*@brief		:????????
*@param		:--
*@return	:void
*@author	:--
*@date		:2023-07-24
***********************************************************/

void MyI2C_SendAck(uint8_t AckBit)
{
    MyI2C_W_SDA(AckBit);//????????SDA?
    MyI2C_W_SCL(1);//??SCL,????
    MyI2C_W_SCL(0);//??SCL,?????????
}

/***********************************************************
*@fuction	:MyI2C_ReceiveAck
*@brief		:????
*@param		:--
*@return	:uint8_t AckBit
*@author	:--
*@date		:2023-07-24
***********************************************************/

uint8_t MyI2C_ReceiveAck(void)
{
    uint8_t AckBit;
    MyI2C_W_SDA(1);		//????SDA
    MyI2C_W_SCL(1);		//??SCL,??SDA??
    AckBit = MyI2C_R_SDA();//??????AckBit?
    MyI2C_W_SCL(0);		//??SCL,?????????
    return AckBit;
}

uint8_t Read_TC74(void)
{
					MyI2C_Start();
					MyI2C_SendByte(0x96);	// address 96
					MyI2C_ReceiveAck();					 
				  MyI2C_SendByte(0x00);			// 
					MyI2C_ReceiveAck();					// 
				  MyI2C_Stop();	
			    MyI2C_Start();
					MyI2C_SendByte(0x97);				//READ
			 		MyI2C_ReceiveAck();		 
					T74_temperature = MyI2C_ReceiveByte();		
					MyI2C_SendAck(1);					 
					MyI2C_Stop();					 
				 
}

TC74.h

#include "config.h"

//  
#ifndef	TC74IF_H
#define	TC74IF_H
#include "stdint.h"
void MyI2C_Init(void);
void MyI2C_Start(void);
void MyI2C_Stop(void);
void MyI2C_SendByte(uint8_t Byte);
uint8_t MyI2C_ReceiveByte(void);
void MyI2C_SendAck(uint8_t AckBit);
uint8_t MyI2C_ReceiveAck(void);
uint8_t Read_TC74(void);

#endif 

主程序调用

Read_TC74();

读取的温度数据

*强调文本* _强调文本_

IIC的逻辑分析仪显示

** 。
代码摘录自:https://blog.csdn.net/qq_67808371/article/details/134191809

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值