OLED INA226基本完成

This commit is contained in:
2025-09-01 22:43:03 +08:00
parent be600d0769
commit 8154cad6bc
22 changed files with 3258 additions and 1177 deletions

View File

@@ -16,13 +16,6 @@ void iic_delay_us(uint16 x) //33.1776Mhz
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
uint8 wait(void)
{
uint16 count = 0;
@@ -40,12 +33,6 @@ uint8 wait(void)
return ret;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
uint8 start(void)
{
uint8 ret;
@@ -54,12 +41,6 @@ uint8 start(void)
return ret;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
uint8 send_data(char dat)
{
uint8 ret;
@@ -69,12 +50,6 @@ uint8 send_data(char dat)
return ret;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
uint8 recv_ack(void)
{
uint8 ret;
@@ -83,12 +58,6 @@ uint8 recv_ack(void)
return ret;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
char recv_data(void) //接收数据
{
I2CMSCR = 0x04; //发送RECV命令
@@ -96,12 +65,6 @@ char recv_data(void) //接收数据
return I2CRXD;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
uint8 send_ack(void)
{
uint8 ret;
@@ -111,12 +74,6 @@ uint8 send_ack(void)
return ret;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
void send_nak(void)
{
I2CMSST = 0x01; //设置NAK信号
@@ -124,12 +81,6 @@ void send_nak(void)
wait();
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 内部使用用户无需关心
// @param NULL
// @return void
// Sample usage: 无需用户调用用户请使用h文件中的宏定义
//-------------------------------------------------------------------------------------------------------------------
uint8 stop(void)
{
uint8 ret;
@@ -139,6 +90,33 @@ uint8 stop(void)
}
void iic_scan(void)
{
uint8 i;
for(i = 0; i <= 0x7F; i++) { //7位SlaveAddress
uint8 ACK_or_NACK = 0;
start();
printf(".");
send_data((i << 1) | 0); //I2C从地址+写标志
I2CMSCR = 0x03;
while(!(I2CMSST & 0x40));
if(I2CMSST & 0x02) //判断I2CMSST的bit1 MSACKI,读入的ACK信号为低即是ACK,为高为NACK.
ACK_or_NACK = 0; //MSACKI=1=NACK=没有正确收到ACK信号
else
ACK_or_NACK = 1; //MSACKI=0=ACK=正确收到ACK信号
I2CMSST &= ~0x40; //清除中断标志
if(ACK_or_NACK) {
printf("\r\nFound Device Address:0x%02X\r\n", i);
// UART_SendHex(i);
// printf("%02x",i);
} else {
stop();
}
}
}
//#define UNUSED(expr1, expr2) do { if(scl_pin == sda_pin); } while (0)
@@ -213,6 +191,40 @@ uint8 iic_write_reg(uint8 dev_add, uint8 reg, uint8 dat)
return IIC_SEND_OK;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 写入多个字节数据到I2C设备指定寄存器地址
//-------------------------------------------------------------------------------------------------------------------
uint8 iic_write_reg_bytes(uint8 dev_add, uint8 reg, uint8 *dat, uint8 num)
{
if(start() != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(send_data((dev_add<<1) | 0x00) != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(recv_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(send_data(reg) != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(recv_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
while(num--)
{
if(send_data(*dat) != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(recv_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
dat++;
}
// if(recv_ack() != IIC_SEND_OK)
// return IIC_SEND_FAIL;
if(stop() != IIC_SEND_OK)
return IIC_SEND_FAIL;
return IIC_SEND_OK;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 读取I2C设备指定地址寄存器的数据
// @param iic_n I2C通道号及引脚
@@ -237,8 +249,10 @@ uint8 iic_read_reg(uint8 dev_add, uint8 reg, uint8 *dat)
return IIC_SEND_FAIL;
if(recv_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
// if(stop() != IIC_SEND_OK)
// return IIC_SEND_FAIL;
if(start() != IIC_SEND_OK)
return IIC_SEND_FAIL;
// if(start() != IIC_SEND_OK)
// return IIC_SEND_FAIL;
@@ -288,26 +302,38 @@ uint8 iic_read_reg_bytes(uint8 dev_add, uint8 reg
return IIC_SEND_FAIL;
if(recv_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
// if(stop() != IIC_SEND_OK)
// return IIC_SEND_FAIL;
if(start() != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(send_data((dev_add<<1) | 0x01) != IIC_SEND_OK)
return IIC_SEND_FAIL;
if(recv_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
while(--num)
while(num--)
{
*dat = recv_data(); //读取数据
if(send_ack() != IIC_SEND_OK)
{
return IIC_SEND_FAIL;
}
dat++;
if(num==0)
{
send_nak();
}
else
{
if(send_ack() != IIC_SEND_OK)
{
return IIC_SEND_FAIL;
}
dat++;
}
}
*dat = recv_data();
// *dat = recv_data();
if(send_ack() != IIC_SEND_OK)
return IIC_SEND_FAIL;
// if(send_ack() != IIC_SEND_OK)
// return IIC_SEND_FAIL;
if(stop() != IIC_SEND_OK)
return IIC_SEND_FAIL;