?? 24c04.c
字號(hào):
/*******************************************************************************
* 版權(quán)所有(c) 豪恩科技有限公司
*
* 文件名稱: 24C04.H
* 文件標(biāo)識(shí):
* 內(nèi)容摘要: 24C04的基本讀寫(xiě)程序。但沒(méi)有定義SDA,SCL。
* 先定義SDA,SCL。還需要定義24C04的A2,A1。
* 再包含該文件。
* 函數(shù)有, I2CStart , I2CStop ,
* 其他說(shuō)明: 所有子函數(shù)要求在退出時(shí)統(tǒng)一都保證SCL為高,帶返回值的,成功返回0,失敗返回1
* 當(dāng)前版本: 00.000
* 作 者: 涂常亮
* 完成日前: 2005
* 修改記錄1:
* 修改日期:
* 版 本 號(hào):
* 修 改 人:
* 修改內(nèi)容:
* 修改記錄2:
*******************************************************************************/
#include <intrins.h>
#include<reg54.h>
//#define USE_SEQ_RD
//定義 24C04_H不合理 ???
#ifndef AT24C04_H
#define AT24C04_H
#ifdef ADD_24C04_A2A1
#define ADD_WRITE_24C04 0xA0 | ADD_24C04_A2A1
#define ADD_READ_24C04 0xA1 | ADD_24C04_A2A1
#else
#define ADD_WRITE_24C04 0xA0
#define ADD_READ_24C04 0xA1
#endif
//定義24C04的響應(yīng)等待時(shí)間,Datasheet是10ms,
#define WAIT_ACK_TIME 11
//讀寫(xiě)24C04的返回值
#define WR_SUCC_RTN 0
#define RD_SUCC_RTN 0
#define WR_FAIL_RTN 0xFF
#define RD_FAIL_RTN 0xFF
#define ERR_TIME_OV 1
#define ERR_ILLEGAL_ADD 2
//寫(xiě)入后讀出值和寫(xiě)入值不同
#define ERR_WRT_WRONG_RESULT 1
//連續(xù)讀時(shí)地址超出范圍
#define ERR_ADD_OV
sbit pin_SCL = P1^3;
sbit pin_SDA = P1^4;
//sbit pin_WP = P4^1;
#define SDA pin_SDA
#define SCL pin_SCL
extern volatile unsigned char idata g_ucTimer24C04Ack;
extern bit g_FlagWaiting24C04Ack;
void I2CStart(void);
void I2CStop(void);
bit ReadAck(void);
void SendAck(void);
void Send8Bit(unsigned char uc8BitSend);
unsigned char Recev8Bit(void);
bit WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite);
unsigned char ReadByte(unsigned int uiAddRead);
unsigned char PageWrite(unsigned char const idata *pucDataWrt,
unsigned int uiAddStart_PgWr,
unsigned char ucLength_PgWr);
unsigned char PageFill(unsigned char const idata ucDataPgFill,
unsigned int uiAddStart_Fill,
unsigned char ucLengthFill);
bit SeqRead(unsigned int uiAddStart_SqRd, unsigned char ucLength_SqRd,
unsigned char *pucDataStr);
/*******************************************************************************
* 函數(shù)名稱: void I2CStart(void);
* 功能描述: 發(fā)送I2C起始位
* 輸入?yún)?shù): 無(wú)
* 輸出參數(shù): 無(wú)
* 返 回 值: 無(wú)
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void I2CStart(void)
{
//SCL = 0; //在多機(jī)時(shí)有用
//_nop_();
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SDA = 0;
SCL = 0;
}
/*******************************************************************************
* 函數(shù)名稱: void I2CStop(void)
* 功能描述: 發(fā)送I2C停止位
* 輸入?yún)?shù): 無(wú)
* 輸出參數(shù): 無(wú)
* 返 回 值: 無(wú)
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void I2CStop(void)
{
SCL = 0;
_nop_();
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SDA = 1;
}
/*******************************************************************************
* 函數(shù)名稱: bit ReadAck(void);
* 功能描述: 主機(jī)讀取I2C總線的應(yīng)答信號(hào)
* 輸入?yún)?shù): 無(wú)
* 輸出參數(shù): 無(wú)
* 返 回 值: 位變量,應(yīng)答期間SDA的為高返回1,為低返回0
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
bit ReadAck(void)
{
bit FlagAck;
//SCL = 0;
SDA = 1;
_nop_();
SCL = 1;
_nop_();
FlagAck = SDA;
SCL = 0;
return (FlagAck);
}
/*******************************************************************************
* 函數(shù)名稱: void Send8Bit(unsigned char uc8BitSend);
* 功能描述: 在I2C總線上發(fā)送一個(gè)字節(jié)
* 輸入?yún)?shù): 1個(gè)字節(jié)的發(fā)送數(shù)據(jù)
* 輸出參數(shù): 無(wú)
* 返 回 值: 位變量。
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
void Send8Bit(unsigned char uc8BitSend)
{
unsigned char idata i;
for (i = 8; i != 0; i--)
{
//SCL = 0;
uc8BitSend += uc8BitSend;
SDA = CY;//SDA = uc8BitSend &0x80;
SCL = 1;
_nop_();
SCL = 0;
}
}
/*******************************************************************************
* 函數(shù)名稱: unsigned char Recev8Bit(void);
* 功能描述: 接收8位數(shù)據(jù)
* 輸入?yún)?shù): 無(wú)
* 輸出參數(shù): 無(wú)
* 返 回 值: 接收到的8位數(shù)據(jù)
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
unsigned char Recev8Bit(void)
{
unsigned char idata i;
unsigned char idata uc8BitRecev = 0;
for (i = 8; i != 0; i--)
{
//SCL = 0;
//_nop_();
SCL = 1;
uc8BitRecev <<= 1;
uc8BitRecev |=SDA;
_nop_();
SCL = 0;
}
return uc8BitRecev;
}
/********************************************************************************
* 函數(shù)名稱: bit WriteByte(unsigned char ucDataWrite, unsigned char uiAddWrite);
* 功能描述: 寫(xiě)一個(gè)字節(jié)到指定地址
* 輸入?yún)?shù): ucDataWrite:要寫(xiě)入的數(shù)據(jù), uiAddWrite: 寫(xiě)入地址
* 輸出參數(shù): 無(wú)
* 返 回 值: 位變量.寫(xiě)入成功返回0
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
********************************************************************************/
bit WriteByte(unsigned char ucDataWrite, unsigned int uiAddWrite)
{
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
do{
if ((g_FlagWaiting24C04Ack) && (0 == g_ucTimer24C04Ack)) //10ms等待
{
I2CStop();
return ERR_TIME_OV;
}
I2CStart();
//判斷地址范圍,是否超出24C04范圍,要選第一頁(yè)還是第二頁(yè)
if (0 != (uiAddWrite >> 9))
{
I2CStop();
return ERR_ILLEGAL_ADD;
}
else if (0 != (uiAddWrite >> 8))
{
Send8Bit(ADD_WRITE_24C04 | 0x02);
}
else
{
Send8Bit(ADD_WRITE_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck()); //判斷24C04是否忙
Send8Bit(uiAddWrite);
ReadAck();
Send8Bit(ucDataWrite);
ReadAck();
I2CStop();
if (ucDataWrite != ReadByte(uiAddWrite))
{
return ERR_WRT_WRONG_RESULT;
}
return WR_SUCC_RTN;
}
/*******************************************************************************
* 函數(shù)名稱: unsigned char ReadByte(unsigned int uiAddRead);
* 功能描述: 讀取指定地址的一個(gè)字節(jié)數(shù)據(jù)
* 輸入?yún)?shù): 要讀取的字節(jié)地址
* 輸出參數(shù): 無(wú)
* 返 回 值: 讀出的地址內(nèi)容
* 其他說(shuō)明:
* 修改日期 版 本 號(hào) 修 改 人 修改內(nèi)容
*-------------------------------------------------------------------------------
*
*******************************************************************************/
unsigned char ReadByte(unsigned int idata uiAddRead)
{
unsigned char ucDataRead;
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
do
{
I2CStart();
if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
{
I2CStop();
return ERR_TIME_OV;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -