Commit 40bc6c52 authored by 957dd's avatar 957dd

feat: devi2c代码为改完,暂存,因为I2C2未默认开启,晚点再改

parent 3de842c5
...@@ -376,6 +376,30 @@ src/delay.c.s: ...@@ -376,6 +376,30 @@ src/delay.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/delay.c.s $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/delay.c.s
.PHONY : src/delay.c.s .PHONY : src/delay.c.s
src/deviic.o: src/deviic.c.o
.PHONY : src/deviic.o
# target to build an object file
src/deviic.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/deviic.c.o
.PHONY : src/deviic.c.o
src/deviic.i: src/deviic.c.i
.PHONY : src/deviic.i
# target to preprocess a source file
src/deviic.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/deviic.c.i
.PHONY : src/deviic.c.i
src/deviic.s: src/deviic.c.s
.PHONY : src/deviic.s
# target to generate assembly for a file
src/deviic.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/deviic.c.s
.PHONY : src/deviic.c.s
src/download.o: src/download.c.o src/download.o: src/download.c.o
.PHONY : src/download.o .PHONY : src/download.o
...@@ -568,30 +592,6 @@ src/request.c.s: ...@@ -568,30 +592,6 @@ src/request.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/request.c.s $(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/request.c.s
.PHONY : src/request.c.s .PHONY : src/request.c.s
src/softiic.o: src/softiic.c.o
.PHONY : src/softiic.o
# target to build an object file
src/softiic.c.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/softiic.c.o
.PHONY : src/softiic.c.o
src/softiic.i: src/softiic.c.i
.PHONY : src/softiic.i
# target to preprocess a source file
src/softiic.c.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/softiic.c.i
.PHONY : src/softiic.c.i
src/softiic.s: src/softiic.c.s
.PHONY : src/softiic.s
# target to generate assembly for a file
src/softiic.c.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/softiic.c.s
.PHONY : src/softiic.c.s
src/thread_main.o: src/thread_main.c.o src/thread_main.o: src/thread_main.c.o
.PHONY : src/thread_main.o .PHONY : src/thread_main.o
...@@ -1398,6 +1398,9 @@ help: ...@@ -1398,6 +1398,9 @@ help:
@echo "... src/delay.o" @echo "... src/delay.o"
@echo "... src/delay.i" @echo "... src/delay.i"
@echo "... src/delay.s" @echo "... src/delay.s"
@echo "... src/deviic.o"
@echo "... src/deviic.i"
@echo "... src/deviic.s"
@echo "... src/download.o" @echo "... src/download.o"
@echo "... src/download.i" @echo "... src/download.i"
@echo "... src/download.s" @echo "... src/download.s"
...@@ -1422,9 +1425,6 @@ help: ...@@ -1422,9 +1425,6 @@ help:
@echo "... src/request.o" @echo "... src/request.o"
@echo "... src/request.i" @echo "... src/request.i"
@echo "... src/request.s" @echo "... src/request.s"
@echo "... src/softiic.o"
@echo "... src/softiic.i"
@echo "... src/softiic.s"
@echo "... src/thread_main.o" @echo "... src/thread_main.o"
@echo "... src/thread_main.i" @echo "... src/thread_main.i"
@echo "... src/thread_main.s" @echo "... src/thread_main.s"
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
#define PROJECT_VERSION_MINOR 1 #define PROJECT_VERSION_MINOR 1
#define PROJECT_VERSION_PATCH 2 #define PROJECT_VERSION_PATCH 2
#define GIT_HASH "" #define GIT_HASH ""
#define BUILD_TIMESTAMP "2025-05-19T12:32:09" #define BUILD_TIMESTAMP "2025-05-20T08:32:35"
#define BUILD_USER "orangepi" #define BUILD_USER "orangepi"
No preview for this file type
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "gpio_common.h" #include "gpio_common.h"
#include "log.h" #include "log.h"
#include "delay.h" #include "delay.h"
#include "softiic.h" #include "deviic.h"
// 其他公共声明 // 其他公共声明
......
#ifndef DEVIIC_H__
#define DEVIIC_H__
bool i2c_init(int bus_number);
bool i2c_set_slave_address(uint8_t address);
bool i2c_write_reg(uint8_t reg_addr, uint16_t data);
bool i2c_read_reg(uint8_t reg_addr, uint16_t *data);
void i2c_close();
#endif
\ No newline at end of file
#ifndef SOFTIIC_H__
#define SOFTIIC_H__
extern int sda_pin; // GPIO0
extern int scl_pin; // GPIO1
// I2C 起始信号
void i2c_start(int sda_pin, int scl_pin);
// I2C 停止信号
void i2c_stop(int sda_pin, int scl_pin);
// I2C 发送一个字节
void i2c_write_byte(int sda_pin, int scl_pin, uint8_t data);
// I2C 读取一个字节
uint8_t i2c_read_byte(int sda_pin, int scl_pin, bool ack);
#endif
\ No newline at end of file
#include <math.h>
#include "common.h"
#include "deviic.h"
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
static int i2c_fd = -1; // I2C设备文件描述符
// 初始化I2C总线
bool i2c_init(int bus_number) {
char filename[20];
snprintf(filename, sizeof(filename), "/dev/i2c-%d", bus_number);
i2c_fd = open(filename, O_RDWR);
if (i2c_fd < 0) {
perror("Failed to open I2C bus");
return false;
}
return true;
}
// 设置I2C从设备地址
bool i2c_set_slave_address(uint8_t address) {
if (ioctl(i2c_fd, I2C_SLAVE, address) < 0) {
perror("Failed to set slave address");
return false;
}
return true;
}
// 通用I2C写操作(寄存器地址 + 2字节数据)
bool i2c_write_reg(uint8_t reg_addr, uint16_t data) {
uint8_t buf[3] = {reg_addr, (data >> 8), (data & 0xFF)};
if (write(i2c_fd, buf, 3) != 3) {
perror("I2C write failed");
return false;
}
return true;
}
// 通用I2C读操作(寄存器地址 + 读取2字节数据)
bool i2c_read_reg(uint8_t reg_addr, uint16_t *data) {
// 发送寄存器地址
if (write(i2c_fd, &reg_addr, 1) != 1) {
perror("Failed to send register address");
return false;
}
// 读取2字节数据
if (read(i2c_fd, data, 2) != 2) {
perror("I2C read failed");
return false;
}
return true;
}
// 关闭I2C连接
void i2c_close() {
if (i2c_fd != -1) {
close(i2c_fd);
i2c_fd = -1;
}
}
\ No newline at end of file
...@@ -73,8 +73,8 @@ void on_connect(struct mosquitto *mosq, void *obj, int rc) {//回调函数 ...@@ -73,8 +73,8 @@ void on_connect(struct mosquitto *mosq, void *obj, int rc) {//回调函数
void mqtt_wirte(){//心跳格式,每5s一次心跳 void mqtt_wirte(){//心跳格式,每5s一次心跳
float voltage = INA226_readBusVoltage(sda_pin, scl_pin); float voltage = INA226_readBusVoltage();
float current = INA226_readCurrent(sda_pin, scl_pin); float current = INA226_readCurrent();
char voltage_str[20]; // 足够存储转换后的字符串的缓冲区 char voltage_str[20]; // 足够存储转换后的字符串的缓冲区
sprintf(voltage_str, "%.2f", voltage); sprintf(voltage_str, "%.2f", voltage);
char current_str[20]; // 足够存储转换后的字符串的缓冲区 char current_str[20]; // 足够存储转换后的字符串的缓冲区
......
#include <math.h>
#include "common.h"
#include "softiic.h"
int sda_pin=0; // GPIO0
int scl_pin=1; // GPIO1
// 软件 I2C 延时
void i2c_delay() {
delayMicroseconds(5);
}
// I2C 起始信号
void i2c_start(int sda_pin, int scl_pin) {
digitalWrite(sda_pin, HIGH);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(sda_pin, LOW);
i2c_delay();
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// I2C 停止信号
void i2c_stop(int sda_pin, int scl_pin) {
digitalWrite(sda_pin, LOW);
digitalWrite(scl_pin, LOW);
i2c_delay();
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(sda_pin, HIGH);
i2c_delay();
}
// I2C 发送一个字节
void i2c_write_byte(int sda_pin, int scl_pin, uint8_t data) {
for (int i = 7; i >= 0; i--) {
digitalWrite(sda_pin, (data >> i) & 0x01);
i2c_delay();
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// 接收 ACK
pinMode(sda_pin, INPUT);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, OUTPUT);
}
// I2C 读取一个字节
uint8_t i2c_read_byte(int sda_pin, int scl_pin, bool ack) {
uint8_t data = 0;
pinMode(sda_pin, INPUT);
for (int i = 7; i >= 0; i--) {
digitalWrite(scl_pin, HIGH);
i2c_delay();
data |= (digitalRead(sda_pin) << i);
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// 发送 ACK/NACK
pinMode(sda_pin, OUTPUT);
digitalWrite(sda_pin, ack ? LOW : HIGH);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, INPUT);
return data;
}
\ No newline at end of file
...@@ -3,67 +3,43 @@ ...@@ -3,67 +3,43 @@
#include "INA226.h" #include "INA226.h"
float currentLSB ; float currentLSB ;
// 初始化 INA226 // 初始化INA226
bool INA226_begin(int sda_pin, int scl_pin) { bool INA226_begin(int bus_number) {
pinMode(sda_pin, OUTPUT); if (!i2c_init(bus_number)) return false;
pinMode(scl_pin, OUTPUT); if (!i2c_set_slave_address(INA226_ADDRESS)) {
digitalWrite(sda_pin, HIGH); i2c_close();
digitalWrite(scl_pin, HIGH); return false;
}
return true; return true;
} }
// 配置 INA226 // 配置INA226寄存器
bool INA226_configure(int sda_pin, int scl_pin) { bool INA226_configure() {
uint16_t config = 0x4127; // 默认配置:16 次平均,1.1ms 转换时间,连续模式 uint16_t config = 0x4127; // 默认配置:16次平均,1.1ms转换,连续模式
i2c_start(sda_pin, scl_pin); return i2c_write_reg(INA226_REG_CONFIG, config);
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1);
i2c_write_byte(sda_pin, scl_pin, INA226_REG_CONFIG);
i2c_write_byte(sda_pin, scl_pin, config >> 8);
i2c_write_byte(sda_pin, scl_pin, config & 0xFF);
i2c_stop(sda_pin, scl_pin);
return true;
} }
// 校准 INA226 // 校准INA226
bool INA226_calibrate(int sda_pin, int scl_pin, float rShuntValue, float iMaxExpected) { bool INA226_calibrate(float rShuntValue, float iMaxExpected) {
currentLSB = iMaxExpected / 32767.0f; // 计算电流LSB
currentLSB = iMaxExpected/32767.0 ; // 计算电流 LSB,/INA226_REG_CALIBRATION uint16_t calibration = (uint16_t)(0.00512f / (currentLSB * rShuntValue));
return i2c_write_reg(INA226_REG_CALIBRATION, calibration);
uint16_t calibrationValue = (uint16_t)(0.00512 / (currentLSB * rShuntValue)); }
i2c_start(sda_pin, scl_pin); // 读取总线电压(单位:V)
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1); float INA226_readBusVoltage() {
i2c_write_byte(sda_pin, scl_pin, INA226_REG_CALIBRATION); uint16_t raw;
i2c_write_byte(sda_pin, scl_pin, calibrationValue >> 8); if (!i2c_read_reg(INA226_REG_BUSVOLTAGE, &raw)) return 0.0f;
i2c_write_byte(sda_pin, scl_pin, calibrationValue & 0xFF); return ((raw >> 3) * 0.00125f); // 高13位有效,1.25mV/LSB
i2c_stop(sda_pin, scl_pin);
return true;
} }
// 读取总线电压 // 读取电流(单位:A)
float INA226_readBusVoltage(int sda_pin, int scl_pin) { float INA226_readCurrent() {
i2c_start(sda_pin, scl_pin); uint16_t raw;
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1); if (!i2c_read_reg(INA226_REG_CURRENT, &raw)) return 0.0f;
i2c_write_byte(sda_pin, scl_pin, INA226_REG_BUSVOLTAGE); return ((int16_t)raw * currentLSB); // 转换为有符号数
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, (INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(sda_pin, scl_pin, true);
uint8_t low = i2c_read_byte(sda_pin, scl_pin, false);
i2c_stop(sda_pin, scl_pin);
int16_t value = (high << 8) | low;
return value * 0.00125; // 1.25mV/LSB
} }
// 读取电流 void INA226_end(void) {
float INA226_readCurrent(int sda_pin, int scl_pin) { i2c_close();
i2c_start(sda_pin, scl_pin); }
i2c_write_byte(sda_pin, scl_pin, INA226_ADDRESS << 1);
i2c_write_byte(sda_pin, scl_pin, INA226_REG_CURRENT);
i2c_start(sda_pin, scl_pin);
i2c_write_byte(sda_pin, scl_pin, (INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(sda_pin, scl_pin, true);
uint8_t low = i2c_read_byte(sda_pin, scl_pin, false);
i2c_stop(sda_pin, scl_pin);
int16_t value = (high << 8) | low;
return value * currentLSB; // 假设电流 LSB 为 1mA
}
\ No newline at end of file
#ifndef INA226_H #ifndef INA226_H
#define INA226_H #define INA226_H
#define INA226_ADDRESS (0x40) // INA226 的 I2C 地址 #include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
// INA226 I2C 设备地址(ADDR 引脚接地时为 0x40)
#define INA226_ADDRESS (0x40)
// 寄存器地址定义
#define INA226_REG_CONFIG (0x00) #define INA226_REG_CONFIG (0x00)
#define INA226_REG_SHUNTVOLTAGE (0x01) #define INA226_REG_SHUNTVOLTAGE (0x01)
#define INA226_REG_BUSVOLTAGE (0x02) #define INA226_REG_BUSVOLTAGE (0x02)
...@@ -10,19 +16,12 @@ ...@@ -10,19 +16,12 @@
#define INA226_REG_CURRENT (0x04) #define INA226_REG_CURRENT (0x04)
#define INA226_REG_CALIBRATION (0x05) #define INA226_REG_CALIBRATION (0x05)
// 初始化 INA226 // 函数声明
bool INA226_begin(int sda_pin, int scl_pin); bool INA226_begin(int bus_number);
bool INA226_configure(void);
// 配置 INA226 bool INA226_calibrate(float rShuntValue, float iMaxExpected);
bool INA226_configure(int sda_pin, int scl_pin); float INA226_readBusVoltage(void);
float INA226_readCurrent(void);
// 校准 INA226 void INA226_end(void);
bool INA226_calibrate(int sda_pin, int scl_pin, float rShuntValue, float iMaxExpected);
// 读取总线电压
float INA226_readBusVoltage(int sda_pin, int scl_pin);
// 读取电流
float INA226_readCurrent(int sda_pin, int scl_pin);
#endif // INA226_H #endif // INA226_H
\ No newline at end of file
...@@ -15,11 +15,13 @@ int main(int argc, char *argv[]) { ...@@ -15,11 +15,13 @@ int main(int argc, char *argv[]) {
//printf("WiringPi setup failed!\n"); //printf("WiringPi setup failed!\n");
return 3; return 3;
} }
if (!INA226_begin(sda_pin, scl_pin)) { if (!INA226_begin(2)) {
my_zlog_fatal("INA226 初始化失败!"); my_zlog_fatal("INA226 初始化失败!");
//printf("INA226 初始化失败!\n"); //printf("INA226 初始化失败!\n");
INA226_end();
return 4; return 4;
} }
if(Device_File_Init()!=0) { if(Device_File_Init()!=0) {
my_zlog_fatal("This is a fatal message"); my_zlog_fatal("This is a fatal message");
//printf("设备文件读取初始化失败!\n"); //printf("设备文件读取初始化失败!\n");
...@@ -44,14 +46,17 @@ int main(int argc, char *argv[]) { ...@@ -44,14 +46,17 @@ int main(int argc, char *argv[]) {
system("pkill chromium"); system("pkill chromium");
// 配置 INA226 // 配置 INA226
if(!INA226_configure(sda_pin, scl_pin)) { if(!INA226_configure()) {
my_zlog_warn("INA226初始化失败"); my_zlog_warn("INA226配置失败");
INA226_end(); // 关闭I2C连接
} }
// 校准 INA226 // 校准 INA226
float rShuntValue = 0.1; // 分流电阻值(单位:欧姆) float SHUNT_RESISTOR = 0.1f; // 分流电阻值(单位:欧姆)
float iMaxExpected = 5; // 最大预期电流(单位:安培) float MAX_EXPECTED_CURRENT = 5.0f; // 最大预期电流(单位:安培)
if(!INA226_calibrate(sda_pin, scl_pin, rShuntValue, iMaxExpected)){ if(!INA226_calibrate(SHUNT_RESISTOR, MAX_EXPECTED_CURRENT)){
my_zlog_warn("INA226校准失败"); my_zlog_warn("INA226校准失败");
INA226_end();
} }
gStart=time(NULL);//开始时间戳 gStart=time(NULL);//开始时间戳
...@@ -68,7 +73,9 @@ int main(int argc, char *argv[]) { ...@@ -68,7 +73,9 @@ int main(int argc, char *argv[]) {
thread_end(); //关闭线程 thread_end(); //关闭线程
my_zlog_info("程序关闭成功"); my_zlog_info("程序关闭成功");
my_log_close();//关闭日志 my_log_close();//关闭日志
i2c_close();//关闭iic接口
//printf("程序关闭成功\n"); //printf("程序关闭成功\n");
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment