添加硬件I2C
This commit is contained in:
parent
b458a57577
commit
14174ffa94
|
@ -2230,6 +2230,12 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
|
||||
</file>
|
||||
|
|
|
@ -2901,6 +2901,12 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_adc.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_i2c.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_i2c.h</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\drivers\drv_usart.c</name>
|
||||
</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_ADDRESS:SD2068器件代码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);
|
||||
}
|
|
@ -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
|
|
@ -17,6 +17,9 @@
|
|||
|
||||
#define MB85RC64_ADDRESS_WRITE 0xA0
|
||||
#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_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_GET gpio_input_bit_get(GPIOB, GPIO_PIN_7)
|
||||
|
||||
//mb85rc64湔揣華硊
|
||||
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
|
||||
|
||||
void mb85rc64_gpio_init();
|
||||
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len);
|
||||
|
|
|
@ -207,6 +207,7 @@ static void master_noack()
|
|||
TMP75_SCL_LOW;
|
||||
delay_us(5);
|
||||
}
|
||||
|
||||
/*
|
||||
@ brief ¶ÁȡζÈÖµ
|
||||
@ param
|
||||
|
@ -239,6 +240,7 @@ float tmp75_read_temp(void)
|
|||
tempL = tmp75_read_byte();
|
||||
master_noack();
|
||||
i2c_stop();
|
||||
|
||||
tempCode = (tempH << 8) | tempL;
|
||||
tempCode = tempCode >> 6;
|
||||
if (tempCode & 0x200) // ¸ºÎ¶È
|
||||
|
|
Loading…
Reference in New Issue