I2C周立功标准驱动程序c代码_第1页
I2C周立功标准驱动程序c代码_第2页
I2C周立功标准驱动程序c代码_第3页
I2C周立功标准驱动程序c代码_第4页
I2C周立功标准驱动程序c代码_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、1./*Copyright(c)*2.*广州周立功单片机发展有限公司3.*4.*产品一部5.*6.*7.*8.*-文件信息9.*名:I2c.c10.*人:陈明计11.*最后修改日期:2003 年7月21日12.*述:fi CO-II 下LPC210X的I2c主模式底层驱动13.*14.*-历史版本信息15.*创建人:陈明计16.*本:v1.017.*期:2003年7月8日18.*述:原始版本19.*20.*-21.*修改人:陈明计22.*本:v1.123.*期:2003年7月21日24.*述:根据正式文档更改寄存器名25.*26.*-当前版本修订27.*修改人:28.*日期:29.*30.*3

2、1.*-32.*/33.34.#def ineIN_12c35.#include"config.h"36.staticuint8 *I2cBuf;37.staticOS_EVENT *I2cSem;38.staticOS_EVENT *I2cMbox;39.staticint16 I2cNbyte;40.staticuint8 I2cAddr;41.42.#define I2C_WRITE_END/*写完成*/43.#define I2C_READ_END/*读完成*/44.#define I2C_NOT_GET_BUS 4/*丢失仲裁*/45.#define I2C_AC

3、K_ERR 8/*接收ACK错误*/46.47.48./*49.*函数名称:I2cInit50.*功能描述:初始化12c (主模式)51.*输入:FI2c:12c 总线频率52.*53.*输出:TRUE :成功54.*FALSE:失败55.*全局变量:I2cSem,I2cMbox56.*调用模块:OSSemCreate57.*58.*作者:陈明计59.*日期:2003年7月8日60.*.61.*修改人:陈明计62.*日期:2003年7月10日63.*.64.*修改人:陈明计65.*日 期:2003年7月21日66.*.67.*/68.uint8I2cInit(uint32FI2c)69.70.

4、VICIntEnClr1 << 9;/*禁止能I2c中断*/71.if (FI2c<=400000)72.73.PINSEL0(PINSEL0 & 0xffffff0f) | 0x50;/*选择管脚为I2c */74.I2CONCLR0x6C;/*清除控制寄存器*/75.I2SCLH(Fpclk/FI2c+1)/2;/*设置高电平时间*/76.I2SCLL(Fpclk/FI2c)/2;/*设置低电平时间*/77.12csemOSSemCreate(1);/*信号量用于互斥操作总线*/78.I2cMboxOSMboxCreate(NULL);/*消息邮箱用于中断向任务传

5、递操作结果*/79.if(I2cMbox = NULL)80.81.returnFALSE;82.83.if(I2cSem!= NULL)84.85.returnTRUE;86.87.88.returnFALSE;89.91.91./*92.*函数名称_I2cWrite93.*功能描述读I2C ,但不发送 STOP信号94.*Addr:从机地址95.*Data:将要写的数据96.*写的数据数目97.*输出:发送的数据字节数98.*99.*全局变量:I2cAddr,I2cNbyte,I2cBuf100.*调用模块:OSMboxPend101.*102.*作者:陈明计103.*日期:2003年7月

6、8日104.*.105.*修改人:陈明计106.*日 期:2003年7月21日107.*.108.*/109.uint8 _I2cWrite(uint8 Addr, uint8 *Data, int16 NByte)110.111.uint8 err;112.unsignedint Rt;113.114.I2cAddrAddr& 0xfe;/*存储发送地址*/115.I2cNbyte = NByte;/*存储写字节数*/116.I2cBuf = Data;/*存储写的数据的指针 */117.I2CONSET = 0x24;/*设置为主机,并启动总线*/118.119.Rt = (uns

7、ignedint ) OSMboxPend(I2cMbox, 0, &err);/*等待操作结束*/120.return Rt;24./*125.*函数名称:I2cWrite126.*功能描述I2C从器件写数据127.*Addr:从机地址128.*Data:指向将要写的数据的指针129.*NByte:写的数据数目130.*输出:发送的数据字节数131.*132.*全局变量:I2cSem,I2cNbyte133.*调用模块:OSSemPend,_I2cWrite,OSSemPost135.*作者:陈明计135.*136.*日期:2003年7月8日137.*.13

8、8.*修改人:陈明计139.*日期:2003年7月10日140.*.141.*修改人:陈明计142.*日 期:2003年7月21日143.*.144.*/145.uint16I2cWrite(uint8 Addr, uint8 *Data,int16NByte)146.147.uint8 err;148.149.OSSemPend(I2cSem,0, &err);150.151.I2CONCLR = 0x6C;152.I2CONSET = 0x40;/*使能I2c*/153.VICIntEnable<< 9;/*使能12c中断*/154.155.if (_I2cWrite(

9、Addr,Data, NByte) = I2C_WRITE_END)156.157.I2CONSET<< 4;/*发送停止信号 */158.I2CONCLR0x28;/*清除标志 */159.160.161.VICIntEnClr1 << 9;/*禁止能I2c中断*/162.163.OSSemPost(I2cSem);164.return (NByte - I2cNbyte);165.166.167./*168.*函数名称:I2cRead169.*功能描述从I2c从器件读数据170.*Addr:从机地址171.*Ret:指向返回数据存储位置的指针172.*Eaddr:扩

10、展地址存储位置173.*EaddrNByte:扩展地址字节数,0为无174.*ReadNbyte:将要读取的字节数目175.*输出:已读取的字节数176.*177.*全局变量:I2cSem,I2cAddr,I2cNbyte,I2cBuf178.*调用模块:OSSemPend,_I2cWrite,OSMboxPend,OSSemPost180.*作者:陈明计180.*181.*日期:2003年7月8日182.*.183.*修改人:陈明计184.*日 期:2003年7月21日185.*.186.*/187.int16 I2cRead(uint8 Addr,uint8 *Ret , uint8*Ea

11、ddr, int16 EaddrNByte, int16 ReadNbyte)188.189.uint8 err;190.191.OSSemPend(I2cSem,0, &err);192.193.I2CONCLR = 0x6C;194.I2CONSET = 0x40;/*使能12c */195.VICIntEnable1 << 9;/*使能I2c中断*/196.197.if (EaddrNByte> 0)198.199.if (_I2cWrite(Addr,Eaddr, EaddrNByte) != I2C_WRITE_END)200.201.return-1;20

