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

📄 i2c.c

📁 I2C协议机制
💻 C
字号:
/*******************************************************************************
				   Copyright @ 2007 Centron Telecom All rights reserved
* File Name: I2C.c

* Author: MingliangBi

* Email: liangzi0708@163.com

* Date: 2008/03/17

* Version: 1.00

* Description: explant I2C Protocol V2.0 on Atmega128

* History:   2008/03/17    MingliangBi        V1.00
*******************************************************************************/
#include "App\Global.h"
#include "App\time.h"
#include "C8051F020.h"
#include "I2C.h"
/*******************************************************************************
* 函数名称: I2C_WriteByte
* 功能描述: 向目标器件写入一个字节数据
* 入口参数: DeviceWriteAddress,目标器件的写地址
		  WordAddress,目标器件待写入的存储单元地址(>8位,分两次发送)
		  WriteData,待写入的字节数据	
* 返回值  : OK,操作成功;NG,操作失败
*******************************************************************************/
BOOLEAN I2C_WriteBlock(INT8U DeviceWriteAdd,INT8U *pWriteData,INT16U StartWordAdd,INT16U size)
{
    INT16U i;
	i=0;
	//第一步:产生起始条件
	I2CStart();
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_START)
	return NG;
	I2C_CLEAR_START_BIT();
	
	//第二步:发送目标器件写地址
	I2CSendByte(DeviceWriteAdd);   
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_MT_SLA_ACK)
	return NG;
	
	//第三步:发送存储存储字节高地址
	I2CSendByte((INT8U)((StartWordAdd&0xFF00)>>8));
	I2CWaitAck();
	if((I2CCheckAck()!=I2C_MT_DATA_ACK))
	return NG;
	
	//第四步:发送存储存储字节低地址
	I2CSendByte((INT8U)(StartWordAdd&0x00FF));
	I2CWaitAck();
	if((I2CCheckAck()!=I2C_MT_DATA_ACK))
	return NG;
	
	//第五步:连续发送字节数据
	for(i=0;i<size;i++)
	{
		I2CSendByte(*pWriteData);
		pWriteData++;
		I2CWaitAck();
		if((I2CCheckAck()!=I2C_MT_DATA_ACK))
		return NG;
	}
	//第六步:产生结束条件
	I2CStop();
	return OK;
}
/*******************************************************************************
* 函数名称: I2C_ReadByte
* 功能描述: 从目标器件读取一个字节数据
* 入口参数: DeviceWriteAddress,目标器件的写地址
		  WordAddress,目标器件待读取的存储单元地址(>8位,分两次发送)
		  DeviceReadAddress,目标器件的读地址
            pReadData,返回指向存储单元值的指针		  	
* 返回值  : OK,操作成功;NG,操作失败
*******************************************************************************/
BOOLEAN I2C_ReadBlock(INT8U DeviceWriteAdd,INT8U DeviceReadAdd,INT8U *pReadData,INT16U StartWordAdd,INT16U size)
{
    INT16U i;
	i=0;
	//第一步:产生起始条件
	I2CStart();
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_START)
	return NG;
	I2C_CLEAR_START_BIT();
	
	//第二步:发送目标器件写地址
	I2CSendByte(DeviceWriteAdd);   
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_MT_SLA_ACK)
	return NG;
	
	//第三步:发送存储存储字节高地址
	I2CSendByte((INT8U)((StartWordAdd&0xFF00)>>8));
	I2CWaitAck();
	if((I2CCheckAck()!=I2C_MT_DATA_ACK))
	return NG;
	
	//第四步:发送存储存储字节低地址
	I2CSendByte((INT8U)(StartWordAdd&0x00FF));//此处数据传输错误,改写格式如下:
	//I2CSendByte(0x10);
	I2CWaitAck();
	if((I2CCheckAck()!=I2C_MT_DATA_ACK))
	return NG;

	//第五步:重启动
	//I2C_CLEAR_INT_BIT();//重启动前清除中断
	//I2CStart();
	I2CRestart();
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_RESTART)
	return NG;
	I2C_CLEAR_START_BIT();

	//第六步:发送目标器件的读地址
	I2CSendByte(DeviceReadAdd);   
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_MR_SLA_ACK)
	return NG;

	//第七步:接收数据,完毕产生NACK    连续接收数据
	for(i=0;i<size-1;i++)
	{
		I2CSendAck();
		I2CWaitAck();
		if(I2CCheckAck()!=I2C_MR_DATA_ACK)
		break;
		*pReadData=I2C_DATA_REGISTER;
		pReadData++;
	}
	//接收最后一个字节数据不需要回馈
	I2CSendNAck();  
	I2CWaitAck();
	if(I2CCheckAck()!=I2C_MR_DATA_NACK)
	return NG;
	*pReadData=I2C_DATA_REGISTER;

	//第八步:结束数据传输
	I2CStop();
	return OK;
}

⌨️ 快捷键说明

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