/*******************************************************************************
Copyright @ 2007 Centron Telecom All rights reserved
* File Name: I2C.c
* Author: MingliangBi
* Email: [email protected]
* 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;
}
I2C.rar_C8051F I2C
版权申诉
190 浏览量
2022-09-20
15:10:38
上传
评论
收藏 4KB RAR 举报
邓凌佳
- 粉丝: 65
- 资源: 1万+
最新资源
- 基于QT+C++的智能云监护仪项目,能够实时显示使用者心电、血氧、血压波形及其它各种参数+源码(毕业设计&课程设计&项目开发)
- 基于java开发的app接收硬件端传输的心音信号,具有显示心音波形,发出心音的功能+源码(毕业设计&课程设计&项目开发)
- Python 程序语言设计模式思路-行为型模式:职责链模式:将请求从一个处理者传递到下一个处理者
- 9241703124789646.16健身系统2.apk
- postgresql-16.3-1-windows-x64.exe
- Python 程序语言设计模式思路-结构型模式:装饰器讲解及利用Python装饰器模式实现高效日志记录和性能测试
- 基于YOLOv5和DeepSORT的多目标跟踪仿真与记录
- Python 程序语言设计模式思路-创建型模式:原型模式:通过复制现有对象来创建新对象,面向对象编程
- 卸载软件geek卸载软件geek
- Python 程序语言设计模式思路-创建型模式:单例模式,确保一个类的唯一实例(装饰器)面向对象编程、继承
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