I2C 24CXX驅(qū)動(dòng)程序(真正實(shí)用 全)_第1頁(yè)
I2C 24CXX驅(qū)動(dòng)程序(真正實(shí)用 全)_第2頁(yè)
I2C 24CXX驅(qū)動(dòng)程序(真正實(shí)用 全)_第3頁(yè)
I2C 24CXX驅(qū)動(dòng)程序(真正實(shí)用 全)_第4頁(yè)
I2C 24CXX驅(qū)動(dòng)程序(真正實(shí)用 全)_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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/ 器件地址 寫(xiě)#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中寫(xiě)入1個(gè)字節(jié)extern bool I2C_PageWrite(u8* pBuffer, u8 BlockCode, u16 WriteAddr, u8 n);/24cXX頁(yè)寫(xiě) (不超過(guò)一頁(yè))extern bool I2C_BlockWrite(u8* pBlock, u8 BlockCode, u16 WriteAddr, u16 n);/24cXX數(shù)據(jù)塊寫(xiě)(不超過(guò)BLOCK_SIZE個(gè)字節(jié))extern bool I2C_BufferWrite(u8* pBuffer, u16 Write

8、Addr, u16 n);/24cXX數(shù)據(jù)寫(xiě)(不超過(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)部寫(xiě)周期結(jié)束#endif /*_24cXX_H*/* (C) COPYRIGHT 2015 XXXXX * * 文件名 :24cXX.c * 描述 :本函數(shù)是xx項(xiàng)目的24cXX的讀寫(xiě)函數(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ā)送器件地址 寫(xiě)while(

17、I2CWaitAck() = 0 && i- > 0);I2CStop();/*向24cXX中寫(xiě)入1個(gè)字節(jié)*/*static bool I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)I2CStart();/啟動(dòng)I2CI2CSendByte(WC24cXX);/發(fā)送器件地址 寫(xiě)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è)寫(xiě)循環(huán)中可以寫(xiě)多個(gè)字節(jié),但一次寫(xiě)入的字節(jié)數(shù) * 不能超過(guò)EEPROM頁(yè)的大小。AT24C08每頁(yè)有16個(gè)字節(jié)。 * 輸入 :-pBuffer 緩沖區(qū)指針 * -BlockCode 起始器件地址 * -WriteAddr 接收數(shù)據(jù)的EEPROM的地址 * -n 要寫(xiě)入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ā)送器件地址 寫(xiě)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+)/寫(xiě)入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ù)寫(xiě)到I2C EEPROM中 * 輸入 :-pBuffer 塊緩沖區(qū)指針 * -BlockCode 起始器件地址 * -WriteAddr 接收數(shù)據(jù)的EEPROM的地址 * -n 要寫(xiě)入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;/需要寫(xiě)滿數(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ù)寫(xiě)到I2C EEPROM中 * 輸入 :-pBuffer 緩沖區(qū)指針 * -WriteAddr 接收數(shù)據(jù)的EEPROM的地址 * -n 要寫(xiě)入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;/需要寫(xiě)滿數(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論