版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
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 ) / 已經(jīng)試了5次,寫下一個數(shù)據(jù) retry = 5; pbuf+; addr+;
3、 len-; else / 順利,寫下一個數(shù)據(jù) pbuf+; addr+; len-; I2C_EE_Drv_BusDis(); / 失能總線,寫保護(hù)/* 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) / 已經(jīng)試了5次,讀下一個數(shù)據(jù) retry = 5; pbuf+; addr+; len-; else / 順利,讀下一個數(shù)據(jù) pbuf+; addr+; len-; I2C_EE_Drv_BusDis(); / 失能總線,寫保護(hù) /* I2C_EE_Drv_Init()* Description : I2C1初始化,默認(rèn)情況下,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; / 復(fù)用功能開漏輸出模式 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 應(yīng)答信號 )* * Argument(s) : xChip - 從器件地址* xAddr - EEPROM存儲空間地
11、址 * xDat - 數(shù)據(jù)* Return(s) : errcnt - 操作的結(jié)果 >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信號,接口自動從從設(shè)備編程主設(shè)備 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設(shè)備地址) 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信號,接口自動從主設(shè)備編程從設(shè)備/ _WriteDis(); / 寫失能/ I2C_Cmd(I2C1, DISABLE); / 失能總線 return(errcnt); /* I2C_EE_Drv
16、_ReadByte()* Description : 從EEPROM 的指定的地址讀出一個字節(jié)的數(shù)據(jù)* 選擇/隨機(jī)讀操作:允許主器件對寄存器的任意字節(jié)進(jìn)行讀操作* 起始信號 * -> 從器件地址( 包括寫命令 )* a-> EEPROM存儲空間地址高字節(jié) * a-> EEPROM存儲空間地址低字節(jié) * a-> 起始信號 * -> 從器件地址( 包括讀命令 ) * a-> 得到數(shù)據(jù) * -> 停止信號 * 共4次a (注:a - Ack 應(yīng)答信號 )* Argument(s) : xChip - 從器件地址* xAddr - EEPROM存儲空間地址 *
17、 xpErr - 用于返回操作結(jié)果 >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信號,接口自動從從設(shè)備編程主設(shè)備 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設(shè)備地址)和寫命令 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信號,接口自動從從設(shè)備編程主設(shè)備 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設(shè)備地址)和讀命令 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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第4單元 民族團(tuán)結(jié)與祖國統(tǒng)一(B卷·能力提升練)(解析版)
- 2024年公務(wù)員年底工作總結(jié)
- 羽絨原料供應(yīng)鏈風(fēng)險管理-洞察分析
- 云計算與大數(shù)據(jù)集成-洞察分析
- 天王星極光形成機(jī)制研究-洞察分析
- 微生物酶促反應(yīng)在水處理中的應(yīng)用-洞察分析
- 水解蛋白在醫(yī)藥領(lǐng)域的應(yīng)用-洞察分析
- 虛擬化網(wǎng)絡(luò)切片資源分配-洞察分析
- 網(wǎng)絡(luò)拍賣市場發(fā)展趨勢分析-洞察分析
- 虛擬空間中的三維藝術(shù)-洞察分析
- 2024年北京通州區(qū)初三九年級上學(xué)期期末數(shù)學(xué)試題和答案
- 新蘇教版3三年級數(shù)學(xué)上冊(表格式)教案【全冊】
- 北師大版三年級數(shù)學(xué)上冊寒假作業(yè)96
- DB11∕T 1735-2020 地鐵正線周邊建設(shè)敏感建筑物項目環(huán)境振動控制規(guī)范
- 沿用甲方背靠背合同協(xié)議
- 高等教育心理學(xué)試題及答案(高校教師資格考試)
- 舞蹈興趣小組活動記錄
- 醫(yī)院檢驗科實驗室生物安全程序文件SOP
- 建立強大的人際影響力與領(lǐng)導(dǎo)力
- 九年級歷史期末考試質(zhì)量分析
- 視覺傳達(dá)設(shè)計教資面試
評論
0/150
提交評論