版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单击此处编辑母版标题样式单击此处编辑母版文本样式第二级第三级第四级第五级*单击此处编辑母版标题样式单击此处编辑母版文本样式第二级第三级第四级第五级单击此处编辑母版标题样式单击此处编辑母版文本样式第二级第三级第四级第五级2.4 I2C总线及其驱动程序 目 录 1 I2C简介 2 决策 3 软件接口 4 基本时序代码 5 外部接口代码 6 E2PROM读写范例 7 CAT1024驱动程序 8 温度的测量 I2C简介I 微控器 外围器件 I2C总线 2 C I2C总线特点 I2C总线 容易实现 总线自检 可挂接 多个器件通信距离远 兼顾高低速率通讯总线 兼容性好 终端I/O开漏总线电气兼容性好目 录
2、 1 I2C简介 2 决策 3 软件接口 4 基本时序代码 5 外部接口代码 6 E2PROM读写范例 7 CAT1024驱动程序 8 温度的测量 I2C驱动决策 标准80C51单片机无硬件I2C接口 使用I/O模拟I2C总线时序难以实现完整协议 通信模式 总线仲裁 通信速率 地址模式 原因 实现 仅实现主机功能仅支持一条I2C总线 只有一个主机80C51删除I2C主机总线仲裁 仅支持7位地址模式 通信速率在软件编译前确定不支持高速模式 目 录 1 I2C简介 2 决策 3 软件接口 4 基本时序代码 5 外部接口代码 6 E2PROM读写范例 7 CAT1024驱动程序 8 温度的测量 I2
3、C软件接口 从机 I2C总线 主机 从机具有I2C地址,内部存放器均对应具体地址 主机对从机的操作即对存放器的读写操作 初始化 读操作 写操作 I2C软件接口 /* Function name: char zyI2cInit (void)* Descriptions: 初始化I2C为主模式* input parameters: 无* output parameters: 无* Returned value: 0:成功-1:失败*/ 初始化 I2C软件接口 /* Function name: unsigned char zyI2cWrite (unsigned char ucAddr, unsi
4、gned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, unsigned char ucDataLen)* Descriptions: 将数据写入I2C从器件* input parameters: ucAddr:从机地址* uiRegAddr:存放器地址* ucRegAddrLen:存放器地址长度单位为字节* pucData:要写入的数据* ucDataLen:要写入的数据长度* output parameters: 无* Returned value: 已写入的数据字节数*/ 写数据 I2C软件接口 /*
5、 Function name: unsigned char zyI2cRead (unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, unsigned char ucDataLen)* Descriptions: 从I2C器件读数据* input parameters: ucAddr:从机地址* uiRegAddr:存放器地址* ucRegAddrLen:存放器地址长度单位为字节* ucDataLen:要写入的数据长度* output paramete
6、rs: pucData:读到的数据* Returned value: 已读到的数据字节数*/ 读数据 配置接口 #define _ZY_I2C_DELAY( ) ACC=ACC; /等待1/2个I2C周期#define _ZY_I2C_SDA P1_1; /SDA引脚配置#define _ZY_I2C_SCL P1_0; /SSL引脚配置 I2C驱动配置文件(I2C_cfg.h) NOP 函数名称函数功能_zyI2cStartSend()启动总线_zyI2cStopSend()停止总线_zyI2cRestartSend()重启总线_zyI2cBitSend()发送一位数据_zyI2cBitRe
7、ceive()接收一位数据_zyI2cAckSend()发送ACK信号_zyI2cNakSend()发送NAK信号_zyI2cIsAck()接收反馈信号(ACK/NAK)_zyI2cByteSend()发送一个字节数据_zyI2cByteReceive()接收一个字节数据内部协议层函数接口 内部协议层函数一览表 目 录 1 I2C简介 2 决策 3 软件接口 4 基本时序代码 5 外部接口代码 6 E2PROM读写范例 7 CAT1024驱动程序 8 温度的测量 发送一位数据的时序 SCL高电平期间 采样SDA信号 SDA SCL SDA SCL 此时序禁止在发送数据时出现 总线起始或结束控制
8、 发送一位数据函数 SDA(I/O) SCL(I/O) 80C51 static void _zyI2cBitSend(unsigned char ucData) if (ucData & 0 x80) _ZY_I2C_SDA = 1; else _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 1; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 0; SDA SCL I2C从机 SDA SCL I2C从机 接收一位数据函数 static unsigned char _zyI2cBitReceive(void) unsigned c
9、har ucRt; /返回值 _ZY_I2C_DELAY(); _ZY_I2C_SCL = 1; _ZY_I2C_DELAY(); ucRt = _ZY_I2C_SDA; _ZY_I2C_SCL = 0; return ucRt; SDA(I/O) SCL(I/O) 80C51 发送起始信号 static void _zyI2cStartSend (void) _ZY_I2C_DELAY(); _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 0;SDA(I/O) SCL(I/O) 80C51 SDA SCL I2C从机 忙 在SCL处于高电平期间
10、,SDA从高电平向低电平跳变 空闲时两线均为高电平 发送停止信号 static void _zyI2cStartSend (void) _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 1; _ZY_I2C_DELAY(); _ZY_I2C_SDA = 1;SDA(I/O) SCL(I/O) 80C51 SDA SCL I2C从机 在SCL处于高电平期间,SDA从低电平向高电平跳变 空闲时SDA状态未知,需手动拉低 闲 发送重复起始信号 static void _zyI2cStartSend (void) _ZY_I2C_SDA = 1; _ZY_
11、I2C_DELAY(); _ZY_I2C_SCL = 1; _ZY_I2C_DELAY(); _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 0;重复起始信号主要用于I2C总线总线在读写方向切换。起始信号产生时总线处于空闲状态,而重复起始信号产生时总线处于忙状态。SDA(I/O) SCL(I/O) 80C51 SDA SCL I2C从机 在I2C总线忙时,产生起始条件,以改变数据收发方向。 忙状态 起始信号 应答和非应答 SDA(I/O) SCL(I/O) 80C51 SDA SCL I2C从机 每个字节的传输,都紧跟一个应答状态位,来反映接收端
12、的情况 谁接收谁应答 应答:ACK(A),应答位为0;非应答:NAK(/A),应答位为1 产生非应答后应终止数据的发送 数据 应答 应答原则 时钟 发送应答和非应答信号 static void _zyI2cAckSend (void)_ZY_I2C_SDA = 0;_ZY_I2C_DELAY();_ZY_I2C_SCL = 1;_ZY_I2C_DELAY();_ZY_I2C_SCL = 0; static void _zyI2cNakSend(void)_ZY_I2C_SDA = 1;_ZY_I2C_DELAY();_ZY_I2C_SCL = 1;_ZY_I2C_DELAY();_ZY_I2C
13、_SCL = 0; SDASCL12891289起始信号应答信号非应答信号停止信号例 应答信号的处理 static void _zyI2cIsAck (void)_ZY_I2C_SDA = 1;_ZY_I2C_DELAY( );_ZY_I2C_SCL = 1;_ZY_I2C_DELAY( );if (_ZY_I2C_SDA = 1) _ZY_I2C_SCL = 0; return 0; _ZY_I2C_SCL = 0;return 1;/ 接收应答准备 / 接收到应答 / 接收到非应答 发送一个字节的数据 static void _zyI2cByteSend (unsigned char uc
14、Data)unsigned char i;/ 发送数据i = 8;do _zyI2cBitSend(ucData); ucData=ucData 1; while (-i ! = 0);1 0 1 0 1 0 1 0 主机 MSBLSB从机 MSBLSB程序示例 接收一个字节的数据 static unsigned char _zyI2cByteReceive(void)unsigned char ucRt;unsigned char i;/ 接收数据i = 8;do ucRt = (ucRt 0) _zyI2cBytesend(uiRegAddr); if (! _zyI2cIsAck() b
15、reak; ucRegAddrLen-;uiRegAddr = uiRegAddr 8; if (ucRegAddr Len = 0) do _zyI2cIByteSend(*pucData+);if (!_zyI2cIsAck) break; while (-i != 0);_zyI2cStopSend();return(ucDataLen - i); 启动总线发送器件写地址接收ACK发送寄存器地址0接收ACK发送寄存器地址m-1接收ACK发送数据0接收ACK发送数据n-1接收ACK停止总线向从机写多个数据源代码 函数定义检查参数的正确性发送起始信号发送起始写地址发送寄存器地址发送数据发送停
16、止信号unsigned char zyI2cRead(unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen,unsigned char *pucData, unsigned char uc DataLen) unsigned char i; if (ucDataLen = 0 | pucData = 0) return 0; _zyI2cStartSend(); _zyI2cByteSend(ucAddr&0 xfe); if (_zyI2cIsAck) while(ucRegAddrLen 0) _z
17、yI2cBytesend(uiRegAddr); if (! _zyI2cIsAck() break; ucRegAddrLen-;uiRegAddr = uiRegAddr 8; if (ucRegAddr Len = 0) _zyI2cRestartSend();_zyI2cSend(ucAddr | 0 x01);if (_zyI2cIsAck() i = ucDataLen-1; while (i- != 0) *pucData+ = _zyI2cBytereceive(); _zyI2cAckSend(); *pucData+ = _zyI2cBytereceive(); _zyI2
18、cNakSend(); else ucDataLen = 0; _zyI2cStopSend(); return ucDataLen; 启动总线发送器件写地址接收ACK发送寄存器地址0接收ACK发送寄存器地址m-1接收ACK接收数据0发送ACK接收数据n-1发送NAK停止总线向从机读多个数据源代码 函数定义检查参数的正确性发送起始信号发送起始写地址发送寄存器地址接收数据重启总线发送器件写地址接收ACK发送重复起始信号发送读地址发送停止信号目 录 1 I2C简介 2 决策 3 软件接口 4 基本时序代码 5 外部接口代码 6 E2PROM读写范例 7 CAT1024驱动程序 8 温度的测量 CA
19、T1025简介 CAT102587651234MRRSTRSTVssVccWPSCLSDA符号描述符号描述MR手动复位SDA串性数据/地址RST低电平有效WP写保护RST复位管脚高电平有效SCL串行时钟输入Vss地Vcc电源CAT1025的管脚描述 I2C 带256Byte E2PROM 电源监控复位 器件更多详情见 由安森美半导体推出 CAT1025的复位监控特性 3V 3.3V 5V 0 RST RST 门槛电压 管脚电平状态 复位信号图示 CAT1025的应用电路上拉电阻原因:MR/RST:确保复位信号的稳定性,SCL/SDA:管脚为开漏输出保证低电平可靠手动复位输入隔离电阻CAT102
20、5特点 读操作 遵循I2C标准,无特殊要求 写操作 编程结束后需忙等待至少5ms 一次只能在一页内执行写操作,不能跨页操作 E2PROM内部结构 第0页 第1页 第15页 byte015 byte1631 byte240255 void main(void) unsigned char ucData = “123456; zyLedDisplayInit(); timer0Init(); timer1Init(); EA = 1; zyI2cInit(); if (zyI2cWrite(0 xa0 , 0, 1, ucData, 6) != 6 ) zyLedDisplayPuts(“erro
21、r1); while(1); delay100us(50);E2PROM读写程序范例 定义要写入的数据初始化各个模块将数据写入E2PROM,并判断是否成功,若失败则提示出错等待总线空闲E2PROM读写程序范例 ucdata0 = 0; if (zyI2cRead(0 xa0, 0, 1, ucData, 6) != 6) zyLedDisplayPuts(“error2); while(1); zyLedDisplayPuts(char *)ucData); while(1);读出写入的数据并判断是否成功,若失败提示错误 显示读出的数据 续上页 更改缓冲区数据 CAT1024驱动决策 CAT1
22、024与CAT1025的区别 CAT1025较1024多WP引脚, 支持硬件写保护 写操作具有忙状态和页限制 决策 不支持硬件写保护功能 通过编程使读/写操作的接口统一 函数名CAT1024初始化zyCat1024Init写CAT1024zyCat1024Write读CAT1024zyCat1024Readchar zyCat1024Init (void) return zyI2cInit();#define _CAT1024_ADDR 0 xa0 / 器件地址#define _CAT1024_PAGE_SIZE 16 / 器件页大小E2PROM的读写范例 器件地址固定为0 xa0宏定义 调用
23、I2C总线初始化函数 初始化 E2PROM读写范例写操作 unsigned char zyCat1024Write (unsigned char uc Addr, unsigned char *pucData, unsigned char ucDataLen) unsigned char ucTmp1, ucTmp2; / 第一页可能不是从页开始处写,所以需单独编码 ucTmp1=_CAT1024_PAGE_SIZE (ucAddr % _CAT1024_PAGE_SIZE); if (ucTmp1 ucDataLen) ucTmp1 = ucDataLen; ucTmp2 = zyI2cWr
24、ite(_CAT1024_ADDR, ucAddr, 1, pucData, ucTmp1); if(ucTmp2 != ucTmp1) return ucTmp2; ucAddr = ucAddr + ucTmp2; ucTmp1 = ucDataLen - ucTmp2; PucData = PucData + ucTmp2; _CAT1024_WRITE_DLY();E2PROM读写范例写操作 / 写中间页,都是满页 while (ucTmp1 _CAT1024_PAGE_SIZE) ucTmp2 = zyI2cWrite(_CAT1024_ADDR, ucAddr, 1, pucDat
25、a,_CAT1024_PAGE_SIZE) ucTmp1 = ucTmp1 ucTmp2; ucAddr = ucAddr + _CAT1024_PAGE_SIZE; pucData = pucData + _CAT1024_PAGE_SIZE; _CAT1024_WRITE_DLY(); if (ucTmp2 != _CAT1024_PAGE_SIZE) return (ucDataLen - ucTmp1); 续上页 E2PROM读写范例写操作 / 写最后一页,一般为不满页 ucTmp2 = zyI2cWrite (_CAT1024_ADDR,ucAddr,1, pucData,ucTmp
26、1); ucTmp1 = ucTmp1 ucTmp2; _CAT1024_WRITE_DLY(); return (ucDataLen ucTmp1);续上页 E2PROM读写范例读操作 / 直接调用I2C驱动库读函数unsigned char zyCat1024Read(unsigned char ucAddr, unsigned char *pucData, unsigned char ucDataLen) return zyI2cRead (_CAT1024_ADDR, ucAddr, 1, pucData, ucDataLen);目 录 1 I2C简介 2 决策 3 软件接口 4 基本时序代码 5 外部接口代码 6 E2PROM读写范例 7 CAT1024驱动程序 8 温度的测量 LM75A简介 LM75A87651234SDA SCL OS GND Vcc A0 A1 A2 符号描述符号描述SDA串行数据A2地址选择位2SCL串行时钟输入A1地址选
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江宁波市江北区外滩街道招聘合同制人员2人考试参考试题及答案解析
- 2026年河北石家庄市建设项目评审评估中心公开选聘事业单位工作人员12名考试参考试题及答案解析
- 2026江西赣州市中医院招募第一批青年见习8人考试参考试题及答案解析
- 2026四川九洲电器集团有限责任公司招聘企业管理岗位1人笔试备考试题及答案解析
- 2026云南昆明市人民政府机关第三幼儿园教育集团招聘9人笔试参考题库及答案解析
- 2025年九年级地理中考模拟试卷:地理教育政策与法规解读
- 2026年社会救助工作知识题库及答案
- 西安工程大学开题报告(模板)
- 2025-2026学年河北省保定市部分高中高三上学期10月月考政治试题(解析版)
- 金融科技公司风控总监经验
- 学前教育政策与法规考试试题(含答案)
- 2025年江西信息应用职业技术学院单招综合素质考试试题及答案解析
- 话剧《日出》剧本
- 亳州市招聘警务辅助人员考试真题及答案
- 寿春中学师德师风考核制度
- 2026年春青岛版(五四制)(新教材)小学科学二年级第二学期教学计划及进度表
- 社会团体负责人备案表
- GB/T 2900.56-2008电工术语控制技术
- 自然辩证法概论(新)
- 第二章-园艺设施结构设计
- 超声诊断学三基考试试题库及答案
评论
0/150
提交评论