12、05.I2cAddrAddr| 0x01;/*存储发送地址*/206.I2cNbyte = ReadNbyte;/*存储读字节数*/207.I2cBuf = Ret;/*存储读到的数据*/208.I2CONCLR = 0x28;209.I2CONSET = 0x24;/*设置为主机,并启动总线*/210.VICIntEnable1 << 9;/*使能I2c中断*/211.212.OSMboxPend(I2cMbox, 0, &err);/*等待操作结束*/213.214.VICIntEnClr1 << 9;/*禁止能I2c中断*/215.O

13、SSemPost(I2cSem);216.return (ReadNbyte - I2cNbyte);20./*221.*函数名称:I2c_Exception222.*功能描述:I2c中断服务程序223.*225.*225.*输出:无56.257.258.259.260.261.262.263.264.265.266.267.26

14、8.269.* * 全局变量:I2cAddr,I2cBuf,I2cNbyte,I2cMbox* * 调用模块:OSMboxPost* *作作者:陈明计* *日期:2003年7月8日* *修改人:陈明计* *日 期:2003年7月21日*/void I2c_Exception(void )OS_ENTER_CRITICAL();switch (I2STAT & 0xf8)case 0x08:/*已发送起始条件,与0x18相同处理*/break;case 0x10:/*已发送重复起始条件*/I2DAT= I2cAddr;/*发送地址*/I2CONCLR = 0x28;/*清除标志*/bre

15、ak ;case 0x18:/*已发送SLA+W,并已接收应答 */I2DAT= *I2cBuf+;I2cNbyte-;I2CONCLR = 0x28;/*清除标志*/break ;case 0x28:/*已发送I2C数据,并接收到应答*/if (I2cNbyte> 0)I2DAT= *I2cBuf+;I2cNbyte-;I2CONCLR= 0x28;/*清除标志*/elseOSMboxPost(I2cMbox,(void*)I2C_WRITE_END);VICIntEnClr=1 <<9;/*禁止能I2c中断*/break ;case 0x20:/*已发送SLA+W;已接收

16、非 ACK,与0x48处理相同*/break;case 0x30:/*已发送I2DAT中的数据字节;已接收非ACK,与0x48处理相同*/break;case 0x48:/*已发送SLA+R;已接收非 ACK*/271.271.I2CONSET = 1 << 4;/*发送停止信号 */272.273.274.275.276.277.278.279.280.281.282.283.284.285.286.287.288.289.290.291.292.293.294.295.296.297.298.299.300.301.302.303.304.305.306.307.308.309

17、.310.311.312.313.OSMboxPost(I2cMbox,I2CONCLR = 0x28; break ;case 0x38:OSMboxPost(I2cMbox,I2CONCLR = 0x28;break ;case 0x40:if (I2cNbyteI2CONCLR elseI2CONSET= 1 << 2;I2CONCLR = 0x28; break ;case 0x50:*I2cBuf+I2cNbyte-;if (I2cNbyteI2CONCLRI2CONCLR = 0x28;break ;case 0x58:*I2cBuf = I2DAT;I2cNbyte-;I2CONSET=OSMboxPost(I2cMbox,I2CONCLR = 0x28; break ;defaultI2CONCLR = 0x28; break ;VICVectAddr =0;OS_EXIT_CRITICAL();<=1)=1 << 2;I2DAT;<=1)=1 << 2;<< 4;(void(void(void*)I2C_

温馨提示

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

评论

0/150

提交评论