⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 1307c代码
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -