




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、u32 ulTimeOut_Time; /* I2C_EE_WriteStr()* Description : 将一个数据块写入EEPROM 的指定的地址* Argument(s) : xChip - 从器件地址* xAddr - EEPROM存储空间地址 * xpBuf - 数据缓冲区指针* xLen - 数据长度* Return(s) : none.* Caller(s) : Application.* Note(s) : (1) *-* Modified by : * Modified date : * Description :*-*/ void I2C_EE_WriteStr(u8
2、xChip, u16 xAddr, u8 *xpBuf, u16 xLen) u8 *pbuf; u8 err; u8 retry; u16 addr; u16 len; / pbuf = xpBuf; addr = xAddr; len = xLen; I2C_EE_Drv_BusEn(); / 允许总线,写允许 retry = 5; / 重试5次 while(len) err = I2C_EE_Drv_WriteByte(xChip, addr, *pbuf); if(err) if(-retry = 0 ) / 已经试了5次,写下一个数据 retry = 5; pbuf+; addr+;
3、 len-; else / 顺利,写下一个数据 pbuf+; addr+; len-; I2C_EE_Drv_BusDis(); / 失能总线,写保护/* I2C_EE_ReadStr()* Description : 从EEPROM 的指定的地址读出一个数据块* Argument(s) : xChip - 从器件地址* xAddr - EEPROM存储空间地址 * xpBuf - 数据缓冲区指针* xLen - 数据长度* Return(s) : none.* Caller(s) : Application.* Note(s) : (1) *-* Modified by : * Modifi
4、ed date : * Description :*-*/ void I2C_EE_ReadStr(u8 xChip, u16 xAddr, u8 *xpBuf, u16 xLen) u8 *pbuf; u8 err; u8 retry; u16 addr; u16 len; / pbuf = xpBuf; addr = xAddr; len = xLen; I2C_EE_Drv_BusEn(); / 允许总线,写允许 retry = 5; / 重试5次 while(len) *pbuf = I2C_EE_Drv_ReadByte(xChip, addr, &err); if(err)
5、 if(-retry = 0) / 已经试了5次,读下一个数据 retry = 5; pbuf+; addr+; len-; else / 顺利,读下一个数据 pbuf+; addr+; len-; I2C_EE_Drv_BusDis(); / 失能总线,写保护 /* I2C_EE_Drv_Init()* Description : I2C1初始化,默认情况下,I2C接口工作在从模式下。* Argument(s) : xI2C_EE_Speed - 总显的速度 100000 - 400000* Return(s) : none.* Caller(s) : Application.* Note(
6、s) : (1) *-* Modified by : * Modified date : * Description :*-*/ void I2C_EE_Drv_Init( u32 xI2C_EE_Speed ) I2C_InitTypeDef i2c_Init; GPIO_InitTypeDef gpio_Init; RCC_ClocksTypeDef rcc_clocks; / BSP_PeriphEn(I2C1_PORT_ID); BSP_PeriphEn(I2C1_WP_PORT_ID); BSP_PeriphEn(BSP_PERIPH_ID_I2C1); / 给 I2C1 加载时钟
7、/- Configure I2C1 pins: SCL and SDA - gpio_Init.GPIO_Pin = I2C1_SCL_Bit | I2C1_SDA_Bit; gpio_Init.GPIO_Speed = GPIO_Speed_50MHz; gpio_Init.GPIO_Mode = GPIO_Mode_AF_OD; / 复用功能开漏输出模式 GPIO_Init(I2C1_Port, &gpio_Init); gpio_Init.GPIO_Pin = I2C1_WP_Bit; gpio_Init.GPIO_Speed = GPIO_Speed_10MHz; gpio_I
8、nit.GPIO_Mode = GPIO_Mode_Out_OD; / 开漏输出模式 GPIO_Init(I2C1_WP_Port, &gpio_Init); /- I2C1 configuration - i2c_Init.I2C_Mode = I2C_Mode_I2C; i2c_Init.I2C_DutyCycle = I2C_DutyCycle_2; i2c_Init.I2C_OwnAddress1 = I2C_EE_24C256_PARA; i2c_Init.I2C_Ack = I2C_Ack_Enable; i2c_Init.I2C_AcknowledgedAddress =
9、 I2C_AcknowledgedAddress_7bit; i2c_Init.I2C_ClockSpeed = xI2C_EE_Speed; I2C_Init(I2C1, &i2c_Init); BSP_IntDis(BSP_INT_ID_I2C1_EV); / 失能事件中断 BSP_IntDis(BSP_INT_ID_I2C1_ER); / 失能错误中断 I2C_EE_Drv_BusDis(); /- / 超时时间计算(5ms 超时) /- RCC_GetClocksFreq(&rcc_clocks); ulTimeOut_Time = (rcc_clocks.SYSCLK
10、_Frequency /10 *5 /1000); / 等待程序的执行时间:10 个指令周期/* I2C_EE_Drv_WriteByte()* Description : 将一个字节的数据写入EEPROM 的指定的地址* 字节写模式:* 起始信号 * -> 从器件地址( 包括写命令 ) * a-> EEPROM存储空间地址高字节 * a-> EEPROM存储空间地址低字节 * a-> 数据 * a-> 停止信号 * 共4次a (注:a - Ack 应答信号 )* * Argument(s) : xChip - 从器件地址* xAddr - EEPROM存储空间地
11、址 * xDat - 数据* Return(s) : errcnt - 操作的结果 >0 : 操作出现错误* Caller(s) : Application.* Note(s) : (1) *-* Modified by : * Modified date : * Description :*-*/ u8 I2C_EE_Drv_WriteByte(u8 xChip, u16 xAddr, u8 xDat) u32 tmr; u8 errcnt;/ _WriteEn(); / 写使能/ I2C_Cmd(I2C1, ENABLE); / 使能总线 errcnt = 0; while(I2C_
12、GetFlagStatus(I2C1, I2C_FLAG_BUSY); I2C_GenerateSTART(I2C1, ENABLE); / 发送I2C的START信号,接口自动从从设备编程主设备 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); / 检查I2C的EV5状态并清除 if(tmr =0) errcnt+; I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Transmitter); / 发送从地
13、址(EEPROM设备地址) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);/ 检查I2C的EV6状态并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr >>8)&0x00ff); / 发送 EEPROM 的存储空间地址(高字节) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(
14、I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 检查I2C的EV8状态并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr&0x00ff); / 发送 EEPROM 的存储空间地址(低字节) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 检查I2C的EV8状态并清除 if(tmr =0) errcnt+; I2C_SendData(I
15、2C1, xDat); / 发送数据 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 检查I2C的EV8状态并清除 if(tmr =0) errcnt+; I2C_GenerateSTOP(I2C1, ENABLE); / 发送I2C的STOP信号,接口自动从主设备编程从设备/ _WriteDis(); / 写失能/ I2C_Cmd(I2C1, DISABLE); / 失能总线 return(errcnt); /* I2C_EE_Drv
16、_ReadByte()* Description : 从EEPROM 的指定的地址读出一个字节的数据* 选择/随机读操作:允许主器件对寄存器的任意字节进行读操作* 起始信号 * -> 从器件地址( 包括写命令 )* a-> EEPROM存储空间地址高字节 * a-> EEPROM存储空间地址低字节 * a-> 起始信号 * -> 从器件地址( 包括读命令 ) * a-> 得到数据 * -> 停止信号 * 共4次a (注:a - Ack 应答信号 )* Argument(s) : xChip - 从器件地址* xAddr - EEPROM存储空间地址 *
17、 xpErr - 用于返回操作结果 >0 : 操作出现错误* Return(s) : 读到的数据.* Caller(s) : Application.* Note(s) : (1) *-* Modified by : * Modified date : * Description :*-*/ u8 I2C_EE_Drv_ReadByte(u8 xChip, u16 xAddr, u8 *xpErr) u8 dat; u8 errcnt; u32 tmr; / _WriteEn(); / 写使能/ I2C_Cmd(I2C1, ENABLE); / 使能总线 errcnt = 0; whil
18、e(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY); I2C_GenerateSTART(I2C1, ENABLE); / 发送I2C的START信号,接口自动从从设备编程主设备 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); / 检查I2C的EV5状态并清除 if(tmr =0) errcnt+; I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Transmitter);
19、/ 发送从地址(EEPROM设备地址)和写命令 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);/ 检查I2C的EV6状态并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr >>8)&0x00ff); / 发送 EEPROM 的存储空间地址(高字节) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_C
20、heckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 检查I2C的EV8状态并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr&0x00ff); / 发送 EEPROM 的存储空间地址(低字节) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 检查I2C的EV8状态并清除 if(tmr =0) errcnt+; I2C_
21、GenerateSTART(I2C1, ENABLE); / 发送I2C的START信号,接口自动从从设备编程主设备 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); / 检查I2C的EV5状态并清除 if(tmr =0) errcnt+; I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Receiver); / 发送从地址(EEPROM设备地址)和读命令 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); / 检查I2C的EV6状态并清除 if(tmr =0) errcnt+; tmr = ulTimeOut_Time; while(tmr-)&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肉类加工厂的设备更新与技术创新考核试卷
- 纸张加工中的涂布设备选型与评价考核试卷
- 海洋渔业资源与渔业资源国际友好合作科研机构合作考核试卷
- 自行车对社交互动的促进考核试卷
- 糕点烘焙店的品牌故事传播考核试卷
- 湄洲湾职业技术学院《西方舞蹈鉴赏》2023-2024学年第二学期期末试卷
- 山东省济南市历城2025届初三新起点调研考试生物试题含解析
- 山东省临沂市费县重点达标名校2025届初三下学期线上周生物试题含解析
- 江西中医药大学《大学化学Ⅲ》2023-2024学年第二学期期末试卷
- 思茅地区翠云区2024-2025学年数学四下期末经典试题含解析
- 四川省南充市阆中中学校2024-2025学年高二下学期4月期中 化学试题(含答案)
- 2025年西班牙语DELE考试真题卷:西班牙语语音与发音训练试题
- 2025河北地质大学招聘工作人员48人笔试备考题库及答案解析
- 购买机票合同协议
- 2025-2030医用超声仪器市场投资前景分析及供需格局研究研究报告
- 2025-2030儿童智能手表行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2025年03月四川天府新区“蓉漂人才荟”事业单位(13人)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025年高考物理压轴题专项训练:用力学三大观点处理多过程运动问题(原卷版)
- 育种学 课件 第9章 林木抗逆性育种学习资料
- 2025年江苏南通苏北七市高三二模高考生物试卷(含答案详解)
- 2024年陪诊师考试教材相关试题及答案
评论
0/150
提交评论