?? i2ceeprom.c
字號:
#include"Reg935.h"
#include"UserDef.h"
/*******************************************************************
* 申請總線
* 功能: 進行I2C總線的初始化----包括時鐘選擇,
I2C使能,發送起始信號等等。
* I2EN為1,設置為主機;
CRSEL位為0,使用內部SCL發生器
*******************************************************************/
void GetBus()
{
I2SCLH = 15; // 設置SCL高電平的PCLK周期數
I2SCLL = 15; //設置SCL低電平的PCLK周期數,6MHz 時為100Kbit/S
//申請成為主機,起動總線。使用內部SCL發生器,I2EN 和AA 置位
I2CON = RELEASE_BUS_STA; //I2CON = 0110 0100B = 0x64
while( SI==0 ); // 等待起始位的發送
}
/*******************************************************************
* 發送數據函數
* 功能:用于向總線發送數據
* 入口參數:C 待發送的數據
*******************************************************************/
void SendByte(uchar c)
{
I2DAT = c;
I2CON = RELEASE_BUS_ACK; //I2CON = 0100 0100B = 0x44 ,清除SI位等等
while( SI==0 ); // 等待數據的發送
}
/*******************************************************************
* 向有子地址器件發送多字節數據函數
* 功能:從啟動總線到發送地址,子地址,數據,結束總線的全過程。
* 入口參數: slvAddr-- 從器件地址
* subAddr-- 子地址(從器件裝載數據的地址)
* s -- 發送內容的指針
* num-- 發送字節數
* 出口參數: 返回1 表示操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
{
uchar i;
uchar subAddrH, subAddrL;
subAddrL = (subAddr & 0x00FF);
subAddrH = (subAddr & 0xFF00)>>8;
GetBus(); //啟動總線
SendByte(slvAddr & WRITE_DATA_COM); //發送器件地址,WRITE_DATA_COM = 0 寫控制
if( I2STAT!=0x18 ) //已發送器件地址和寫信號,并已接收應答信號
{
I2CON = GENERATE_STOP;
return(0);
}
SendByte(subAddrH); //發送器件子地址高位
if( I2STAT!=0x28 ) //已發送數據,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
SendByte(subAddrL); //發送器件子地址低位
if( I2STAT!=0x28 ) //已發送數據,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
for(i=0; i<num; i++)
{
SendByte(*s); //發送數據
if(I2STAT!=0x28) //已發送數據,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
s++;
}
I2CON = GENERATE_STOP; // 結束總線
return(1);
}
/*******************************************************************
* 向有子地址器件讀取多字節數據函數
*功能:從啟動總線到發送地址,子地址,讀數據,結束總線的全過程。
*入口參數:slvAddr--從器件地址
* subAddr--子地址(從器件裝載數據的地址)
* s -- 讀出的內容存儲區的指針
* num-- 讀num個字節。
*出口參數:函數返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
{
uchar i;
uchar subAddrH, subAddrL;
subAddrL = (subAddr & 0x00FF);
subAddrH = (subAddr & 0xFF00)>>8;
GetBus(); //啟動總線
SendByte(slvAddr & WRITE_DATA_COM); //發送器件地址
if( I2STAT!=0X18) //已發送器件地址和寫信號,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
SendByte(subAddrH); //發送器件子地址高位
if( I2STAT!=0X28 ) //已發送數據,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
SendByte(subAddrL); //發送器件子地址低位
if( I2STAT!=0X28 ) //已發送數據,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
I2CON = RELEASE_BUS_STA; //I2CON = 0110 0100B = 0x64 ,重新啟動總線
while( SI==0 );
SendByte(slvAddr | READ_DATA_COM); //發送讀數據信號
if( I2STAT!=0X40 ) //已發送器件地址和讀信號,并已接收應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
for(i=0; i<num-1; i++)
{
I2CON = RELEASE_BUS_ACK; //I2CON = 0100 0100B = 0x44 ,接收一字節數據并發送應答位
while( SI==0 ); //等待接收數據
if( I2STAT!=0X50 ) //已接收數據字節,已返回應答信號
{
I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,產生停止信號
return(0);
}
*s = I2DAT; //讀取數據
}
s++;
I2CON = RELEASE_BUS_NOACK; //I2CON = 0100 0000B = 0x40 ,接收最后一字節數據并發送非應答位
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; //結束總線
return(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -