?? i2c.c
字號:
#include <pic.h>
#include "total.h"
/******************************************************************************************
* 函數名稱: void Check_Idle(void)
* 功能: 檢測總線是否處于空閑狀態
* 入口參數: 無
* 出口參數: 無
* 全局變量: 無
* 調用模塊: 無
* 設計者: 饒陽勝
* 日期: 05/3/1
******************************************************************************************/
void CheckIdle(void)
{
while(STAT_RW != 0); //總線正在向外發送數據
while((SSPCON2 & 0x1F)!= 0);
}
/*****************************************************************************************
* 函數名稱: void WrtAckTest(void)
* 功能: 檢測器件的應答信號
* 入口參數: 無
* 出口參數: 無
* 全局變量: 無
* 調用模塊: 無
* 設計者: 饒陽勝
* 日期: 05-3-1
*****************************************************************************************/
void WrtAckTest(void)
{
SSPIF = 0;
while(SSPIF == 0); //等待總線應答信號
}
/******************************************************************************************
* 函數名稱: void I2C_Write_Byte(unsigned char Devive_Address,unsigned char address,unsigned char data)
* 功能: 向EEPROM中寫入一個字節的數據
* 入口參數: address,(要寫入EEPROM的地址) data(要寫入的數據) Device_Address 器件地址
* 出口參數: 無
* 全局變量:
* 調用模塊:
* 設計者: 饒陽勝
* 日期: 05-3-1
******************************************************************************************/
void I2C_Write_Byte(unsigned char Device_Address,unsigned char Address,unsigned char Data)
{
CheckIdle(); //查詢總線狀態,是否空閑
SEN = 1; //向總線發出起始信號
while(SSPIF == 0); //等待總線的應答信號
SSPBUF = Device_Address; //向總線發出器件地址
WrtAckTest(); //查詢應答信號
while(STAT_BF == 1);
SSPBUF = Address; //向總線發出要寫入的數據存放地址
WrtAckTest(); //查詢應答信號
while(STAT_BF == 1);
SSPBUF = Data; //向總線寫入數據
WrtAckTest(); //查詢應答信號
SSPIF = 0;
PEN = 1; //向總線發出停止信號
while(SSPIF == 0);
SSPIF = 0; //清除總線中斷標志
Delay(16,250); //延時,讓寫操作完成
}
/*******************************************************************************************
* 函數名稱: unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)
* 功能: 從EEPROM中讀出一個字節的數據
* 入口參數: Device_Address(器件地址),Address(數據在EEPROM中的存放地址)
* 出口參數: Data( 讀出的數據)
* 全局變量:
* 調用模塊:
* 設計者: 饒陽勝
* 日期: 05-3-2
********************************************************************************************/
unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)
{
unsigned char Recieve;
CheckIdle();
SSPIF = 0;
SEN = 1;
while(SSPIF == 0);
SSPBUF = Device_Address; //向總線發送器件地址
WrtAckTest(); //等待總線的應答信號
SSPBUF = Address; //向總線發出數據在EEPROM中的存儲地址
WrtAckTest(); //等待總線的應答信號
Delay(16,250);
CheckIdle(); //等待總線處于空閑狀態
SSPIF = 0; //清除總線的中斷標志
RSEN = 1; //發出重啟動信號
while(SSPIF == 0); //等待總線中斷信號,重啟動完成
SSPBUF = (Device_Address + 1); //發出器件地址(+1)表示讀操作
WrtAckTest(); //等總線的應答信號
SSPIF = 0; //清總線中斷標志
RCEN = 1; //使能接收
SSPIF = 0;
while(SSPIF == 0);
Recieve = SSPBUF; //存放接收到的數據
SSPIF = 0; //清除總線的中斷標志
ACKDT = 1; //向總線發出應答信號
ACKEN = 1;
while(SSPIF == 0);
PEN = 1;
while(SSPIF == 0);
SSPIF = 0;
return(Recieve);
}
/******************************************************************************************
* 函數名稱: unsigned char MyWrite(unsigned char *Data,unsigned char Number,
* unsigned char Address)
* 功能: 向EEPROM中寫入標定數據
* 入口參數: *Data(指向要寫入EEPROM的數據的指針) Number(要寫入的數據個數)
* Address(數據在EEPROM中的存放地址)
* 出口參數: unsigned char(0: 寫入不成功, 1: 寫入成功)
* 全局變量:
* 調用模塊: I2C_Write_Byte(向EEPROM中寫入一個字節的數據)
* 設計者: 饒陽勝
* 日期: 05/3/4
* 說明: 數據在EEPROM中的存儲格式為:以字節的形式
* 而數據在RAM中的存儲形式為unsigned short(半字形式),所以要進行轉換
******************************************************************************************/
unsigned char My_Write(bank1 short *data,unsigned char number,unsigned char address)
{
static bit change; //用于將RAM中以半字形式存儲的數據拆成在便于在EEPROM中存儲的字節形式
unsigned char writedata; //要寫入EEPROM中的數據變量
change = 0;
for(;number > 0; number--){ //向EEPROM中寫入數據循環
do{
if(change == 0){
writedata = (unsigned char)(*data & 0xFF); //得到低字節數據
change = 1;
}else{
writedata = (unsigned char)(*data >> 8); //得到高字節數據
change = 0;
}
I2C_Write_Byte(0xA0,address,writedata); //向EEPROM寫數據
++address; //數據在EEPROM中的存放地址加1
}while(change == 1);
++data; //指向下一個數據
}
return(1);
}
/****************************************************************************************
* 函數名稱: unsigned char MyRead(unsigned short *Data,unsigned char Number,
* unsigned char Address)
* 功能: 將EEPROM中的數據讀出到RAM中
* 入口參數: unsigned short *Data(指向讀出數據存放到RAM中的地址指針)
* unsigned char Number 要讀出的數據個數
* unsigned char Address 數據在EEPROM中的存放地址
* 出口參數: unsigned char(0: 讀出不成功,1:讀出成功)
* 全局變量:
* 調用模塊: unsigned char I2C_Read_Byte(unsigned char Device_Address,unsigned char Address)
* 從EEPROM中讀出一個字節數據的函數
* 設計者: 饒陽勝
* 日期: 05/3/5
* 說明: 每次從EEPROM中讀出的數據是一個字節,而讀出的數據在EEPROM中的存儲形式是半字形式,所以要進行轉換
****************************************************************************************/
unsigned char My_Read(bank1 short *data,unsigned char number,unsigned char address)
{
static bit change; //用于將讀出的數據合成一個半字形式
unsigned char readdata; //從EEPROM中的讀出的數據變量
change = 0;
for(;number > 0; number--){ //從EEPROM中讀出數據的循環
do{
readdata = I2C_Read_Byte(0xA0,address); //從EEPROM中讀取數據
++address; //EEPROM地址加1
if(change == 0){
*data = readdata; //存儲低字節
change = 1;
}else{
*data = (readdata << 8) | (*data & 0xff); //存儲高字節
change = 0;
}
}while(change == 1);
++data; //指向一個字節
}
return(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -