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

下载本文档

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

文档简介

1、/*-24C02.h-*/#ifndef _24C02_H#define_24C02_H/* Includes -*/#include STC15F2K60S2.h#include stdbool.h/* Define -*/#define WC24C02 0xa0/ 器件地址写#define RC24C02 0xa1/ 器件地址读#define MAXSIZE24C02256/AT24C02最多256 个字节2K bits 32页#define I2C_PAGESIZE8/AT24C02每页有8 个字节#define delayNOP() _nop_();_nop_();_nop_();_n

2、op_()/ 延时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(

3、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

4、_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)COPYRIGHT2014xxxx*文件名: 24c02.c*描述:本函数是xxxxx 的 24C02 的读写函数 注 :器件地址 0xa0 数据地址 :00H-FFH2K bits 256Byt

5、e*平台: 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;/SDASDA=0;delayNOP();delayNOP();while(SDA)return false; /SDASCL=0;delayNOP();线为低电平则总线忙线为高电平则总

6、线出错,退出,退出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

7、;delayNOP();/ delayNOP();SCL=0;/*读取 ACK 信号 */bool I2CWaitAck(void)/返回为:1=有ACK,0=无ACKSCL=0;SDA=1;delayNOP();/设置SDA为输入/ 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=

8、(bool)(demand&0x80);demand=1;delayNOP();/delayNOP();SCL=1;delayNOP();/delayNOP();SCL=0;/*MCU从 24c02u8 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 fa

9、lse;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 WriteA

10、ddr is I2C_PAGESIZE alignedif(Addr = 0)*/* If n I2C_PAGESIZE */elsewhile(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

11、WriteAddr is not I2C_PAGESIZE aligned*/else/* If n I2C_PAGESIZE */elsen -= 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, Wr

12、iteAddr, 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 的数据地

13、址*-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;for(i =

温馨提示

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

评论

0/150

提交评论