i2c.c

来自「1307c代码」· C语言 代码 · 共 146 行

C
146 行
字号
#include "i2c.h"

/**********************************************************************************
(1)	void StartIIC(void)          
(2)	函数功能:启动IIC总线
(3)	入口参数:void
(4)	出口参数:void
(5)	修改的外部变量(全局变量) 说明
(6)	修改人    	 修改日期
(7) 修改内容
*********************************************************************************/
void StartIIC(void)
{
	SCL = 1;//将时钟线置高
	_nop_();
	_nop_();//稳定时间2uS
	SDA = 1;//将数据线置高
	_nop_();
	_nop_();//稳定时间2uS
	SDA = 0;//将数据线置低
	_nop_();
	_nop_();
	_nop_();
	_nop_();//启动时间4uS
	SCL = 0;//将时钟线置低
	_nop_();
	_nop_();//稳定时间2uS
}

/**********************************************************************************
(1)	void StopIIC(void)          
(2)	函数功能:停止IIC总线
(3)	入口参数:void
(4)	出口参数:void
(5)	修改的外部变量(全局变量) 说明
(6)	修改人    	 修改日期
(7) 修改内容
*********************************************************************************/
void StopIIC(void)
{
  SDA=0;  /*发送结束条件的数据信号*/
  _nop_();   /*发送结束条件的时钟信号*/
  SCL=1;  /*结束条件建立时间大于4μs*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  SDA=1;  /*发送I2C总线结束信号*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/**********************************************************************************
(1)	void AckIIC(bit bAckFlag)          
(2)	函数功能:主控器应答信号
(3)	入口参数:bAckFlag=0-ACK,bAckFlag=1-NACK.
(4)	出口参数:void
(5)	修改的外部变量(全局变量) 说明
(6)	修改人    	 修改日期
(7) 修改内容
*********************************************************************************/
void AckIIC(bit bAckFlag)
{
	SDA = bAckFlag;
	_nop_();//稳定时间1uS
	SCL =1;//时钟置高
	_nop_();
	_nop_();
	_nop_();//稳定时间3uS
	SCL =0;//时钟置低		
	_nop_();//稳定时间1uS
	SDA = 1;//将数据线置高
}

/**********************************************************************************
(1)	unsigned char SendOneByte(unsinged char ucByte)       
(2)	函数功能:IIC总线发送一个字节
(3)	入口参数:要写的字节ucByte.
(4)	出口参数:ACK-return 0,NACK-return 1.
(5)	修改的外部变量(全局变量) 说明
(6)	修改人    	 修改日期
(7) 修改内容
*********************************************************************************/
unsigned char SendOneByte(unsigned char ucSendByte)
{
	unsigned char ucBitCount;
	unsigned char ucReturnByte;
	for(ucBitCount=0; ucBitCount<8; ucBitCount++)
	{
		if(ucSendByte&0x80)	SDA = 1;//数据位为高
		else            SDA = 0;//数据位为低
		do
		{
			_nop_();//稳定时间1uS
			SCL = 1;//时钟置高
			_nop_();//稳定时间1uS
		}
		while(!SCL);//时钟信号被钳位
		//_nop_();_nop_();//稳定时间2uS
		SCL = 0;//时钟置低
		//_nop_();//稳定时间1uS
		ucSendByte <<= 1;//发送字节左移一位
	}
	SDA = 1;//数据线置高,准备检测应答信号
	_nop_();//稳定时间1uS
	SCL = 1;//时钟置高
	_nop_();_nop_();//稳定时间2uS
	if(SDA) ucReturnByte = 0x01;
	else ucReturnByte = 0x00;
	SCL = 0;//时钟置低
	_nop_();_nop_();//稳定时间2uS
	return (ucReturnByte);
}


/**********************************************************************************
(1)	unsigned char ReceiveOneByte(void)          
(2)	函数功能:IIC总线接收一个字节
(3)	入口参数:void
(4)	出口参数:接收到的字节
(5)	修改的外部变量(全局变量) 说明
(6)	修改人    	 修改日期
(7) 修改内容
*********************************************************************************/
unsigned char ReceiveOneByte(void)
{
	unsigned char ucBitCount;
	unsigned char ucReceiveByte;
	SDA = 1;//置数据线为输入方式
	for(ucBitCount=0; ucBitCount<8; ucBitCount++)
	{
		SCL = 0;//时钟置低
		_nop_();//稳定时间1uS
		SCL = 1;//时钟置高
		_nop_();//稳定时间1uS
		ucReceiveByte <<= 1;//左移一位,LSB=0.
		if(SDA)  ucReceiveByte += 1;//如果SDA=1,LSB=1.
	}
	SCL = 0;//时钟置低
	return(ucReceiveByte);
}

⌨️ 快捷键说明

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