




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、#ifndef _24cXX_H#define_24cXX_H/* Includes -*/#include "stm32f10x.h"#include "value.h"/#include "stdbool.h"/* Define -*/* EEPROM Addresses defines */注:32 64 的字地址是16位 2個(gè)字節(jié) 如果使用32或64請(qǐng)簡(jiǎn)單修改驅(qū)動(dòng)即可#define WC24cXX 0x00/ 器件地址 寫#define RC24cXX 0x01/ 器件地址 讀#define USE_24C08 /使用24C0
2、8#ifdef USE_24C02#define MAXSIZE24cXX256/ 總?cè)萘?Bytes /級(jí)聯(lián)時(shí)請(qǐng)修改本參數(shù)和硬件驅(qū)動(dòng)#define BLOCK_SIZE256/ 塊容量 Bytes#define I2C_PAGESIZE8/ 8個(gè)字節(jié)每頁(yè)#endif#ifdef USE_24C04#define MAXSIZE24cXX512/ 總?cè)萘?Bytes /級(jí)聯(lián)時(shí)請(qǐng)修改本參數(shù)和硬件驅(qū)動(dòng)#define BLOCK_SIZE256/ 塊容量 Bytes#define I2C_PAGESIZE16/ 16個(gè)字節(jié)每頁(yè)#endif#ifdef USE_24C08#define MAXSIZE
3、24cXX1024/ 總?cè)萘?Bytes /級(jí)聯(lián)時(shí)請(qǐng)修改本參數(shù)和硬件驅(qū)動(dòng)#define BLOCK_SIZE256/ 塊容量 Bytes#define I2C_PAGESIZE16/ 16個(gè)字節(jié)每頁(yè)/* user define */#define YBCV_ADDR_0 0x0000/定義儀表控制數(shù)據(jù)結(jié)構(gòu)體的EEPROM存儲(chǔ)地址0#define YBCV_ADDR_10x0200/定義儀表控制數(shù)據(jù)結(jié)構(gòu)體的EEPROM存儲(chǔ)地址1#define EEPROM_VERIFY YB_CTRL_VALE_SIZE /EEPROM儀表通道修正參數(shù)存儲(chǔ)地址#endif#ifdef USE_24C16#def
4、ine MAXSIZE24cXX2048/ 總?cè)萘?Bytes#define I2C_PAGESIZE16/ 16個(gè)字節(jié)每頁(yè)#endif#ifdef USE_24C32#define MAXSIZE24cXX4096/ 總?cè)萘?Bytes /級(jí)聯(lián)時(shí)請(qǐng)修改本參數(shù)和硬件驅(qū)動(dòng)#define BLOCK_SIZE4096/ 塊容量 Bytes#define I2C_PAGESIZE32/ 16個(gè)字節(jié)每頁(yè)#endif#ifdef USE_24C64#define MAXSIZE24cXX8192/ 總?cè)萘?Bytes /級(jí)聯(lián)時(shí)請(qǐng)修改本參數(shù)和硬件驅(qū)動(dòng)#define BLOCK_SIZE8192/ 塊容量
5、Bytes#define I2C_PAGESIZE32/ 16個(gè)字節(jié)每頁(yè)#endif#define I2CInit I2C_GPIO_Config#define SCL(a) if (a) GPIO_SetBits(GPIOB, GPIO_Pin_10);else GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define SDA(a) if (a) GPIO_SetBits(GPIOB, GPIO_Pin_11);else GPIO_ResetBits(GPIOB,GPIO_Pin_11)#define SCLO GPIO_ReadInputDataBit(GPIOB,
6、 GPIO_Pin_10)#define SDAO GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)/* Private -*/* Public -*/*uint idata ucSendBuffer8=0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80;uint idata ucReceData;uint idata ucReceiveBuffer8;/從器件中讀出的多字節(jié)數(shù)據(jù)暫存區(qū)*/* Function Declaration -*/extern bool I2C2_Init(void);/I2C初始化/extern boo
7、l I2C_ByteWrite(u8* pBuffer, u8 WriteAddr);/向24cXX中寫入1個(gè)字節(jié)extern bool I2C_PageWrite(u8* pBuffer, u8 BlockCode, u16 WriteAddr, u8 n);/24cXX頁(yè)寫 (不超過(guò)一頁(yè))extern bool I2C_BlockWrite(u8* pBlock, u8 BlockCode, u16 WriteAddr, u16 n);/24cXX數(shù)據(jù)塊寫(不超過(guò)BLOCK_SIZE個(gè)字節(jié))extern bool I2C_BufferWrite(u8* pBuffer, u16 Write
8、Addr, u16 n);/24cXX數(shù)據(jù)寫(不超過(guò)MAXSIZE24cXX個(gè)字節(jié))extern bool I2C_BufferRead(u8* pBuffer, u16 ReadAddr, u16 n);/從24cXX中讀出N字節(jié)數(shù)據(jù)(不超過(guò)MAXSIZE24cXX個(gè)字節(jié))/extern void I2C_EE_WaitEepromStandbyState(void);/等待24CXX內(nèi)部寫周期結(jié)束#endif /*_24cXX_H*/* (C) COPYRIGHT 2015 XXXXX * * 文件名 :24cXX.c * 描述 :本函數(shù)是xx項(xiàng)目的24cXX的讀寫函數(shù) * 平臺(tái) :Kei
9、l 4 MDK stm32 3.5.0庫(kù) * 庫(kù)版本 :基于野火相關(guān)資料及程序上優(yōu)化修改 * 作者 :天涯月下紅顏?zhàn)?* 時(shí)間 :2015.4.19*/* Includes -*/#include "24cXX.h"#include "value.h"#include "systick.h"#include <stdlib.h>/* * 函數(shù)名:I2C2_Init * 描述 :I2C2初始化 * 輸入 :無(wú) * 輸出 :無(wú) * 調(diào)用 :內(nèi)部調(diào)用 */bool I2C2_Init(void)bool s = true; GP
10、IO_InitTypeDef GPIO_InitStructure; /* 使能與 I2CGPIO 有關(guān)的時(shí)鐘 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* PB10-I2C2_SCL、PB11-I2C2_SDA*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
11、/ 普通開(kāi)漏輸出 GPIO_Init(GPIOB, &GPIO_InitStructure);SDA(1);SCL(1);Delay_nop();Delay_nop();if(!SDAO) s = false;if(!SCLO) s = false;SDA(0);Delay_nop();Delay_nop();if(SDAO) s = false;SCL(0);Delay_nop();SDA(0);SCL(0);Delay_nop();Delay_nop();if(SDAO) s = false;if(SCLO) s = false;SCL(1);Delay_nop();Delay_n
12、op();SDA(1);return s;/*開(kāi)啟24cXX的I2C總線*/static bool I2CStart(void)SDA(1);SCL(1);Delay_nop();Delay_nop();if(!SDAO)return false;/SDA線為低電平則總線忙,退出SDA(0);Delay_nop();Delay_nop();if(SDAO)return false;/SDA線為高電平則總線出錯(cuò),退出SCL(0);Delay_nop();return true;/*關(guān)閉24cXX的I2C總線*/static void I2CStop(void)SDA(0);SCL(0);Dela
13、y_nop();Delay_nop();SCL(1);Delay_nop();Delay_nop();SDA(1);/*發(fā)送 ACK*/static void I2CAck(void)SDA(0);SCL(0);Delay_nop();/Delay_nop();SCL(1);Delay_nop();/Delay_nop();SCL(0);/*發(fā)送NO ACK*/static void I2CNoAck(void)SDA(1);SCL(0);Delay_nop();/Delay_nop();SCL(1);Delay_nop();/Delay_nop();SCL(0);/*讀取ACK信號(hào)*/sta
14、tic bool I2CWaitAck(void) /返回為:1=有ACK,0=無(wú)ACKSCL(0);SDA(1);/設(shè)置SDA為輸入Delay_nop();/Delay_nop();SCL(1);Delay_nop();/Delay_nop();if(SDAO)SCL(0);return false;SCL(0);return true;/*MCU向24cXX發(fā)送一個(gè)字節(jié)數(shù)據(jù) */static void I2CSendByte(u8 demand) /數(shù)據(jù)從高位到低位/u8 i=8; while(i-)SCL(0);Delay_nop();SDA(bool)(demand&0x80)
15、;demand<<=1;Delay_nop();/Delay_nop();SCL(1);Delay_nop();/Delay_nop();SCL(0);/*MCU從24cXX讀入一字節(jié)數(shù)據(jù)*/static u8 I2CReceiveByte(void) /數(shù)據(jù)從高位到低位/u8 i=8;u8 ddata=0;SDA(1);/設(shè)置SDA為輸入while(i-)ddata<<=1; /數(shù)據(jù)從高位開(kāi)始讀取SCL(0);Delay_nop();/Delay_nop();SCL(1);Delay_nop();/從高位開(kāi)始 ddata|=SDA;ddata<<=1/De
16、lay_nop();if(SDAO)ddata|=0x01;SCL(0);return ddata;/* * 函數(shù)名:I2C_EE_WaitEepromStandbyState * 描述 :Wait for EEPROM Standby state * 輸入 :無(wú) * 輸出 :無(wú) * 返回 :無(wú) * 調(diào)用 : */static void I2C_EE_WaitEepromStandbyState(u8 BlockCode) int i = 50;doDelay_us(100);I2CStart();I2CSendByte(BlockCode | WC24cXX);/發(fā)送器件地址 寫while(
17、I2CWaitAck() = 0 && i- > 0);I2CStop();/*向24cXX中寫入1個(gè)字節(jié)*/*static bool I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)I2CStart();/啟動(dòng)I2CI2CSendByte(WC24cXX);/發(fā)送器件地址 寫if(I2CWaitAck() = 0) return false;I2CSendByte(WriteAddr);if(I2CWaitAck() = 0) return false;I2CSendByte(*pBuffer);if(I2CWaitAck() = 0)
18、return false;I2CStop();return true;*/* * 函數(shù)名:I2C_PageWrite * 描述 :在EEPROM的一個(gè)寫循環(huán)中可以寫多個(gè)字節(jié),但一次寫入的字節(jié)數(shù) * 不能超過(guò)EEPROM頁(yè)的大小。AT24C08每頁(yè)有16個(gè)字節(jié)。 * 輸入 :-pBuffer 緩沖區(qū)指針 * -BlockCode 起始器件地址 * -WriteAddr 接收數(shù)據(jù)的EEPROM的地址 * -n 要寫入EEPROM的字節(jié)數(shù) * 返回 :0:失敗 1:成功 * 調(diào)用 :外部調(diào)用 */bool I2C_PageWrite(u8* pBuffer, u8 BlockCode, u16 Wr
19、iteAddr, u8 n)u16 i;if(n > I2C_PAGESIZE - WriteAddr%I2C_PAGESIZE)/para checkreturn false;if(n = 0)return true;if(I2CStart() = false)Delay_us(100);if(I2CStart() = false)return false;/啟動(dòng)I2CI2CSendByte(BlockCode | WC24cXX);/發(fā)送器件地址 寫if(I2CWaitAck() = 0) return false;#if defined(USE_24C32)I2CSendByte(
20、u8)(WriteAddr >> 8);#elif defined(USE_24C64)I2CSendByte(u8)(WriteAddr >> 8);#endifI2CSendByte(u8)WriteAddr);if(I2CWaitAck() = 0) return false;for(i = 0; i < n; i+)/寫入I2C_PAGESIZE字節(jié)數(shù)據(jù)I2CSendByte(pBufferi);if(I2CWaitAck() = 0) return false;I2CStop();I2C_EE_WaitEepromStandbyState(BlockCo
21、de);return true;/* * 函數(shù)名:I2C_BlockWrite * 描述 :將塊緩沖區(qū)中的數(shù)據(jù)寫到I2C EEPROM中 * 輸入 :-pBuffer 塊緩沖區(qū)指針 * -BlockCode 起始器件地址 * -WriteAddr 接收數(shù)據(jù)的EEPROM的地址 * -n 要寫入EEPROM的字節(jié)數(shù) * 返回 :0:失敗 1:成功 * 調(diào)用 :外部調(diào)用 */bool I2C_BlockWrite(u8* pBlock, u8 BlockCode, u16 WriteAddr, u16 n) u16 ByteOf1st = 0, ByteOfOther = 0; /第一頁(yè)的字節(jié)數(shù)
22、最后一頁(yè)的字節(jié)數(shù)u8 NumOfMPage = 0;/需要寫滿數(shù)據(jù)的頁(yè)數(shù)if(n > BLOCK_SIZE - WriteAddr%BLOCK_SIZE)/para checkreturn false;if(n = 0)return true; ByteOf1st = I2C_PAGESIZE - WriteAddr % I2C_PAGESIZE;if(n > ByteOf1st)NumOfMPage = (n - ByteOf1st) / I2C_PAGESIZE;ByteOfOther = (n - ByteOf1st) % I2C_PAGESIZE;elseByteOf1st
23、 = n;NumOfMPage = 0;ByteOfOther = 0;if(I2C_PageWrite(pBlock, BlockCode, WriteAddr, ByteOf1st) = false)return false;WriteAddr += ByteOf1st;pBlock += ByteOf1st;while(NumOfMPage-)if(I2C_PageWrite(pBlock, BlockCode, WriteAddr, I2C_PAGESIZE) = false)return false;WriteAddr += I2C_PAGESIZE;pBlock += I2C_PA
24、GESIZE;if(I2C_PageWrite(pBlock, BlockCode, WriteAddr, ByteOfOther) = false)return false;return true;/* * 函數(shù)名:I2C_BufferWrite * 描述 :將緩沖區(qū)中的數(shù)據(jù)寫到I2C EEPROM中 * 輸入 :-pBuffer 緩沖區(qū)指針 * -WriteAddr 接收數(shù)據(jù)的EEPROM的地址 * -n 要寫入EEPROM的字節(jié)數(shù) * 返回 :0:失敗 1:成功 * 調(diào)用 :外部調(diào)用 */bool I2C_BufferWrite(u8* pBuffer, u16 WriteAddr, u
25、16 n) u16 ByteOf1st = 0, ByteOfOther = 0; /第一塊的字節(jié)數(shù) 最后一塊的字節(jié)數(shù)u8 NumOfMBlock = 0;/需要寫滿數(shù)據(jù)的塊const u16 ReadAddr = WriteAddr;/讀地址u8* pstr = pBuffer;u8 BlockCode = 0;/起始器件地址u8* pReadBuff = NULL;u16 i = 0;if(n + WriteAddr > MAXSIZE24cXX | n + WriteAddr = 0) /para checkreturn false; ByteOf1st = BLOCK_SIZE
26、- WriteAddr % BLOCK_SIZE;if(n > ByteOf1st)NumOfMBlock = (n - ByteOf1st) / BLOCK_SIZE;ByteOfOther = (n - ByteOf1st) % BLOCK_SIZE;elseByteOf1st = n;NumOfMBlock = 0;ByteOfOther = 0;_close_interrupt();/關(guān)總中斷BlockCode = (u8)(WriteAddr/BLOCK_SIZE << 1) | 0xA0);if(I2C_BlockWrite(pstr, BlockCode, Wr
27、iteAddr, ByteOf1st) = false)_open_interrupt(); /開(kāi)總中斷return false;WriteAddr += ByteOf1st;pstr += ByteOf1st;while(NumOfMBlock-)BlockCode += 0x02;if(I2C_BlockWrite(pstr, BlockCode, WriteAddr, BLOCK_SIZE) = false)_open_interrupt(); /開(kāi)總中斷return false;WriteAddr += BLOCK_SIZE;pstr += BLOCK_SIZE;BlockCode +
28、= 0x02;if(I2C_BlockWrite(pstr, BlockCode, WriteAddr, ByteOfOther) = false)_open_interrupt(); /開(kāi)總中斷return false;pReadBuff = (u8*)malloc(n);if(pReadBuff = NULL)_open_interrupt(); /開(kāi)總中斷return false;if(I2C_BufferRead(pReadBuff,ReadAddr,n) = false)_open_interrupt(); /開(kāi)總中斷return false;for(i = 0; i < n;
29、 i+)if(pReadBuffi != pBufferi)free(pReadBuff);_open_interrupt(); /開(kāi)總中斷return false;free(pReadBuff);_open_interrupt(); /開(kāi)總中斷return true;/*名稱:bool I2C_BufferRead*功能:從24cXX中讀出讀取一塊數(shù)據(jù)(不超過(guò)MAXSIZE24cXX個(gè)字節(jié)) * 輸入 :-pBuffer 緩沖區(qū)指針 * -ReadAddr EEPROM的數(shù)據(jù)地址 * -n 要從EEPROM讀出的字節(jié)數(shù) * 返回 :0:失敗 1:成功 * 調(diào)用 :外部調(diào)用*/bool I2C_BufferRead(u8* pBuffer, u16 ReadAddr, u16 n)u16 i = 50;u8 BlockCode = 0;BlockCode = (u8)(ReadAddr/BLOCK_SIZE << 1) | 0xA0);_c
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建漳州2024~2025學(xué)年高一下冊(cè)期末數(shù)學(xué)試題學(xué)生卷
- 個(gè)性化營(yíng)養(yǎng)方案制定考核試卷
- 獸用抗生素批發(fā)政策考核試卷
- 可持續(xù)發(fā)展與企業(yè)綠色物流實(shí)踐考核試卷
- 變電站自然災(zāi)害應(yīng)對(duì)措施考核試卷
- 化纖漿粕高溫過(guò)濾材料的生物降解性探討考核試卷
- 一次性護(hù)目鏡的防沖擊與防紫外線性能的國(guó)際標(biāo)準(zhǔn)對(duì)比考核試卷
- 2025年中國(guó)PE不飽和聚酯漆數(shù)據(jù)監(jiān)測(cè)報(bào)告
- 2025年中國(guó)L-酒石酸數(shù)據(jù)監(jiān)測(cè)報(bào)告
- 2025年中國(guó)E-cares面部雕塑系統(tǒng)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 電廠安規(guī)考試題庫(kù)及答案
- 2021-2022學(xué)年浙江省杭州市拱墅區(qū)英語(yǔ)小升初新生分班考試卷 附解析
- 網(wǎng)絡(luò)輿情監(jiān)控管理制度
- 2024-2025學(xué)年人教版(2024)初中英語(yǔ)七年級(jí)下冊(cè)教學(xué)工作總結(jié)(共4套)
- Unit 1 Happy Holiday 第5課時(shí)(Section B 2a-3c) 2025-2026學(xué)年人教版英語(yǔ)八年級(jí)下冊(cè)
- 2025年中國(guó)三元乙丙橡膠市場(chǎng)調(diào)查研究報(bào)告
- 機(jī)器試用擔(dān)保協(xié)議書范本
- 常見(jiàn)耐藥菌感染診療與防控
- 征兵體檢外科標(biāo)準(zhǔn)
- 小學(xué)生預(yù)防拐騙教育課件
- 2025-2030年中國(guó)基于細(xì)胞的人源化小鼠模型行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
評(píng)論
0/150
提交評(píng)論