24C02 I2C 驱动程序(详细 全).doc_第1页
24C02 I2C 驱动程序(详细 全).doc_第2页
24C02 I2C 驱动程序(详细 全).doc_第3页
24C02 I2C 驱动程序(详细 全).doc_第4页
24C02 I2C 驱动程序(详细 全).doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*-24C02.h-*/#ifndef _24C02_H#define_24C02_H/* Includes -*/#include STC15F2K60S2.h#include stdbool.h/* Define -*/#define WC24C02 0xa0/器件地址 写#define RC24C02 0xa1/器件地址 读#define MAXSIZE24C02 256/AT24C02最多256个字节 2K bits 32页#define I2C_PAGESIZE 8/AT24C02每页有8个字节#define delayNOP() _nop_();_nop_();_nop_();_nop_() /延时sbit SDA = P25;/定义数据线sbit SCL = P26;/定义时钟线/* Private -*/* Public -*/uint idata ucSendBuffer8=0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80;uint idata ucReceData;uint idata ucReceiveBuffer8;/从器件中读出的多字节数据暂存区/* Function Declaration -*/bool I2CStart(void);/启动I2Cvoid I2CStop(void);/停止I2Cvoid I2CAck(void);/应答信号void I2CNoAck(void);/发送非应答信号bool I2CWaitAck(void);/检测应答位void I2CSendByte(u8 demand);/发送一字节数据u8 I2CReceiveByte(void);/接收一字节数据/extern bool I2C_ByteWrite(u8* pBuffer, u8 WriteAddr);/向24c02中写入1个字节extern bool I2C_PageWrite(u8* pBuffer, u8 WriteAddr, u8 n);/24c02页写 (不超过一页)extern bool I2C_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 n);/24c02数据块写 (不超过256个字节)extern bool I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 n);/从24C02中读出N字节数据(不超过256个字节)#endif/*-end file-*/*-24C02.c-*/* (C) COPYRIGHT 2014 xxxx * * 文件名 :24c02.c * 描述 :本函数是xxxxx的24C02的读写函数 注:器件地址0xa0 数据地址:00H-FFH 2K bits 256Byte * 平台 :Keil 4 A51 * 库版本 :使用了宏晶科技的相关资料及程序 STM库3.50 I2C程序 * 作者 :xxxxxx * 时间 :2014.9.3*/* Includes -*/#include 24c02.h/*开启24c02的I2C总线*/bool I2CStart(void)SDA=1;SCL=1;delayNOP();delayNOP();if(!SDA)return false;/SDA线为低电平则总线忙,退出SDA=0;delayNOP();delayNOP();while(SDA)return false;/SDA线为高电平则总线出错,退出SCL=0;delayNOP();return true;/*关闭24c02的I2C总线*/void I2CStop(void)SDA=0;SCL=0;delayNOP();delayNOP();SCL=1;delayNOP();delayNOP();SDA=1;/*发送 ACK*/void I2CAck(void)SDA=0;SCL=0;delayNOP();/delayNOP();SCL=1;delayNOP();/delayNOP();SCL=0;/*发送NO ACK*/void I2CNoAck(void)SDA=1;SCL=0;delayNOP();/delayNOP();SCL=1;delayNOP();/delayNOP();SCL=0;/*读取ACK信号*/bool I2CWaitAck(void) /返回为:1=有ACK,0=无ACKSCL=0;SDA=1;/设置SDA为输入delayNOP();/delayNOP();SCL=1;delayNOP();/delayNOP();if(SDA)SCL=0;return false;SCL=0;return true;/*MCU向24c02发送一个字节数据 */void I2CSendByte(u8 demand) /数据从高位到低位/u8 i=8; while(i-)SCL=0;_nop_();SDA=(bool)(demand&0x80);demand=1;delayNOP();/delayNOP();SCL=1;delayNOP();/delayNOP();SCL=0;/*MCU从24c02读入一字节数据*/u8 I2CReceiveByte(void) /数据从高位到低位/u8 i=8;u8 ddata=0;SDA=1;/设置SDA为输入while(i-)ddata=1; /数据从高位开始读取SCL=0;delayNOP();/delayNOP();SCL=1;delayNOP();/从高位开始 ddata|=SDA;ddata I2C_PAGESIZE | !n)return false;I2CStart();/启动I2CI2CSendByte(WC24C02);/发送器件地址 写if(I2CWaitAck() = 0) return false;I2CSendByte(WriteAddr);if(I2CWaitAck() = 0) return false;for(i = 0; i MAXSIZE24C02)return 0; Addr = WriteAddr % I2C_PAGESIZE; count = I2C_PAGESIZE - Addr; NumOfPage = n / I2C_PAGESIZE; NumOfSingle = n % I2C_PAGESIZE; /* If WriteAddr is I2C_PAGESIZE aligned */ if(Addr = 0) /* If n I2C_PAGESIZE */ else while(NumOfPage-) if(I2C_PageWrite(pBuffer, WriteAddr, I2C_PAGESIZE) = false)return false; WriteAddr += I2C_PAGESIZE; pBuffer += I2C_PAGESIZE; if(NumOfSingle!=0) if(I2C_PageWrite(pBuffer, WriteAddr, NumOfSingle) = false)return false; /* If WriteAddr is not I2C_PAGESIZE aligned */ else /* If n I2C_PAGESIZE */ else n -= count; NumOfPage = n / I2C_PAGESIZE; NumOfSingle = n % I2C_PAGESIZE; if(count != 0) if(I2C_PageWrite(pBuffer, WriteAddr, count) = false)return false; WriteAddr += count; pBuffer += count; while(NumOfPage-) if(I2C_PageWrite(pBuffer, WriteAddr, I2C_PAGESIZE) = false)return false; WriteAddr += I2C_PAGESIZE; pBuffer += I2C_PAGESIZE; if(NumOfSingle != 0) if(I2C_PageWrite(pBuffer, WriteAddr, NumOfSingle) = false)return false; return true;/*名称:bool I2C_BufferRead*功能:从24C02中读出读取一块数据(不超过256个字节) * 输入 :-pBuffer 缓冲区指针 * -ReadAddr EEPROM的数据地址 * -n 要从EEPROM读出的字节数 * 返回 :0:失败 1:成功 * 调用 :外部调用*/bool I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 n)uint i;if(n MAXSIZE24C02)return 0;I2CStart();/启动I2CI2CSendByte(WC24C02);/发送器件地址 写if(I2CWaitAck() = 0) return false;I2CSendByte(ReadAddr);/发送器件内部地址if(I2CWaitAck() = 0) return false;I2CStart();I2CSendByte(RC24C02);/发送器件地址 读if(I2CWaitAck() = 0) return false;fo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论