i2c.c

来自「ST7032i驱动应用实例(I2C接口)」· C语言 代码 · 共 84 行

C
84
字号
// ---------------------- Software I2C bus implementation ----------------------
/*  FileName: i2c.c
	Version : 0.1
	Last Updated: 2007-5-18
	Description:
	This library contains the necessary functions for Simulating SPI bus.
	Program Coder: Seeseawe
*/

// Start an I2C communication
void I2C_Start(void)
{
	sbi(I2C_DataPort, I2C_SDA);
	sbi(I2C_DataPort, I2C_SCL);
	DelayUs(I2C_DELAY);
	cbi(I2C_DataPort, I2C_SDA);
	DelayUs(I2C_DELAY);
	cbi(I2C_DataPort, I2C_SCL);
}

// Stop an I2C Communication
void I2C_Stop(void)
{
	cbi(I2C_DataPort, I2C_SDA);
	sbi(I2C_DataPort, I2C_SCL);
	DelayUs(I2C_DELAY);
	sbi(I2C_DataPort, I2C_SDA);
	DelayUs(I2C_DELAY);
}

// Send a byte to I2C Bus
void I2C_SendByte(uint8 dByte)
{
	uint8 i;
	for (i = 0; i < 8; i++)
	{
		if (((dByte<<i) & 0x80) == 0x80)
			sbi(I2C_DataPort, I2C_SDA);
		else
			cbi(I2C_DataPort, I2C_SDA);
		sbi(I2C_DataPort, I2C_SCL);
		DelayUs(I2C_DELAY);
		cbi(I2C_DataPort, I2C_SCL);
	}
	// Release the bus and clock out ACK signal from Slave
	sbi(I2C_DataPort, I2C_SDA);
	sbi(I2C_DataPort, I2C_SCL);
	DelayUs(I2C_DELAY);
	cbi(I2C_DataPort, I2C_SCL);
}

// Read a byte from the slave
uint8 I2C_ReadByte(void)
{
	uint8 dByte = 0;
	uint8 i;
	for ( i = 0; i < 8; i++ )
	{
		sbi(I2C_DataPort, I2C_SDA);			// Release I2C_SDA
		sbi(I2C_DataPort, I2C_SCL);			// Release I2C_SCL
		while((I2C_DataPins & (1<<I2C_SCL)) == 0);	// Synchronize clock
		DelayUs(I2C_DELAY);
		dByte <<= 1;			// Shift left the result		
		if (I2C_DataPins & (1<<I2C_SDA))
			dByte |= 0x01;		// Set actual I2C_SDA state to LSB		
		cbi(I2C_DataPort, I2C_SCL);			// Force a clock cycle
		DelayUs(I2C_DELAY);
	}
	return dByte;
}

// Send an ACK or NACK signal to the slave
void I2C_SendAck(uint8 ACK)
{
	if (ACK != 0)
		sbi(I2C_DataPort, I2C_SDA);
	else
		cbi(I2C_DataPort, I2C_SDA);
	sbi(I2C_DataPort, I2C_SCL);
	while((I2C_DataPins & (1<<I2C_SCL)) == 0);   // Synchronize clock
	DelayUs(I2C_DELAY);
	cbi(I2C_DataPort, I2C_SCL);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?