添加硬件I2C
This commit is contained in:
parent
b458a57577
commit
14174ffa94
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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_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);
|
||||||
|
|
|
@ -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) // ¸ºÎ¶È
|
||||||
|
|
Loading…
Reference in New Issue