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

下载本文档

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

文档简介

1. /*Copyright(c)*2. *广州周立功单片机发展有限公司3. *研究所4. *产品一部5. *6. *7. *8. *-文件信息-9. *文件名:I2c.c10. *创建人:陈明计11. *最后修改日期:2003年7月21日12. *描述:COS-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. *31. *-32. */33. 34. #defineIN_I2C 35. #includeconfig.h 36. staticuint8*I2cBuf;37. staticOS_EVENT*I2cSem;38. staticOS_EVENT*I2cMbox;39. staticint16I2cNbyte;40. staticuint8I2cAddr;41. 42. #defineI2C_WRITE_END1/*写完成*/ 43. #defineI2C_READ_END2/*读完成*/ 44. #defineI2C_NOT_GET_BUS4/*丢失仲裁*/ 45. #defineI2C_ACK_ERR8/*接收ACK错误*/ 46. 47. 48. /*49. *函数名称:I2cInit50. *功能描述:初始化I2c(主模式)51. *输入:FI2c:I2c总线频率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. VICIntEnClr=19;/*禁止能I2c中断*/71. if(FI2c=400000)72. 73. PINSEL0=(PINSEL0&0xffffff0f)|0x50;/*选择管脚为I2c*/74. I2CONCLR=0x6C;/*清除控制寄存器*/75. I2SCLH=(Fpclk/FI2c+1)/2;/*设置高电平时间*/76. I2SCLL=(Fpclk/FI2c)/2;/*设置低电平时间*/77. I2cSem=OSSemCreate(1);/*信号量用于互斥操作总线*/78. I2cMbox=OSMboxCreate(NULL);/*消息邮箱用于中断向任务传递操作结果*/79. if(I2cMbox=NULL)80. 81. returnFALSE;82. 83. if(I2cSem!=NULL)84. 85. returnTRUE;86. 87. 88. returnFALSE;89. 90. 91. /*92. *函数名称:_I2cWrite93. *功能描述:读I2C,但不发送STOP信号94. *输入:Addr:从机地址95. *Data:将要写的数据96. *写的数据数目97. *输出:发送的数据字节数98. *99. *全局变量:I2cAddr,I2cNbyte,I2cBuf100. *调用模块:OSMboxPend101. *102. *作者:陈明计103. *日期:2003年7月8日104. *-105. *修改人:陈明计106. *日期:2003年7月21日107. *-108. */109. uint8_I2cWrite(uint8Addr,uint8*Data,int16NByte)110. 111. uint8err;112. unsignedintRt;113. 114. I2cAddr=Addr&0xfe;/*存储发送地址*/115. I2cNbyte=NByte;/*存储写字节数*/116. I2cBuf=Data;/*存储写的数据的指针*/117. I2CONSET=0x24;/*设置为主机,并启动总线*/118. 119. Rt=(unsignedint)OSMboxPend(I2cMbox,0,&err);/*等待操作结束*/120. returnRt;121. 122. 123. 124. /*125. *函数名称:I2cWrite126. *功能描述:向I2C从器件写数据127. *输入:Addr:从机地址128. *Data:指向将要写的数据的指针129. *NByte:写的数据数目130. *输出:发送的数据字节数131. *132. *全局变量:I2cSem,I2cNbyte133. *调用模块:OSSemPend,_I2cWrite,OSSemPost134. *135. *作者:陈明计136. *日期:2003年7月8日137. *-138. *修改人:陈明计139. *日期:2003年7月10日140. *-141. *修改人:陈明计142. *日期:2003年7月21日143. *-144. */145. uint16I2cWrite(uint8Addr,uint8*Data,int16NByte)146. 147. uint8err;148. 149. OSSemPend(I2cSem,0,&err);150. 151. I2CONCLR=0x6C;152. I2CONSET=0x40;/*使能I2c*/153. VICIntEnable=19;/*使能I2c中断*/154. 155. if(_I2cWrite(Addr,Data,NByte)=I2C_WRITE_END)156. 157. I2CONSET=14;/*发送停止信号*/158. I2CONCLR=0x28;/*清除标志*/159. 160. 161. VICIntEnClr=19;/*禁止能I2c中断*/162. 163. OSSemPost(I2cSem);164. return(NByte-I2cNbyte);165. 166. 167. /*168. *函数名称:I2cRead169. *功能描述:从I2c从器件读数据170. *输入:Addr:从机地址171. *Ret:指向返回数据存储位置的指针172. *Eaddr:扩展地址存储位置173. *EaddrNByte:扩展地址字节数,0为无174. *ReadNbyte:将要读取的字节数目175. *输出:已读取的字节数176. *177. *全局变量:I2cSem,I2cAddr,I2cNbyte,I2cBuf178. *调用模块:OSSemPend,_I2cWrite,OSMboxPend,OSSemPost179. *180. *作者:陈明计181. *日期:2003年7月8日182. *-183. *修改人:陈明计184. *日期:2003年7月21日185. *-186. */187. int16I2cRead(uint8Addr,uint8*Ret,uint8*Eaddr,int16EaddrNByte,int16ReadNbyte)188. 189. uint8err;190. 191. OSSemPend(I2cSem,0,&err);192. 193. I2CONCLR=0x6C;194. I2CONSET=0x40;/*使能I2c*/195. VICIntEnable=10)198. 199. if(_I2cWrite(Addr,Eaddr,EaddrNByte)!=I2C_WRITE_END)200. 201. return-1;202. 203. 204. 205. I2cAddr=Addr|0x01;/*存储发送地址*/206. I2cNbyte=ReadNbyte;/*存储读字节数*/207. I2cBuf=Ret;/*存储读到的数据*/208. I2CONCLR=0x28;209. I2CONSET=0x24;/*设置为主机,并启动总线*/210. VICIntEnable=19;/*使能I2c中断*/211. 212. OSMboxPend(I2cMbox,0,&err);/*等待操作结束*/213. 214. VICIntEnClr=10)255. 256. I2DAT=*I2cBuf+;257. I2cNbyte-;258. I2CONCLR=0x28;/*清除标志*/259. 260. else261. 262. OSMboxPost(I2cMbox,(void*)I2C_WRITE_END);263. VICIntEnClr=19;/*禁止能I2c中断*/264. 265. break;266. case0x20:/*已发送SLA+W;已接收非ACK,与0x48处理相同*/267. /break; 268. case0x30:/*已发送I2DAT中的数据字节;已接收非ACK,与0x48处理相同*/269. /break; 270. case0x48:/*已发送SLA+R;已接收非ACK*/271. I2CONSET=14;/*发送停止信号*/272. OSMboxPost(I2cMbox,(void*)I2C_ACK_ERR);273. I2CONCLR=0x28;/*清除标志*/274. break;275. case0x38:/*在SLA+R/W或数据字节中丢失仲裁*/276. OSMboxPost(I2cMbox,(void*)I2C_NOT_GET_BUS);277. I2CONCLR=0x28;/*清除标志*/278. break;279. case0x40:/*已发送SLA+R;已接收ACK*/280. if(I2cNbyte=1)281. 282. I2CONCLR=12;/*下次发送非应答信号*/283. 284. else285. 286. I2CONSET=12;/*下次发送应答信号*/287. 288. I2CONCLR=0x28;/*清除标志*/289. break;290. case0x50:/*已接收数据字节;已发送ACK*/291. *I2cBuf+=I2DAT;/*接收数据*/292. I2cNbyte-;293. if(I2cNbyte=1)294. 295. I2CONCLR=12;/*下次发送非应答信号*/296. 297.298. inspire vt. 鼓舞;激发;启示I2CONCLR=0x28;/*清除标志*/299. break;300.301. adv. 在市区;往市区case0x58:/*已接收数据字节;已返发送ACK*/302.303. pace vi. 缓慢而行;踱步*I2cBuf=I2DAT;/*接收数据*/304. I2cNbyte-;305.306. Tom Sawyer n. 汤姆?索亚(人名)I2CONSET=14;/*结束总线*/307. OSMboxPost(I2cMbox,(void*)I2C_READ_END);308.309. Sally n. 萨利(女名)I2CONCLR=0x28;/*清除标志*/310. bre

温馨提示

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

评论

0/150

提交评论