📄 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 + -