LPC2000系列微控制器I2C软件包.pdf_第1页
LPC2000系列微控制器I2C软件包.pdf_第2页
LPC2000系列微控制器I2C软件包.pdf_第3页
LPC2000系列微控制器I2C软件包.pdf_第4页
LPC2000系列微控制器I2C软件包.pdf_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 1 - L P C 2 0 0 0系列微控制器 I 2 C软件包 一概述 LPC2000 系列微控制器是基于 ARM7TDMI-S 内核的 32 位微控制器片内集成了支持 400KHz 高速模式的硬件 I2C 总线接口 为了方便地对 I2C 从器件进行快速的正确的读写操作我们设计了 LPC2000 系列微 控制器 I2C 软件包本软件包是硬件 I 2 C 以主方式工作的只要用户调用接口函数并提供几 个主要的参数即可轻松地完成 I2C 总线外围器件的应用程序设计 二I2C串行总线 I2C 总线是 PHILIPS 公司推出的芯片间串行数据传输总线 2 根线(SDA SCL)即可实现 完善的全双工同步数据传送能够十分方便地地构成多机系统和外围器件扩展系统I2C 器 件是把 I2C 的协议植入器件的 I/O 接口使用时器件直接挂到 I2C 总线上这一特点给用户 在设计应用系统带来了极大的便利 I2C 器件无须片选信号 是否选中是由主器件发出的 I2C 从地址决定的而 I2C 器件的从地址是由 I2C 总线委员会实行统一发配 三软件包接口说明 LPC2000 系列微控制器 I2C 软件包采用中断方式进行处理提供了 4 个接口函数分别 为ISendByte()ISendStr()IRcvByte和 IRcvStr()由于 I2C 向量中断需要根据实际应 用来设定(即 VIC 的设置)所以软件包中没有提供 I2C 初始化的代码在调用I2C软件包接 口函数前用户程序要配置好I2C总线接口(I2C引脚功能和I2C中断并已使能I2C主模 式) 1. 向无子地址器件发送一字节数据 函数原型uint8 ISendByte(uint8 sla, uint8 dat) 入口参数sla 器件地址 dat 要发送的数据 出口参数返回值为 0 时表示出错为 1 时表示操作正确 2. 向有子地址器件发送多字节数据 函数原型ISendStr(uint8 sla, uint8 suba, uint8 *s, uint8 no) 入口参数sla 器件地址 suba 器件子地址 s 数据发送缓冲区指针 no 发送数据个数 出口参数返回值为 0 时表示出错为 1 时表示操作正确 3. 向无子地址器件读取一字节数据 函数原型IRcvByte(uint8 sla, uint8 *dat) 入口参数sla 器件地址 dat 接收数据的变量指针 出口参数返回值为 0 时表示操作出错为 1 时表示操作正确 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 2 - 4. 向有子地址器件读取多字节数据 函数原型IRcvStr(uint8 sla, uint8 suba, uint8 *s, uint8 no) 入口参数sla 器件地址 suba 器件子地址 s 数据接收缓冲区指针 no 读取数据个数 出口参数返回值为 0 时表示出错为 1 时表示操作正确 四软件包源程序 LPC2000 系列微控制器 I2C 软件包源程序如程序清单 1 所示 程序清单 1 L P C 2 0 0 0 系列微控制器 I 2 C 软件包 /* * 文件名I2CINT.C * 功能硬件 I2C 软件包利用中断方式操作 * 说明主程序要配置好 I2C 总线接口(I2C 引脚功能和 I2C 中断并已使能 I2C 主模式) */ #include config.h /* 以下为 I2C 操作时所需要的变量 */ volatile uint8 I2C_sla; / 从机地址(即器件地址) volatile uint8 I2C_suba; / 子地址 volatile uint8 *I2C_buf; / 数据缓冲区指针 (读操作时会被更改) volatile uint8 I2C_num; / 操作数据个数 (会被更改) volatile uint8 I2C_end; / 操作结束标志为 1 时表示操作结束为 0 xFF 时表示操作失败 (会被设置) volatile uint8 I2C_suba_en; / 子地址使能控制读操作时请设置为 1写操作时请设置为 2 (会被更改) /* * 名称IRQ_I2C() * 功能I2C 中断通过判断 I2C 状态字进行相应的操作 * 入口参数无 * 出口参数无 */ void _irq IRQ_I2C(void) uint8 sta; sta = I2STAT; / 读出 I2C 状态字 switch(sta) case 0 x08: / 己发送起始条件 if(1=I2C_suba_en) I2DAT = I2C_sla / 指定子地址读时先写入地址 else I2DAT = I2C_sla; / 否则直接发送从机地址 I2CONCLR = 0 x28; / SI=0 break; case 0 x10: 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 3 - I2DAT = I2C_sla; / 重启动总线后发送从地址 I2CONCLR = 0 x28; / SI=0 break; case 0 x18: / 已发送 SLA+W并已接收应答 if(0=I2C_suba_en) / 无子地址则直接发送数据 if(I2C_num0) I2DAT = *I2C_buf+; I2CONCLR = 0 x28; I2C_num-; else I2CONSET = 0 x10; / 无数据发送结束总线 I2CONCLR = 0 x28; I2C_end = 1; / 设置总线操作结束标志 break; if(1=I2C_suba_en) / 发送子地址 I2DAT = I2C_suba; I2CONCLR = 0 x28; if(2=I2C_suba_en) I2DAT = I2C_suba; I2CONCLR = 0 x28; I2C_suba_en = 0; / 子地址己处理 break; case 0 x28: / 已发送 I2C 数据并接收到应答 if(0=I2C_suba_en) / 无子地址则直接发送数据 if(I2C_num0) I2DAT = *I2C_buf+; I2CONCLR = 0 x28; I2C_num-; else I2CONSET = 0 x10; / 无数据发送结束总线 I2CONCLR = 0 x28; I2C_end = 1; break; if(1=I2C_suba_en) / 若是指定地址读则重新启动总线 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 4 - I2CONSET = 0 x20; I2CONCLR = 0 x08; I2C_suba_en = 0; / 子地址己处理 break; case 0 x20: case 0 x30: case 0 x38: I2CONCLR = 0 x28; / 总线进入不可寻址从模式 I2C_end = 0 xFF; / 总线出错,设置标志 break; case 0 x40: / 己发送 SLA+R并已接收到应答 if(1=I2C_num) / 最后一字节接收数据后发送非应答信号 I2CONCLR = 0 x2C; / AA=0接收到数据后产生非应答 else / 接收数据并发送应答信号 I2CONSET = 0 x04; / AA=1接收到数据后产生应答 I2CONCLR = 0 x28; break; case 0 x50: *I2C_buf+ = I2DAT; / 读取数据 I2C_num-; if(1=I2C_num) I2CONCLR = 0 x2C; / AA=0接收到数据后产生非应答 else I2CONSET = 0 x04; / AA=1接收到数据后产生应答 I2CONCLR = 0 x28; break; case 0 x58: *I2C_buf+ = I2DAT; / 读取最后一字节数据 I2CONSET = 0 x10; / 结束总线 I2CONCLR = 0 x28; I2C_end = 1; break; case 0 x48: I2CONCLR = 0 x28; / 总线进入不可寻址从模式 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 5 - I2C_end = 0 xFF; break; default: break; VICVectAddr = 0 x00; / 中断处理结束 /* * 名称ISendByte() * 功能向无子地址器件发送一字节数据 * 入口参数sla 器件地址 * dat 要发送的数据 * 出口参数返回值为 0 时表示出错为 1 时表示操作正确 * 说明使用前要初始化好 I2C 引脚功能和 I2C 中断并已使能 I2C 主模式 */ uint8 ISendByte(uint8 sla, uint8 dat) /* 参数设置 */ I2C_sla = sla; / 写操作的器件地址 I2C_buf = / 待发送的数据 I2C_num = 1; / 发送 1 字节数据 I2C_suba_en = 0; / 无子地址 I2C_end = 0; I2CONCLR = 0 x2C; I2CONSET = 0 x60; / 设置为主机并启动总线 while(0=I2C_end); if(1=I2C_end) return(1); else return(0); /* * 名称ISendStr() * 功能向有子地址器件发送多字节数据 * 入口参数sla 器件从机地址 * suba 器件子地址 * s 数据发送缓冲区指针 * no 发送数据个数 * 出口参数返回值为 0 时表示出错为 1 时表示操作正确 * 说明使用前要初始化好 I2C 引脚功能和 I2C 中断并已使能 I2C 主模式 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 6 - */ uint8 ISendStr(uint8 sla, uint8 suba, uint8 *s, uint8 no) /* 参数设置 */ I2C_sla = sla; / 写操作的器件地址 I2C_suba = suba; / 子地址 I2C_buf = s; I2C_num = no; I2C_suba_en = 2; / 有子地址写 I2C_end = 0; I2CONCLR = 0 x2C; I2CONSET = 0 x60; / 设置为主机并启动总线 while(0=I2C_end); if(1=I2C_end) return(1); else return(0); /* * 名称IRcvByte() * 功能向无子地址器件读取一字节数据 * 入口参数sla 器件地址 * dat 接收数据的变量指针 * 出口参数返回值为 0 时表示操作出错为 1 时表示操作正确 * 说明使用前要初始化好 I2C 引脚功能和 I2C 中断并已使能 I2C 主模式 */ uint8 IRcvByte(uint8 sla, uint8 *dat) /* 参数设置 */ I2C_sla = sla+1; / 读操作的器件地址 I2C_buf = dat; I2C_num = 1; I2C_suba_en = 0; / 无子地址 I2C_end = 0; I2CONCLR = 0 x2C; I2CONSET = 0 x60; / 设置为主机并启动总线 while(0=I2C_end); if(1=I2C_end) return(1); else return(0); /* * 名称IRcvStr() 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 7 - * 功能向有子地址器件读取多字节数据 * 入口参数sla 器件地址 * suba 器件子地址 * s 数据接收缓冲区指针 * no 读取数据个数 * 出口参数返回值为 0 时表示操作出错为 1 时表示操作正确 * 说明使用前要初始化好 I2C 引脚功能和 I2C 中断并已使能 I2C 主模式 */ uint8 IRcvStr(uint8 sla, uint8 suba, uint8 *s, uint8 no) if(0=no) return(0); /* 参数设置 */ I2C_sla = sla+1; / 读操作的器件地址 I2C_suba = suba; I2C_buf = s; I2C_num = no; I2C_suba_en = 1; / 有子地址读 I2C_end = 0; I2CONCLR = 0 x2C; I2CONSET = 0 x60; / 设置为主机并启动总线 while(0=I2C_end); if(1=I2C_end) return(1); else return(0); 五软件包应用 使用 LPC2000 系列微控制器 I2C 软件包时需要将 I2cInt.cI2cInt.h 文件复制到项目的 目录中然后在工程中添加 I2cInt.c 文件并在用户程序上使用#include I2CINT.H 包含头文件 在调用 I2C 软件包接口函数前 用户程序要配置好 I2C 总线接口(I2C 引脚功能和 I2C 中 断并已使能 I2C 主模式)参考程序清单 2 程序清单 2 主模式 I 2 C 初始化 /* * 名称I2C_Init() * 功能主模式 I2C 初始化包括初始化其中断为向量 IRQ 中断 * 入口参数fi2c 初始化 I2C 总线速率最大值为 400K * 出口参数无 */ void I2C_Init(uint32 fi2c) if(fi2c400000) fi2c = 400000; PINSEL0 = (PINSEL0 / 设置 I2C 控制口有效 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 8 - I2SCLH = (Fpclk/fi2c + 1) / 2; / 设置 I2C 时钟为 fi2c I2SCLL = (Fpclk/fi2c) / 2; I2CONCLR = 0 x2C; I2CONSET = 0 x40; / 使能主 I2C /* 设置 I2C 中断允许 */ VICIntSelect = 0 x00000000; / 设置所有通道为 IRQ 中断 VICVectCntl0 = 0 x29; / I2C 通道分配到 IRQ slot 0即优先级最高 VICVectAddr0 = (int)IRQ_I2C; / 设置 I2C 中断向量地址 VICIntEnable = 0 x0200; / 使能 I2C 中断 LPC2000 系列微控制器 I2C 软件包的应用例子如程序清单 3 所示这是一个对 CAT24WC02 读写操作的例子 注意若使用LPC2100/LPC2200专用工程模板建立工程由于工程模板默认是关断 IRQ中断的所以要在工程中Startup.s文件的InitStack子程序中修改设置系统模式堆 栈处的代码为MSR CPSR_c, #0 x5f即使能IRQ中断 程序清单 3 主模式 I 2 C 初始化 /* * 文件名TEST.C * 功能使用硬件 I2C 对 E2PROM 进行操作 */ #include config.h #define CAT24WC02 0 xA0 /* 定义器件地址 */ /* * 名称I2C_Init() * 功能主模式 I2C 初始化包括初始化其中断为向量 IRQ 中断 * 入口参数fi2c 初始化 I2C 总线速率最大值为 400K * 出口参数无 */ void I2C_Init(uint32 fi2c) if(fi2c400000) fi2c = 400000; PINSEL0 = (PINSEL0 / 设置 I2C 控制口有效 I2SCLH = (Fpclk/fi2c + 1) / 2; / 设置 I2C 时钟为 fi2c I2SCLL = (Fpclk/fi2c) / 2; I2CONCLR = 0 x2C; I2CONSET = 0 x40; / 使能主 I2C /* 设置 I2C 中断允许 */ 广州周立功单片机发展有限公司 Tel: (020) 38730916 38730917 38730976 38730977 Fax: 38730925 - 9 - VICIntSelect = 0 x00000000; / 设置所有通道为 IRQ 中断 VICVectCntl0 = 0 x29; / I2C 通道分配到 IRQ slot 0即优先级最高 VICVectAddr0 = (int)IRQ_I2C; / 设置 I2C 中断向量地址 VICIntEnable = 0 x0200; / 使能 I2C 中断 /* * 名称DelayNS() * 功能长软件延时 * 入口参数dly 延时参数值越大延时越久 * 出口参数无 */ void DelayNS(uint32 dly) uint32 i; for(; dly0; dly-) for(i=0; i50000; i+); uint8 i, j; uint8 data_buf30; /* * 名称main() * 功能向 E2PROM 写入 10 字节数据然后读出判断是否正确写入 * 说明在 STARTUP.S 文件中使能 IRQ 中断(清零 CPSR 中的 I 位) * 在 CONFIG.H 文件中包含 I2CINT.H */ int main(void) I2C_Init(100000); / I2C 初始化 / 在 0 x00 地址处写入 10 字节数据然后再读出 for(i=0; i10; i+) data_bufi = i+0; ISendStr(CAT24WC02, 0 x00, data_buf, 10); / 在 0 x00 地址处写入 10 字节数据 DelayNS(1); / 等待写周期结束 for(i=0; i10; i+) data_bufi = 0; IRcvStr(CAT24WC02, 0 x00, data_buf, 8); / 在 0 x00 地址处读出 10 字节数据 / 读取 0 x050 x06 地址上的一字节数据

温馨提示

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

评论

0/150

提交评论