添加硬件I2C

This commit is contained in:
DESKTOP-2E6P1Q6\Administrator 2025-09-24 17:50:50 +08:00
parent b458a57577
commit 14174ffa94
6 changed files with 179 additions and 2 deletions

View File

@ -2230,6 +2230,12 @@
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name> <name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name> <name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
</file> </file>

View File

@ -2901,6 +2901,12 @@
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name> <name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name> <name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
</file> </file>

121
drivers/drv_i2c.c Normal file
View File

@ -0,0 +1,121 @@
/*************************************************
Copyright (c) 2025,
All rights reserved.
@file drv_i2c.C
@brief drv_i2c驱动程序
@details
@note
@author dufresne
@date 2025/09/24
@version v1.0 2025/09/24
*************************************************/
#include "drv_i2c.h"
#include "rtthread.h"
#include <core_cm4.h>
/*
@ brief
@ param
@ return
@ note 2025-09-15
*/
static void delay_us(int us)
{
rt_thread_udelay(us);
}
void i2c_init(void)
{
i2c_gpio_config();
i2c_config();
}
/*
@ brief tmp75芯片GPIO引脚
@ param
@ return
@ note 2025-09-15
*/
void i2c_gpio_config(void)
{
// 配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOB);
gpio_af_set(GPIOB, GPIO_AF_4, I2C_SCL_PIN | I2C_SDA_PIN);
/* 初始化GPIO复用功能模式 */
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, I2C_SCL_PIN | I2C_SDA_PIN);
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN);
}
void i2c_config(void)
{
// 启用 I2C 外设的时钟
rcu_periph_clock_enable(RCU_I2C0);
// 配置 I2C 的时钟参数:
// I2C_PERIPH这里使用的I2C1
// I2C_SPEED通信速率单位为 Hz常用为 100000 或 400000这里使用100000
i2c_clock_config(I2C_PERIPH, I2C_SPEED, I2C_DTCY_2);
// 配置 I2C 工作模式和地址:
// I2C_ADDFORMAT_7BITS使用 7 位地址模式
// I2C_BUS_ADDRESSSD2068器件代码0110010 = 0x32
i2c_mode_addr_config(I2C_PERIPH, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_BUS_ADDRESS);
// 启用 I2C 外设
i2c_enable(I2C_PERIPH);
// 使能 ACK 应答功能,确保在接收数据后自动发送 ACK
i2c_ack_config(I2C_PERIPH, I2C_ACK_ENABLE);
}
/*
@ brief
@ param
@ return
@ note 2025-09-15
*/
float tmp75_read_temp(void)
{
uint8_t tempH = 0;
uint8_t tempL = 0;
uint16_t tempCode = 0;
float temp = 0;
// 起始信号
i2c_start();
// 写tmp75地址
tmp75_write_byte(TMP75_ADDRESS);
// 接收tmp75的ack信息
tmp75_ack();
// 发送需读取数据的地址
tmp75_write_byte(TEMP_REGISTER_ADDRESS);
tmp75_ack();
i2c_start();
// 写tmp75地址
tmp75_write_byte(TMP75_ADDRESS + 1); // 读地址数据
tmp75_ack();
tempH = tmp75_read_byte();
master_ack();
tempL = tmp75_read_byte();
master_noack();
i2c_stop();
tempCode = (tempH << 8) | tempL;
tempCode = tempCode >> 6;
if (tempCode & 0x200) // 负温度
{
tempCode &= 0x1ff;
temp = ((float)tempCode - 512) / 4;
}
else
{
temp = (float)tempCode / 4;
}
TMP75_SDA_LOW;
TMP75_SCL_LOW;
return (temp);
}

41
drivers/drv_i2c.h Normal file
View File

@ -0,0 +1,41 @@
///Copyright (c) 2022, 四川汇源光通信有限公司
///All rights reserved.
///@file drv_i2c.h
///@brief drv_i2c驱动程序
///
///@details
///@note
///@author dufresne
///@date 2025/09/24
///
///@version v1.0 2025/09/24 初始版本
#ifndef DRV_I2C_H
#define DRV_I2C_H
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_i2c.h"
#define I2C_PERIPH I2C0
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_SPEED 100000
// #define I2C_SCL_HIGH gpio_bit_set(GPIOB, I2C_SCL_PIN)
// #define I2C_SCL_LOW gpio_bit_reset(GPIOB, I2C_SCL_PIN)
// #define I2C_SDA_HIGH gpio_bit_set(GPIOB, I2C_SDA_PIN)
// #define I2C_SDA_LOW gpio_bit_reset(GPIOB, I2C_SDA_PIN)
// #define I2C_SDA_GET gpio_input_bit_get(GPIOB, I2C_SDA_PIN)
void i2c_init(void);
void i2c_gpio_config(void);
void i2c_config(void);
void temp75_gpio_init();
float tmp75_read_temp(void);
#endif

View File

@ -17,6 +17,9 @@
#define MB85RC64_ADDRESS_WRITE 0xA0 #define MB85RC64_ADDRESS_WRITE 0xA0
#define MB85RC64_ADDRESS_READ 0xA1 #define MB85RC64_ADDRESS_READ 0xA1
//mb85rc64湔揣華硊
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
#define MB85RC64_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6) #define MB85RC64_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6)
#define MB85RC64_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6) #define MB85RC64_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6)
@ -25,8 +28,6 @@
#define MB85RC64_SDA_LOW gpio_bit_reset(GPIOB, GPIO_PIN_7) #define MB85RC64_SDA_LOW gpio_bit_reset(GPIOB, GPIO_PIN_7)
#define MB85RC64_SDA_GET gpio_input_bit_get(GPIOB, GPIO_PIN_7) #define MB85RC64_SDA_GET gpio_input_bit_get(GPIOB, GPIO_PIN_7)
//mb85rc64湔揣華硊
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
void mb85rc64_gpio_init(); void mb85rc64_gpio_init();
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len); char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len);

View File

@ -207,6 +207,7 @@ static void master_noack()
TMP75_SCL_LOW; TMP75_SCL_LOW;
delay_us(5); delay_us(5);
} }
/* /*
@ brief ÁÈ¡ÎÂÈÖµ @ brief ÁÈ¡ÎÂÈÖµ
@ param @ param
@ -239,6 +240,7 @@ float tmp75_read_temp(void)
tempL = tmp75_read_byte(); tempL = tmp75_read_byte();
master_noack(); master_noack();
i2c_stop(); i2c_stop();
tempCode = (tempH << 8) | tempL; tempCode = (tempH << 8) | tempL;
tempCode = tempCode >> 6; tempCode = tempCode >> 6;
if (tempCode & 0x200) // ¸ºÎÂ¶È if (tempCode & 0x200) // ¸ºÎ¶È