OLED INA226基本完成
This commit is contained in:
146
Source/iic.c
146
Source/iic.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user