




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、u32 ulTimeOut_Time; /* I2C_EE_WriteStr()* Description : 將一個數(shù)據(jù)塊寫入EEPROM 的指定的地址* Argument(s) : xChip - 從器件地址* xAddr - EEPROM存儲空間地址 * xpBuf - 數(shù)據(jù)緩沖區(qū)指針* xLen - 數(shù)據(jù)長度* 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次,寫下一個數(shù)據(jù) retry = 5; pbuf+; addr+;
3、 len-; else / 順利,寫下一個數(shù)據(jù) pbuf+; addr+; len-; I2C_EE_Drv_BusDis(); / 失能總線,寫保護/* I2C_EE_ReadStr()* Description : 從EEPROM 的指定的地址讀出一個數(shù)據(jù)塊* Argument(s) : xChip - 從器件地址* xAddr - EEPROM存儲空間地址 * xpBuf - 數(shù)據(jù)緩沖區(qū)指針* xLen - 數(shù)據(jù)長度* 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次,讀下一個數(shù)據(jù) retry = 5; pbuf+; addr+; len-; else / 順利,讀下一個數(shù)據(jù) 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); / 等待程序的執(zhí)行時間:10 個指令周期/* I2C_EE_Drv_WriteByte()* Description : 將一個字節(jié)的數(shù)據(jù)寫入EEPROM 的指定的地址* 字節(jié)寫模式:* 起始信號 * -> 從器件地址( 包括寫命令 ) * a-> EEPROM存儲空間地址高字節(jié) * a-> EEPROM存儲空間地址低字節(jié) * a-> 數(shù)據(jù) * a-> 停止信號 * 共4次a (注:a - Ack 應答信號 )* * Argument(s) : xChip - 從器件地址* xAddr - EEPROM存儲空間地
11、址 * xDat - 數(shù)據(jù)* Return(s) : errcnt - 操作的結果 >0 : 操作出現(xiàn)錯誤* 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); / 發(fā)送I2C的START信號,接口自動從從設備編程主設備 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); / 檢查I2C的EV5狀態(tài)并清除 if(tmr =0) errcnt+; I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Transmitter); / 發(fā)送從地
13、址(EEPROM設備地址) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);/ 檢查I2C的EV6狀態(tài)并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr >>8)&0x00ff); / 發(fā)送 EEPROM 的存儲空間地址(高字節(jié)) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(
14、I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 檢查I2C的EV8狀態(tài)并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr&0x00ff); / 發(fā)送 EEPROM 的存儲空間地址(低字節(jié)) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 檢查I2C的EV8狀態(tài)并清除 if(tmr =0) errcnt+; I2C_SendData(I
15、2C1, xDat); / 發(fā)送數(shù)據(jù) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 檢查I2C的EV8狀態(tài)并清除 if(tmr =0) errcnt+; I2C_GenerateSTOP(I2C1, ENABLE); / 發(fā)送I2C的STOP信號,接口自動從主設備編程從設備/ _WriteDis(); / 寫失能/ I2C_Cmd(I2C1, DISABLE); / 失能總線 return(errcnt); /* I2C_EE_Drv
16、_ReadByte()* Description : 從EEPROM 的指定的地址讀出一個字節(jié)的數(shù)據(jù)* 選擇/隨機讀操作:允許主器件對寄存器的任意字節(jié)進行讀操作* 起始信號 * -> 從器件地址( 包括寫命令 )* a-> EEPROM存儲空間地址高字節(jié) * a-> EEPROM存儲空間地址低字節(jié) * a-> 起始信號 * -> 從器件地址( 包括讀命令 ) * a-> 得到數(shù)據(jù) * -> 停止信號 * 共4次a (注:a - Ack 應答信號 )* Argument(s) : xChip - 從器件地址* xAddr - EEPROM存儲空間地址 *
17、 xpErr - 用于返回操作結果 >0 : 操作出現(xiàn)錯誤* Return(s) : 讀到的數(shù)據(jù).* 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); / 發(fā)送I2C的START信號,接口自動從從設備編程主設備 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); / 檢查I2C的EV5狀態(tài)并清除 if(tmr =0) errcnt+; I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Transmitter);
19、/ 發(fā)送從地址(EEPROM設備地址)和寫命令 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);/ 檢查I2C的EV6狀態(tài)并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr >>8)&0x00ff); / 發(fā)送 EEPROM 的存儲空間地址(高字節(jié)) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_C
20、heckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 檢查I2C的EV8狀態(tài)并清除 if(tmr =0) errcnt+; I2C_SendData(I2C1, (u8)(xAddr&0x00ff); / 發(fā)送 EEPROM 的存儲空間地址(低字節(jié)) tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED); / 檢查I2C的EV8狀態(tài)并清除 if(tmr =0) errcnt+; I2C_
21、GenerateSTART(I2C1, ENABLE); / 發(fā)送I2C的START信號,接口自動從從設備編程主設備 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT); / 檢查I2C的EV5狀態(tài)并清除 if(tmr =0) errcnt+; I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Receiver); / 發(fā)送從地址(EEPROM設備地址)和讀命令 tmr = ulTimeOut_Time; while(tmr-)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); / 檢查I2C的EV6狀態(tài)并清除 if(tmr =0) errcnt+; tmr = ulTimeOut_Time; while(tmr-)&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 探討2025年創(chuàng)業(yè)扶持政策與科技創(chuàng)新的結合試題及答案
- 金融與投資行業(yè):2025年金融科技在信用評級領域的應用與挑戰(zhàn)
- 2025年郵輪旅游市場產業(yè)發(fā)展現(xiàn)狀與未來趨勢研究報告
- 新能源汽車用戶體驗提升的技術探索試題及答案
- 海外交流2025年商務英語考試試題及答案
- 鋼鐵行業(yè)綠色轉型與產能布局優(yōu)化政策效應研究報告
- 工業(yè)互聯(lián)網平臺邊緣計算硬件架構2025年邊緣計算與工業(yè)互聯(lián)網平臺協(xié)同創(chuàng)新報告
- 有機化學主要反應類型試題及答案
- 主題公園沉浸式體驗項目設計與2025年旅游產品創(chuàng)新結合的研究報告
- 教師教育教學反思的價值與方法試題及答案
- 壓敏電阻材料在織物上的印刷技術應用
- 2025民宿租賃合同標準范本
- 2025-2030中國水鎂石行業(yè)供需形勢與營銷策略分析研究報告
- 遼寧省部分高中2023-2024學年高二下學期期中考試數(shù)學試題(解析版)
- 四川省南充市閬中中學校2024-2025學年高二下學期4月期中 化學試題(含答案)
- 食用農產品集中交易市場基本情況信息表
- 購買機票合同協(xié)議
- 蓄水池水池清洗方案
- 2024年陪診師考試教材相關試題及答案
- 統(tǒng)編版七年級語文下冊《第16課有為有不為》教案
- 高中部學生會職責與組織架構分析
評論
0/150
提交評論