From 65614ace501d09874d5f289eaf03898f8787fdda Mon Sep 17 00:00:00 2001 From: jxh Date: Tue, 18 Mar 2025 22:14:15 +0800 Subject: [PATCH] =?UTF-8?q?#=20V0.1=20=E7=BC=96=E8=AF=91=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E4=B8=94OLED=E6=AD=A3=E5=B8=B8=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Driver/iic.c | 273 +++++++++++++++++++++++++++++++++------------------ Lib/ina226.c | 4 +- 2 files changed, 180 insertions(+), 97 deletions(-) diff --git a/Driver/iic.c b/Driver/iic.c index 7cb5074..46458ee 100644 --- a/Driver/iic.c +++ b/Driver/iic.c @@ -1,123 +1,206 @@ #include "iic.h" - // 延时函数(2us) -void IIC_Delay(void) { - // 软件延时 - // _nop_();_nop_();_nop_();_nop_();_nop_();// 30个nop约1us@30MHz - // _nop_();_nop_();_nop_();.............. - - DelayUs(1); +void +IIC_Delay (void) +{ + // 软件延时 + // _nop_();_nop_();_nop_();_nop_();_nop_();// 30个nop约1us@30MHz + // _nop_();_nop_();_nop_();.............. + DelayUs (1); } -void IIC_Init(void) { - // 配置P2.6和P2.7为开漏模式 - P2M1 |= 0xC0; // 1100 0000 - P2M0 |= 0xC0; // 开漏模式 - SDA = 1; - SCL = 1; +void +IIC_Init (void) +{ + // 配置P2.6和P2.7为开漏模式 + P2M1 |= 0xC0; // 1100 0000 + P2M0 |= 0xC0; // 开漏模式 + SDA = 1; + SCL = 1; } -void IIC_Start(void) { - SDA = 1; - SCL = 1; - IIC_Delay(); - SDA = 0; - IIC_Delay(); - SCL = 0; +void +IIC_Start (void) +{ + SDA = 1; + SCL = 1; + IIC_Delay (); + SDA = 0; + IIC_Delay (); + SCL = 0; } -void IIC_Stop(void) { - SDA = 0; - SCL = 1; - IIC_Delay(); - SDA = 1; - IIC_Delay(); +void +IIC_Stop (void) +{ + SDA = 0; + SCL = 1; + IIC_Delay (); + SDA = 1; + IIC_Delay (); } -void IIC_SendByte(u8 dat) { - u8 i; - for(i=0; i<8; i++) { - SDA = (dat & 0x80) ? 1 : 0; - dat <<= 1; - IIC_Delay(); - SCL = 1; - IIC_Delay(); - SCL = 0; +void +IIC_SendByte (u8 dat) +{ + u8 i; + for (i = 0; i < 8; i++) + { + SDA = (dat & 0x80) ? 1 : 0; + dat <<= 1; + IIC_Delay (); + SCL = 1; + IIC_Delay (); + SCL = 0; } } -u8 IIC_RecvByte(void) { - u8 i, dat = 0; - SDA = 1; // 释放数据线 - for(i=0; i<8; i++) { - dat <<= 1; - SCL = 1; - IIC_Delay(); - if(SDA) dat |= 0x01; - SCL = 0; - IIC_Delay(); +u8 +IIC_RecvByte (void) +{ + u8 i, dat = 0; + SDA = 1; // 释放数据线 + for (i = 0; i < 8; i++) + { + dat <<= 1; + SCL = 1; + IIC_Delay (); + if (SDA) + dat |= 0x01; + SCL = 0; + IIC_Delay (); } - return dat; + return dat; } -bit IIC_WaitAck(void) { - SDA = 1; // 主机释放SDA - IIC_Delay(); - SCL = 1; - IIC_Delay(); - if(SDA) { // 检测SDA状态 - SCL = 0; - return 0; // 无ACK - } else { - SCL = 0; - return 1; // 收到ACK +bit +IIC_WaitAck (void) +{ + SDA = 1; // 主机释放SDA + IIC_Delay (); + SCL = 1; + IIC_Delay (); + if (SDA) + { // 检测SDA状态 + SCL = 0; + return 0; // 无ACK + } + else + { + SCL = 0; + return 1; // 收到ACK } } -void IIC_SendAck(bit ack) { - SDA = ack ? 0 : 1; - IIC_Delay(); - SCL = 1; - IIC_Delay(); - SCL = 0; - SDA = 1; // 释放SDA +void +IIC_SendAck (bit ack) +{ + SDA = ack ? 0 : 1; + IIC_Delay (); + SCL = 1; + IIC_Delay (); + SCL = 0; + SDA = 1; // 释放SDA } /** - * @brief I²C连续写入多个字节数据 - * @param devAddr : 从机地址(7位地址,左对齐) - * @param regAddr : 寄存器地址 - * @param pData : 待写入数据缓冲区 - * @param len : 数据长度 - * @retval 写入状态:1-成功,0-失败 - */ -bit IIC_WriteBytes(u8 devAddr, u8 regAddr, u8 *pData, u8 len) { - IIC_Start(); // 启动I²C通信[6](@ref) - - // 发送设备地址(写模式) - IIC_SendByte(devAddr & 0xFE); // 7位地址+写位(0) - if (!IIC_WaitAck()) { // 检测从机应答 - IIC_Stop(); - return 0; // 无应答则终止[2](@ref) + * @brief I²C连续写入多个字节数据 + * @param devAddr : 从机地址(7位地址,左对齐) + * @param regAddr : 寄存器地址 + * @param pData : 待写入数据缓冲区 + * @param len : 数据长度 + * @retval 写入状态:1-成功,0-失败 + */ +bit +IIC_WriteBytes (u8 devAddr, u8 regAddr, u8 *pData, u8 len) +{ + IIC_Start (); // 启动I²C通信[6](@ref) + + // 发送设备地址(写模式) + IIC_SendByte (devAddr & 0xFE); // 7位地址+写位(0) + if (!IIC_WaitAck ()) + { // 检测从机应答 + IIC_Stop (); + return 0; // 无应答则终止[2](@ref) } - - // 发送寄存器地址 - IIC_SendByte(regAddr); - if (!IIC_WaitAck()) { - IIC_Stop(); - return 0; // 寄存器地址无应答 + + // 发送寄存器地址 + IIC_SendByte (regAddr); + if (!IIC_WaitAck ()) + { + IIC_Stop (); + return 0; // 寄存器地址无应答 } - - // 循环发送数据字节 - while (len--) { - IIC_SendByte(*pData++); // 发送当前字节 - if (!IIC_WaitAck()) { // 检测数据应答 - IIC_Stop(); - return 0; // 数据写入失败 + + // 循环发送数据字节 + while (len--) + { + IIC_SendByte (*pData++); // 发送当前字节 + if (!IIC_WaitAck ()) + { // 检测数据应答 + IIC_Stop (); + return 0; // 数据写入失败 } } - - IIC_Stop(); // 结束通信[6](@ref) - return 1; // 写入成功 + + IIC_Stop (); // 结束通信[6](@ref) + return 1; // 写入成功 } +/** + * @brief I²C连续读取多个字节数据 + * @param devAddr : 从机地址(7位地址,左对齐) + * @param regAddr : 寄存器地址 + * @param pData : 接收数据缓冲区 + * @param len : 数据长度 + * @retval 读取状态:1-成功,0-失败 + */ +bit +IIC_ReadBytes (u8 devAddr, u8 regAddr, u8 *pData, u8 len) +{ + IIC_Start (); // 启动I²C通信 + + // 发送设备地址(写模式) + IIC_SendByte (devAddr & 0xFE); // 7位地址+写位(0) + if (!IIC_WaitAck ()) + { // 检测从机应答 + IIC_Stop (); + return 0; // 无应答则终止 + } + + // 发送寄存器地址 + IIC_SendByte (regAddr); + if (!IIC_WaitAck ()) + { + IIC_Stop (); + return 0; // 寄存器地址无应答 + } + + // 重新启动I²C通信(重复启动) + IIC_Start (); + + // 发送设备地址(读模式) + IIC_SendByte (devAddr | 0x01); // 7位地址+读位(1) + if (!IIC_WaitAck ()) + { // 检测从机应答 + IIC_Stop (); + return 0; // 无应答则终止 + } + + // 循环读取数据字节 + while (len--) + { + *pData++ = IIC_RecvByte (); // 接收当前字节 + if (len > 0) + { + IIC_SendAck (1); // 发送ACK + } + else + { + IIC_SendAck (0); // 发送NACK + } + } + + IIC_Stop (); // 结束通信 + return 1; // 读取成功 +} \ No newline at end of file diff --git a/Lib/ina226.c b/Lib/ina226.c index 82119f3..10e8777 100644 --- a/Lib/ina226.c +++ b/Lib/ina226.c @@ -21,12 +21,12 @@ void INA226_WriteReg(uint8_t reg, uint16_t value) { uint8_t data_t[2]; data_t[0] = (uint8_t)(value >> 8); data_t[1] = (uint8_t)(value & 0xFF); - I2C_WriteBytes(INA226_ADDR, reg, data_t, 2); // 需适配您的I2C驱动 + IIC_WriteBytes(INA226_ADDR, reg, data_t, 2); // 需适配您的I2C驱动 } // 寄存器读取函数 uint16_t INA226_ReadReg(uint8_t reg) { uint8_t data_t[2]; - I2C_ReadBytes(INA226_ADDR, reg, data_t, 2); // 需适配您的I2C驱动 + IIC_ReadBytes(INA226_ADDR, reg, data_t, 2); // 需适配您的I2C驱动 return (data_t[0] << 8) | data_t[1]; }