📄 i2c.c
字号:
/*-------------------------------------------------------------------------
I2C.C
Copyright 2004 Macronix International Co., Ltd.
-------------------------------------------------------------------------*/
#define _I2C_
#include "..\inc\public2.h"
#define I2C_ACK 0
#define I2C_NACK 1
void I2C_SendStart(void);
void I2C_SendStop(void);
void I2C_SendACK(bit);
void I2C_SendByte(unsigned char );
unsigned char I2C_GetByte(bit);
//-------------------------------------------------------------------
// I2C_ReleaseBus(void)
//-------------------------------------------------------------------
void I2C_Delay(unsigned char value)
{
while(value>0)
value--;
}
//-------------------------------------------------------------------
// I2C_SendStart(void)
//-------------------------------------------------------------------
void I2C_SendStart(void)
{
I2C_SDA = 1;
I2C_SCL = 1;
I2C_Delay(2);
I2C_SDA = 0;
I2C_Delay(2);
I2C_SCL = 0;
}
//-------------------------------------------------------------------
// I2C_SendStop(void)
//-------------------------------------------------------------------
void I2C_SendStop(void)
{
I2C_SDA = 0;
I2C_SCL = 1;
I2C_Delay(2);
I2C_SDA = 1;
I2C_Delay(2);
}
//-------------------------------------------------------------------
// I2C_SendByte(unsigned char val)
//-------------------------------------------------------------------
void I2C_SendByte(unsigned char val)
{
unsigned char i;
for (i=0; i<8; i++)
{
I2C_SDA = (bit)(val & 0X80);
I2C_SCL = 1;
val <<= 1;
I2C_Delay(1);
I2C_SCL = 0;
}
I2C_SDA = 1;
I2C_SCL = 1;
I2C_Delay(1);
I2C_SCL = 0;
}
//-------------------------------------------------------------------
// I2C_GetByte(bit ACK_NACK)
// ACK ->I2C_SDA = 0
// NACK ->I2C_SDA = 1
//-------------------------------------------------------------------
unsigned char I2C_GetByte(bit ACK_NACK)
{
unsigned char i;
unsigned char rd_byte;
rd_byte = 0;
for(i=0; i<8; i++)
{
I2C_SCL = 1;
rd_byte <<= 1;
I2C_Delay(1);
rd_byte |= I2C_SDA;
I2C_SCL = 0;
}
I2C_SDA = ACK_NACK;
I2C_SCL = 1;
I2C_Delay(1);
I2C_SCL = 0;
I2C_SDA = 1;
return(rd_byte);
}
/**--------------------------------------------------------------------------
* Name void I2C_Write(unsigned char dev_addr, unsigned char start_addr,
* unsigned char count , unsigned char *write_buf)
*
* Description WRITE Control register BY I2C
*
* Flow Chart 1.Send Module Write ID address
* 2.Send Subaddress
* 3.Send Data(n byte)
*
* Return
*
* DATE Author Description
* ===========================================================================
**/
void I2C_Write(unsigned char dev_addr, unsigned char start_addr, unsigned char count , unsigned char *write_buf)
{
unsigned char i;
I2C_SendStart();
I2C_SendByte(dev_addr); //Write W_ID
I2C_SendByte(start_addr); //Write Address
for(i=0;i<count;i++)
{
I2C_SendByte(*(write_buf+i)); //Write multi-data
}
I2C_SendStop(); //Stop
}
void I2C_WriteByte(unsigned char dev_addr, unsigned char start_addr, unsigned char write_byte)
{
I2C_SendStart();
I2C_SendByte(dev_addr); //Write W_ID
I2C_SendByte(start_addr); //Write Address
I2C_SendByte(write_byte); //Write data
I2C_SendStop(); //Stop
}
/**--------------------------------------------------------------------------
* Name void I2C_Read(unsigned char dev_addr, unsigned char start_addr,
* unsigned char count, unsigned char *DATA_BUF )
*
* Description READ Control register BY I2C
*
* Flow Chart 1.Send Module Write ID address
* 2.Send Subaddress
* 3.Send Module Read ID address
* 4.Read Data(n byte)
*
* Return
*
* DATE Author Description
* ===========================================================================
**/
void I2C_Read(unsigned char dev_addr, unsigned char start_addr, unsigned char count, unsigned char *DATA_BUF)
{
unsigned char i;
I2C_SendStart();
I2C_SendByte(dev_addr); //Write W_ID
I2C_SendByte(start_addr); //Write Address
I2C_SendStart();
I2C_SendByte(dev_addr|0X01); //Write W_ID
for(i=0;i<count-1;i++)
{
*(DATA_BUF+i)=I2C_GetByte(I2C_ACK); //Read data from device(burst mode)
}
*(DATA_BUF+i) = I2C_GetByte(I2C_NACK); //Read the last data then send NACK to STOP
I2C_SendStop(); //Stop
}
unsigned char I2C_ReadByte(unsigned char dev_addr, unsigned char start_addr)
{
unsigned char rd_byte;
I2C_SendStart();
I2C_SendByte(dev_addr); //Write W_ID
I2C_SendByte(start_addr); //Write Address
I2C_SendStart();
I2C_SendByte(dev_addr|0X01); //Write W_ID
rd_byte = I2C_GetByte(I2C_NACK); //Read the last data then send NACK to STOP
I2C_SendStop(); //Stop
return(rd_byte);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -