基于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