硬件i2c完成

This commit is contained in:
DESKTOP-2E6P1Q6\Administrator 2025-09-26 18:17:39 +08:00
parent a39e0e99fb
commit fb8fdcc834
21 changed files with 350 additions and 318 deletions

13
.vscode/settings.json vendored
View File

@ -19,6 +19,17 @@
"gd32f4xx_i2c.h": "c",
"drv_i2c.h": "c",
"mb85rc64.h": "c",
"gd32f4xx_rcu.h": "c"
"gd32f4xx_rcu.h": "c",
"core_cminstr.h": "c",
"rtlibc.h": "c",
"libc_signal.h": "c",
"rtconfig.h": "c",
"rtdebug.h": "c",
"gd32f4xx_libopt.h": "c",
"delay.h": "c",
"gd32f4xx_enet.h": "c",
"beep.h": "c",
"gd32f4xx_exmc.h": "c",
"gd32f4xx_ipa.h": "c"
}
}

View File

@ -360,6 +360,7 @@
<state>C:\Users\Administrator\Documents\newPtz\drivers\mb85rc64</state>
<state>C:\Users\Administrator\Documents\newPtz\drivers\tmp75</state>
<state>C:\Users\Administrator\Documents\newPtz\drivers</state>
<state>C:\Users\Administrator\Documents\newPtz\drivers\beep</state>
</option>
<option>
<name>CCStdIncCheck</name>
@ -2200,6 +2201,15 @@
</group>
<group>
<name>drivers</name>
<group>
<name>beep</name>
<file>
<name>$PROJ_DIR$\..\drivers\beep\beep.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\beep\beep.h</name>
</file>
</group>
<group>
<name>mb85rc64</name>
<file>
@ -2219,10 +2229,10 @@
</file>
</group>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.c</name>
<name>$PROJ_DIR$\..\drivers\delay.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.h</name>
<name>$PROJ_DIR$\..\drivers\delay.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_adc.c</name>

View File

@ -2871,6 +2871,15 @@
</group>
<group>
<name>drivers</name>
<group>
<name>beep</name>
<file>
<name>$PROJ_DIR$\..\drivers\beep\beep.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\beep\beep.h</name>
</file>
</group>
<group>
<name>mb85rc64</name>
<file>
@ -2890,10 +2899,10 @@
</file>
</group>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.c</name>
<name>$PROJ_DIR$\..\drivers\delay.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\delay_us.h</name>
<name>$PROJ_DIR$\..\drivers\delay.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\drivers\drv_adc.c</name>

View File

@ -35,12 +35,12 @@ OF SUCH DAMAGE.
#include "gd32f4xx.h"
#include <stdio.h>
#include "rtthread.h"
#include "rtservice.h"
#include "delay.h"
#include "drv_adc.h"
#include "mb85rc64.h"
// #include "tmp75.h"
#include "drv_usart.h"
#include "drv_i2c.h"
#include "mb85rc64.h"
#include "drv_usart.h"
#include "beep.h"
float voltage;
@ -48,9 +48,6 @@ float current;
float current_origin;
char tiedian_id[3]={0};
uint32_t primask;
uint16_t tmp_value = 0;
extern uint16_t USER_ADC_DMA_DATA_BUFF;//bsp_adc.c中定义的ADC数据接收数组
@ -66,7 +63,7 @@ typedef struct _MB85TEST_
MB85TEST ttest;
#define MB85TEST_ADD 0x0400
#define MB85TEST_ADD 0x0400//自己随便设定的地址
/*!
\brief main function
@ -76,38 +73,35 @@ MB85TEST ttest;
*/
int main(void)
{
// RT-Thread 内核初始化等操作...
// 其他应用程序初始化代码...
// __enable_irq();
// gd32_usart_init();
//蜂鸣器初始化
beep_init();
i2c_init();
adc_init();
// temp75_gpio_init();
beep_enable();
//测试mb铁电读写
memset(&ttest, 0, sizeof(ttest));
#ifdef SOFTWARE_I2C
// mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
// ttest.status = 0;
// ttest.ttt++;
// if (ttest.ggg >= 1000)
// {
// ttest.ggg -= 2;
// ttest.ggg /= 3;
// }
// else
// {
// ttest.ggg += 2;
// ttest.ggg *= 3;
// }
mb85rc64_write_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest), ADDR_READ);
// mb85rc64_page_write(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
ttest.status = 0;
ttest.ttt++;
if (ttest.ggg >= 1000)
{
ttest.ggg -= 2;
ttest.ggg /= 3;
}
else
{
ttest.ggg += 2;
ttest.ggg *= 3;
}
mb85rc64_write_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest), PAGE_WRITE);
#endif
// 进入主循环或启动其他任务
while (1)
@ -120,18 +114,28 @@ int main(void)
current = ptz_Current_collect_adc1_task();
rt_thread_mdelay(500);
#endif
beep_disable();
#ifdef ADC_MODE_2
adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取
#endif
#ifdef SOFTWARE_I2C
//测试mb铁电读写
// read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID
read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID
memset(&ttest, 0, sizeof(ttest));
// mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
// memset(&ttest, 0, sizeof(ttest));
mb85rc64_write_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest), ADDR_READ);
#endif
ttest.tmperature = ptz_temperature_collect_tmp75_task();
if(ttest.tmperature >= 35)
{
beep_enable();
}
else
{
beep_disable();
}
// usart_puts(ttest.ttt);
// 主循环代码...
}

BIN
doc/MB85RC64.pdf Normal file

Binary file not shown.

30
drivers/beep/beep.c Normal file
View File

@ -0,0 +1,30 @@
////////////////////////////////////////////////////////////////////////////////
/// beep文件
///
/// 新增蜂鸣器模块、上电初始化时响、初始化完成后关闭
/// @file beep.c
/// @author lh
/// @date 2022-03-02
/// @version v0.1
////////////////////////////////////////////////////////////////////////////////
#include "beep.h"
#include "gd32f4xx_gpio.h"
//蜂鸣器初始化
void beep_init()
{
rcu_periph_clock_enable(RCU_GPIOE);
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, GPIO_PIN_6);
}
//蜂鸣器开
void beep_enable()
{
gpio_bit_set(GPIOE, GPIO_PIN_6);
}
//蜂鸣器关
void beep_disable()
{
gpio_bit_reset(GPIOE, GPIO_PIN_6);
}

8
drivers/beep/beep.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _BEEP_H_
#define _BEEP_H_
void beep_init();
void beep_enable();
void beep_disable();
#endif

25
drivers/delay.c Normal file
View File

@ -0,0 +1,25 @@
#include "delay.h"
/*
@ brief
@ param
@ return
@ note 2022-5-23
*/
void delay_us(int us)
{
uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do
{
now = SysTick->VAL;
delta = start > now ? start - now : reload + start - now;
} while (delta < us_tick * us);
}
void delay_ms(int ms)//封装了,不能直接替换,不知道为什么
{
rt_thread_mdelay(ms);
}

11
drivers/delay.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef DELAY_H
#define DELAY_H
#include "gd32f4xx.h"
#include "rtthread.h"
void delay_us(int us);
void delay_ms(int ms);
#endif

View File

@ -1,23 +0,0 @@
// #include "delay_us.h"
// #include "rtthread.h"
// #include <core_cm4.h>
// #include "gd32f4xx_gpio.h"
// /*
// @ brief 延时函数
// @ param
// @ return
// @ note 2022-5-23
// */
// static void delay_us(int us)
// {
// rt_uint32_t start, now, delta, reload, us_tick;
// start = SysTick->VAL;
// reload = SysTick->LOAD;
// us_tick = SystemCoreClock / 1000000UL;
// do
// {
// now = SysTick->VAL;
// delta = start > now ? start - now : reload + start - now;
// } while (delta < us_tick * us);
// }

View File

@ -1,8 +0,0 @@
// #ifndef __TMP75_H_
// #define __TMP75_H_
// static void delay_us(int us);
// #endif

View File

@ -302,12 +302,12 @@ float ptz_Current_collect_adc1_task()
/* 温度采集 */
float ptz_temperature_collect_tmp75_task()
{
#ifdef HARDWARE_I2C
uint8_t tempHL[2];
uint16_t tempCode = 0;
float temp = 0;
i2c_read(tempHL, 2);
// tmp75[tmp75_num] = tmp75_read_temp();
i2c_read(tempHL, 2, TMP75_ADDRESS);
tempCode = (tempHL[0] << 8) | tempHL[1];
tempCode = tempCode >> 6;
@ -322,8 +322,13 @@ float ptz_temperature_collect_tmp75_task()
}
tmp75[tmp75_num] = temp;
// tmp75[tmp75_num] = tmp75_read_temp();
#endif
#ifdef SOFTWARE_I2C
tmp75[tmp75_num] = tmp75_read_temp();
#endif
tmp75_num ++;
if(tmp75_num >= LB_T_TIMES)

View File

@ -1,16 +1,16 @@
#ifndef __DRV_ADC_H_
#define __DRV_ADC_H_
// #include "tmp75.h"
#include "tmp75.h"
#include "drv_i2c.h"
#include "stdlib.h"
#include "stdbool.h"
#include "string.h"
#include "gd32f4xx.h"
#include "gd32f4xx_adc.h"
#include "gd32f4xx_dma.h"
#include "delay.h"
#include "rtthread.h"
/* 自定义宏,方便修改通道和引脚 */
#define ADCX ADC1
#define VOLTAGE_ADC_CHANNEL ADC_CHANNEL_12
@ -28,6 +28,7 @@
#define ADC_MODE_0 //规则组、单次转换、非扫描
// #define ADC_MODE_1 //注入组、单次转换、扫描、转换结束标志位采集
// #define ADC_MODE_2 //注入组、单次转换、扫描、中断转换结束标志位采集
// #define ADC_MODE_3 //规则组、连续转换、扫描、DMA采集
/*

View File

@ -13,27 +13,19 @@ All rights reserved.
*************************************************/
#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();
#ifdef HARDWARE_I2C
i2c_config();
#endif
}
/*
@ brief tmp75芯片GPIO引脚
@ brief i2c的GPIO引脚
@ param
@ return
@ note 2025-09-15
@ -43,12 +35,23 @@ void i2c_gpio_config(void)
// 配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOB);
#ifdef HARDWARE_I2C
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);
#endif
#ifdef SOFTWARE_I2C
// 设置引脚为输出模式:PB6
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, I2C_SCL_PIN | I2C_SDA_PIN);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, I2C_SCL_PIN | I2C_SDA_PIN);
I2C_SCL_HIGH;
I2C_SDA_HIGH;
#endif
}
#ifdef HARDWARE_I2C
void i2c_config(void)
{
// 启用 I2C 外设的时钟
@ -64,7 +67,7 @@ void i2c_config(void)
// 配置 I2C 工作模式和地址:
// I2C_ADDFORMAT_7BITS使用 7 位地址模式
// I2C_BUS_ADDRESSSD2068器件代码0110010 = 0x32
i2c_mode_addr_config(I2C_PERIPH, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, TMP75_ADDRESS);
i2c_mode_addr_config(I2C_PERIPH, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, TMP75_ADDRESS << 1);
// 使能 ACK 应答功能,确保在接收数据后自动发送 ACK
@ -77,7 +80,7 @@ void i2c_config(void)
void i2c_write(uint8_t *buff, int len)
void i2c_write(uint8_t *buff, int len, uint8_t device_address)
{
/* 等待总线空闲 */
while(i2c_flag_get(I2C_PERIPH, I2C_FLAG_I2CBSY));
@ -86,7 +89,7 @@ void i2c_write(uint8_t *buff, int len)
/* 等待起始条件已发送标志 */
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_SBSEND));
/* 发送从机地址(写模式) */
i2c_master_addressing(I2C_PERIPH, TMP75_ADDRESS, I2C_TRANSMITTER);
i2c_master_addressing(I2C_PERIPH, device_address << 1, I2C_TRANSMITTER);
/* 等待地址已发送标志 */
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_ADDSEND));
/* 清除地址发送标志 */
@ -108,7 +111,7 @@ void i2c_write(uint8_t *buff, int len)
}
//接收1字节数据
void i2c_read(uint8_t *buff, uint16_t len)
void i2c_read(uint8_t *buff, uint16_t len, uint8_t device_address)
{
/* 等待I2C总线空闲 */
while(i2c_flag_get(I2C_PERIPH, I2C_FLAG_I2CBSY));
@ -118,12 +121,20 @@ void i2c_read(uint8_t *buff, uint16_t len)
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_SBSEND));//设置主机发送启动条件
/* 将从机地址发送到I2C总线 */
i2c_master_addressing(I2C_PERIPH, TMP75_ADDRESS, I2C_RECEIVER);//设置主机接收
i2c_master_addressing(I2C_PERIPH, device_address << 1, I2C_RECEIVER);//设置主机接收
/* 调试时可能卡死 */
/* 等待地址位被设置 */
while(!i2c_flag_get(I2C_PERIPH, I2C_FLAG_ADDSEND));
beep_enable();
/* 清除地址位 */
i2c_flag_clear(I2C_PERIPH, I2C_FLAG_ADDSEND);
// i2c_flag_get(I2C_PERIPH, I2C_FLAG_ADDSEND);
// i2c_flag_clear(I2C_PERIPH, I2C_FLAG_ADDSEND);
/* 使能ACK多个字节接收时需要应答 */
i2c_ack_config(I2C_PERIPH, I2C_ACK_ENABLE);
@ -165,3 +176,5 @@ void i2c_read(uint8_t *buff, uint16_t len)
/* 等待停止信号完成 */
while(I2C_CTL0(I2C_PERIPH) & I2C_CTL0_STOP);
}
#endif

View File

@ -13,34 +13,42 @@
#ifndef DRV_I2C_H
#define DRV_I2C_H
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_i2c.h"
#include "gd32f4xx.h"
#include "delay.h"
#include "beep.h"
// #define SOFTWARE_I2C
#define HARDWARE_I2C
#define I2C_PERIPH I2C0
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_SPEED 100000
#define TMP75_ADDRESS 0x48 //1001000
// #define TMP75_ADDRESS 0x09
#define TEMP_REGISTER_ADDRESS 0x00 //mcu作为从机时被寻址的地址
#ifdef HARDWARE_I2C
#define I2C_PERIPH I2C0
#define I2C_SPEED 100000
#endif
// #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)
#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 i2c_write(uint8_t *buff, int len);
void i2c_read(uint8_t *buff, uint16_t len);
// void temp75_gpio_init();
// float tmp75_read_temp(void);
#ifdef HARDWARE_I2C
void i2c_config(void);
void i2c_write(uint8_t *buff, int len, uint8_t device_address);
void i2c_read(uint8_t *buff, uint16_t len, uint8_t device_address);
#endif
#endif

View File

@ -5,48 +5,14 @@
///
///@details
///@note
///@author lqc
///@date 2022/05/26
///@author dufresne
///@date 2025/09/26
///
///@version v1.0 2022/05/26 初始版本
#include "mb85rc64.h"
#include "rtthread.h"
#include <core_cm4.h>
/*
@ brief
@ param
@ return
@ note 2022-5-23
*/
static void delay_us(int us)
{
rt_thread_udelay(us);
}
// /*
// @ brief 芯片初始化
// @ param
// @ return
// @ note 2022-05-26
// */
// void mb85rc64_gpio_init()
// {
// //配置引脚时钟
// rcu_periph_clock_enable(RCU_GPIOB);
// //设置引脚为输出模式:PB6
// gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
// gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
// //设置引脚PB7输出模式
// gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
// gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
// MB85RC64_SCL_HIGH;
// MB85RC64_SDA_HIGH;
// }
#ifdef SOFTWARE_I2C
/*
@ brief SDA引脚为输出模式
@ -56,8 +22,8 @@ static void delay_us(int us)
*/
static void mb85rc64_sda_output()
{
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, I2C_SDA_PIN);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
MB85RC64_SDA_HIGH;
}
@ -69,8 +35,8 @@ static void mb85rc64_sda_output()
*/
static void mb85rc64_sda_input()
{
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, I2C_SDA_PIN);
gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
}
/*
@ -231,7 +197,7 @@ static uint8_t mb85rc64_read_byte()
@ return
@ note 2022-05-27
*/
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len)
char mb85rc64_write_read(unsigned short int addr, unsigned char* data, int data_len, bool statues)
{
uint8_t addr_H = 0;
uint8_t addr_L = 0;
@ -241,7 +207,8 @@ char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_
//启动信号
i2c_start();
//写地址,R/W位=0
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
// mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
mb85rc64_write_byte(MB85RC64_ADDRESS << 1);
//ack信号
mb85rc64_ack();
//写高8位地址
@ -252,49 +219,22 @@ char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_
mb85rc64_write_byte(addr_L);
//ack信号
mb85rc64_ack();
if (statues == PAGE_WRITE)
{
for(int i = 0; i < data_len; i++)
{
mb85rc64_write_byte(*data);
mb85rc64_ack();
data++;
}
//停止信号
i2c_stop();
return 1;
}
/*
@ brief
@ param addr :data:, data_len:
@ return
@ note 2022-05-27 lqc
*/
char mb85rc64_add_read(unsigned short int addr, unsigned char *data, int data_len)
else if (statues == ADDR_READ)
{
uint8_t addr_H = 0;
uint8_t addr_L = 0;
addr_H = (addr >> 8) & 0x00ff;
addr_L = addr & 0x00ff;
//启动信号
i2c_start();
//写地址R/W位为0
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
//ack信号
mb85rc64_ack();
//写高8位地址
mb85rc64_write_byte(addr_H);
//ack信号
mb85rc64_ack();
//写低8位地址
mb85rc64_write_byte(addr_L);
//ack信号
mb85rc64_ack();
//启动信号
i2c_start();
//写地址R/W为为1读数据
mb85rc64_write_byte(MB85RC64_ADDRESS_READ);
mb85rc64_write_byte((MB85RC64_ADDRESS << 1) + 1);
//ack信号
mb85rc64_ack();
for(int i = 0; i < data_len; i++)
@ -310,6 +250,7 @@ char mb85rc64_add_read(unsigned short int addr, unsigned char *data, int data_le
master_ack();
}
}
}
//停止信号
i2c_stop();
return 1;
@ -320,7 +261,7 @@ void read_mb_id(uint8_t* buff)
i2c_start();
mb85rc64_write_byte(0xf8);
mb85rc64_ack();
mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
mb85rc64_write_byte(MB85RC64_ADDRESS << 1);
mb85rc64_ack();
i2c_start();
mb85rc64_write_byte(0xf9);
@ -340,3 +281,38 @@ void read_mb_id(uint8_t* buff)
}
i2c_stop();
}
#endif
// #ifdef HARDWARE_I2C
// void read_mb_id(uint8_t* buff)
// {
// i2c_start();
// mb85rc64_write_byte(0xf8);
// mb85rc64_ack();
// mb85rc64_write_byte(MB85RC64_ADDRESS << 1);
// mb85rc64_ack();
// i2c_start();
// mb85rc64_write_byte(0xf9);
// mb85rc64_ack();
// for(int i = 0; i < 3; i++)
// {
// //¶ÁÊý¾Ý
// buff[i] = mb85rc64_read_byte();
// if(i == 3 - 1)
// {
// master_no_ack();
// }
// else
// {
// master_ack();
// }
// }
// i2c_stop();
// i2c_read(buff, 3, MB85RC64_ADDRESS);
// }
// #endif

View File

@ -14,27 +14,30 @@
#define __MB85RC64_H_
#include "gd32f4xx_gpio.h"
#include "drv_i2c.h"
#include "stdbool.h"
#ifdef SOFTWARE_I2C
#define MB85RC64_ADDRESS 0x50
#define PAGE_WRITE 1
#define ADDR_READ 0
#define MB85RC64_ADDRESS_WRITE 0xA0
#define MB85RC64_ADDRESS_READ 0xA1
//mb85rc64湔揣華硊
#define MB85RC64_SAVE_ADDRESS_BEGIN 0x0000
#define MB85RC64_SCL_HIGH I2C_SCL_HIGH
#define MB85RC64_SCL_LOW I2C_SCL_LOW
#define MB85RC64_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6)
#define MB85RC64_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6)
#define MB85RC64_SDA_HIGH gpio_bit_set(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_HIGH I2C_SDA_HIGH
#define MB85RC64_SDA_LOW I2C_SDA_LOW
#define MB85RC64_SDA_GET I2C_SDA_GET
// void mb85rc64_gpio_init();
char mb85rc64_page_write(unsigned short int addr, unsigned char* data, int data_len);
char mb85rc64_add_read(unsigned short int addr, unsigned char *data, int data_len);
char mb85rc64_write_read(unsigned short int addr, unsigned char* data, int data_len, bool statues);
void read_mb_id(uint8_t* buff);
#endif
#endif

View File

@ -13,41 +13,6 @@ All rights reserved.
*************************************************/
#include "tmp75.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);
}
/*
@ brief tmp75芯片GPIO引脚
@ param
@ return
@ note 2025-09-15
*/
void temp75_gpio_init()
{
// 配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOB);
// 设置引脚为输出模式:PB6
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
// 设置引脚PB7输出模式
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
TMP75_SCL_HIGH;
TMP75_SDA_HIGH;
}
/*
@ brief SDA引脚为输出模式
@ -57,8 +22,8 @@ void temp75_gpio_init()
*/
static void tmp75_sda_output()
{
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, I2C_SDA_PIN);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, I2C_SDA_PIN);
}
/*
@ -69,8 +34,7 @@ static void tmp75_sda_output()
*/
static void tmp75_sda_input()
{
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
// gpio_output_options_set(GPIOB, GPIO_PUPD_NONE, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, I2C_SDA_PIN);
}
/*
@ -216,15 +180,15 @@ static void master_noack()
*/
float tmp75_read_temp(void)
{
uint8_t tempH = 0;
uint8_t tempL = 0;
uint16_t tempCode = 0;
float temp = 0;
static uint8_t tempH = 0;
static uint8_t tempL = 0;
static uint16_t tempCode = 0;
static float temp = 0;
// 起始信号
i2c_start();
// 写tmp75地址
tmp75_write_byte(TMP75_ADDRESS);//写 数据 设置
tmp75_write_byte(TMP75_ADDRESS << 1);//写 数据 设置
// 接收tmp75的ack信息
tmp75_ack();
// 发送需读取数据的地址
@ -233,7 +197,7 @@ float tmp75_read_temp(void)
i2c_start();
// 写tmp75地址
tmp75_write_byte(TMP75_ADDRESS + 1); // 读 数据 设置
tmp75_write_byte((TMP75_ADDRESS << 1) + 1); // 读 数据 设置
tmp75_ack();
tempH = tmp75_read_byte();
master_ack();

View File

@ -13,19 +13,17 @@
#ifndef __TMP75_H_
#define __TMP75_H_
#include "gd32f4xx_gpio.h"
#include "gd32f4xx.h"
#include "drv_i2c.h"
#define TMP75_ADDRESS 0x90
#define TEMP_REGISTER_ADDRESS 0x00 //温度寄存器地址
#define TMP75_SCL_HIGH gpio_bit_set(GPIOB, GPIO_PIN_6)
#define TMP75_SCL_LOW gpio_bit_reset(GPIOB, GPIO_PIN_6)
#define TMP75_SCL_HIGH I2C_SCL_HIGH
#define TMP75_SCL_LOW I2C_SCL_LOW
#define TMP75_SDA_HIGH gpio_bit_set(GPIOB, GPIO_PIN_7)
#define TMP75_SDA_LOW gpio_bit_reset(GPIOB, GPIO_PIN_7)
#define TMP75_SDA_GET gpio_input_bit_get(GPIOB, GPIO_PIN_7)
#define TMP75_SDA_HIGH I2C_SDA_HIGH
#define TMP75_SDA_LOW I2C_SDA_LOW
#define TMP75_SDA_GET I2C_SDA_GET
void temp75_gpio_init();
float tmp75_read_temp(void);
#endif

View File

@ -23,7 +23,7 @@
#include <rtdef.h>
#include <rtservice.h>
#include <rtm.h>
#include "gd32f4xx_gpio.h"
// #include "gd32f4xx_gpio.h"
#ifdef __cplusplus
@ -140,7 +140,7 @@ rt_err_t rt_thread_delete(rt_thread_t thread);
rt_err_t rt_thread_yield(void);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
void rt_thread_udelay(int us);
// void rt_thread_udelay(int us);
rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg);
rt_err_t rt_thread_suspend(rt_thread_t thread);
rt_err_t rt_thread_resume(rt_thread_t thread);

View File

@ -552,19 +552,6 @@ rt_err_t rt_thread_mdelay(rt_int32_t ms)
RTM_EXPORT(rt_thread_mdelay);
void rt_thread_udelay(int us)
{
rt_uint32_t start, now, delta, reload, us_tick;
start = SysTick->VAL;
reload = SysTick->LOAD;
us_tick = SystemCoreClock / 1000000UL;
do
{
now = SysTick->VAL;
delta = start > now ? start - now : reload + start - now;
} while (delta < us_tick * us);
}
/**