硬件i2c完成
This commit is contained in:
parent
a39e0e99fb
commit
fb8fdcc834
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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));
|
||||
|
||||
// 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;
|
||||
// }
|
||||
#ifdef SOFTWARE_I2C
|
||||
|
||||
// mb85rc64_page_write(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest));
|
||||
mb85rc64_write_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest), ADDR_READ);
|
||||
|
||||
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);
|
||||
// 主循环代码...
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -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);
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef _BEEP_H_
|
||||
#define _BEEP_H_
|
||||
|
||||
void beep_init();
|
||||
void beep_enable();
|
||||
void beep_disable();
|
||||
|
||||
#endif
|
|
@ -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);
|
||||
}
|
|
@ -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
|
|
@ -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);
|
||||
// }
|
|
@ -1,8 +0,0 @@
|
|||
// #ifndef __TMP75_H_
|
||||
// #define __TMP75_H_
|
||||
|
||||
|
||||
// static void delay_us(int us);
|
||||
|
||||
|
||||
// #endif
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
@ -27,7 +27,8 @@
|
|||
|
||||
#define ADC_MODE_0 //规则组、单次转换、非扫描
|
||||
// #define ADC_MODE_1 //注入组、单次转换、扫描、转换结束标志位采集
|
||||
// #define ADC_MODE_2 //注入组、单次转换、扫描、中断转换结束标志位采集
|
||||
// #define ADC_MODE_2 //注入组、单次转换、扫描、中断转换结束标志位采集
|
||||
|
||||
// #define ADC_MODE_3 //规则组、连续转换、扫描、DMA采集
|
||||
|
||||
/*
|
||||
|
|
|
@ -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_ADDRESS:SD2068器件代码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
|
|
@ -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
|
|
@ -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,88 +197,63 @@ 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;
|
||||
|
||||
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();
|
||||
for(int i = 0; i < data_len; i++)
|
||||
{
|
||||
mb85rc64_write_byte(*data);
|
||||
mb85rc64_ack();
|
||||
data++;
|
||||
}
|
||||
//停止信号
|
||||
i2c_stop();
|
||||
return 1;
|
||||
}
|
||||
uint8_t addr_H = 0;
|
||||
uint8_t addr_L = 0;
|
||||
|
||||
/*
|
||||
@ 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)
|
||||
{
|
||||
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);
|
||||
//ack信号
|
||||
mb85rc64_ack();
|
||||
for(int i = 0; i < data_len; i++)
|
||||
{
|
||||
//读数据
|
||||
data[i] = mb85rc64_read_byte();
|
||||
if(i == data_len - 1)
|
||||
{
|
||||
master_no_ack();
|
||||
}
|
||||
else
|
||||
{
|
||||
master_ack();
|
||||
}
|
||||
}
|
||||
//停止信号
|
||||
i2c_stop();
|
||||
return 1;
|
||||
addr_H = (addr >> 8) & 0x00ff;
|
||||
addr_L = addr & 0x00ff;
|
||||
//启动信号
|
||||
i2c_start();
|
||||
//写地址,R/W位=0
|
||||
// mb85rc64_write_byte(MB85RC64_ADDRESS_WRITE);
|
||||
mb85rc64_write_byte(MB85RC64_ADDRESS << 1);
|
||||
//ack信号
|
||||
mb85rc64_ack();
|
||||
//写高8位地址
|
||||
mb85rc64_write_byte(addr_H);
|
||||
//ack信号
|
||||
mb85rc64_ack();
|
||||
//写低8位地址
|
||||
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++;
|
||||
}
|
||||
}
|
||||
else if (statues == ADDR_READ)
|
||||
{
|
||||
//启动信号
|
||||
i2c_start();
|
||||
//写地址,R/W为为1,读数据
|
||||
mb85rc64_write_byte((MB85RC64_ADDRESS << 1) + 1);
|
||||
//ack信号
|
||||
mb85rc64_ack();
|
||||
for(int i = 0; i < data_len; i++)
|
||||
{
|
||||
//读数据
|
||||
data[i] = mb85rc64_read_byte();
|
||||
if(i == data_len - 1)
|
||||
{
|
||||
master_no_ack();
|
||||
}
|
||||
else
|
||||
{
|
||||
master_ack();
|
||||
}
|
||||
}
|
||||
}
|
||||
//停止信号
|
||||
i2c_stop();
|
||||
return 1;
|
||||
}
|
||||
|
||||
void read_mb_id(uint8_t* buff)
|
||||
|
@ -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
|
|
@ -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
|
|
@ -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();
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue