?? hi2c_c51.c
字號:
/*******************************************************************
* P89LPC932硬件I2C軟件包(主)
* 1 使用I2C總線軟件包時P1.2,P1.3切勿寫為0,并要設置為開漏輸出。
* 2 總線定義為P1.2=SCL,P1.3=SDA,需外接上拉電阻2-10k。
* 3 相應寄存器:
* 地址寄存器 I2ADR 用于存放自身從地址(從方式時才有用)
* 數據寄存器 I2DAT 接收/發送數據用
* 控制寄存器 I2CON 用于硬件I2C的設置、使能、啟動、結束,
* 應答控制,中斷標志等。
* 狀態寄存器 I2STAT 指示I2C總線的操作狀態碼,高5位有效,
* 若I2C中斷志置位,可查詢此寄存器判斷
* 總線情況。
* SCL占空比寄存器 I2SCLH、I2SCLL 設置SCL的頻率發生。
*
* 此軟件包是以查詢方式完成各種總線操作的,在使用前應對總線進行檢查,并
* 使用看門狗,以防等待總線而造成死機。
* 文件名:HI2C_C51.C
* 更新時間:2002.11.05
*******************************************************************/
#include <REG932.H>
#include "HI2C_C51.h"
#define uchar unsigned char
/* 置位 STO, 復位 STA 、 SI */
#define GENERATE_STOP 0x54
/* 復位 STO,STA,SI 并置位 AA (ack) */
#define RELEASE_BUS_ACK 0x44
/* 復位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_NOACK 0x40
/* 起動總線/重新起動總線, 置位 STA */
#define RELEASE_BUS_STA 0x64
/*******************************************************************
* 申請總線
* 功能:進行I2C總線的初始化--包括時鐘選擇,I2C使能,發送起始信號等等。
* I2EN為1,設置為主機;CRSEL位為0,使用內部SCL發生器。
*******************************************************************/
void GetBus()
{ I2SCLH = 50;//15;/* 設置SCL高電平的PCLK周期數 */
I2SCLL = 50;//15;/* 設置SCL低電平的PCLK周期數,6MHz時為100Kbit/S */
/* 申請成為主機,起動總線。使用內部SCL發生器,I2EN和AA置位。*/
I2CON = RELEASE_BUS_STA; //0x64
while( SI==0 );/* si=1起始位的發送成功 */
}
/*******************************************************************
* 發送數據函數
* 功能:用于向總線發送數據
* 入口參數:ACC 待發送的數據
*******************************************************************/
void SendByte(uchar c) //數據發送
{ I2DAT = c;
I2CON = RELEASE_BUS_ACK; /* 0x44 清除SI位等等 */
while( SI==0 ); /* 等待數據的發送*/
}
/*******************************************************************
* 向無子地址器件發送字節數據函數
* 功能:從啟動總線到發送地址,數據,結束總線的全過程。
* 入口參數:sla 從器件地址
* c 待發送的數據
* 出口參數:返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla, uchar c)//向無子地址器件發送字節數據函數
{ GetBus(); /* 啟動總線 */
SendByte(sla); /* 發送器件地址,并接收應答位 */
if( I2STAT!=0X18 ) /* 無從機應答則退出操作 */
{ I2CON = GENERATE_STOP;
return(0);
}
aaa1=5;
SendByte(c); /* 發送數據 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = GENERATE_STOP; /* 結束總線 */
aaa1=10;
return(1);
}
/*******************************************************************
* 向有子地址器件發送多字節數據函數
* 功能:從啟動總線到發送地址,子地址,數據,結束總線的全過程。
* 入口參數;sla 從器件地址
* subH 子地址H
* subL 子地址L
* s 發送內容的指針
* no 發送字節數
* 出口參數:返回1表示操作成功,否則操作有誤。
********************************************************************/
bit w_FM64(uchar sla, uchar suba, uchar subal,uchar *s, uchar no)//向有子地址器件發送多字節數據函數
{
uchar i;
GetBus(); /* 啟動總線 */
SendByte(sla); /* 發送器件地址 */
aaa1=15;
if( I2STAT!=0X18 )
{ I2CON = GENERATE_STOP;
return(0);
}
aaa1=21;
SendByte(suba); /* 發送器件子地址 -H */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
aaa1=26;
if(sla==0xa0||sla==0xa1)
{
SendByte(subal); /* 發送器件子地址 -L */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
aaa1=31;
}
for(i=0; i<no; i++)
{ SendByte(*s); /* 發送數據 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
s++;
//aaa1++;
}
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
/*******************************************************************
* 向無子地址器件讀字節數據函數
*功能:從啟動總線到發送地址,讀數據,結束總線的全過程。
*入口參數:sla 從器件地址
* c 讀出的數據(地址傳送)
* 出口參數:函數返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla, uchar *c)//向無子地址器件讀字節數據函數
{ GetBus(); /* 啟動總線 */
SendByte(sla+1); /* 發送器件地址 */
if( I2STAT!=0X40 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = RELEASE_BUS_NOACK; /* 接收一字節數據即發送非應答位 */
while( SI==0 ); /* 等待接收數據 */
if( I2STAT!=0X58 )
{ I2CON = GENERATE_STOP;
return(0);
}
*c = I2DAT; /* 讀取數據 */
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
/*******************************************************************
* 向有子地址器件讀取多字節數據函數
*功能:從啟動總線到發送地址,子地址,讀數據,結束總線的全過程。
*入口參數:sla 從器件地址
* suba 子地址
* s 讀出的內容存儲區的指針
* no 讀no個字節。
*出口參數:函數返回1表示操作成功,否則操作有誤。
********************************************************************/
bit R_FM64(uchar sla,uchar suba,uchar subal,uchar *s,uchar no)
{ uchar i;//向有子地址器件讀取多字節數據函數
GetBus(); /* 啟動總線 */
SendByte(sla); /* 發送器件地址 */
if( I2STAT!=0X18)
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 發送器件子地址-H */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
if(sla==0xa0||sla==0xa1)
{
SendByte(subal); /* 發送器件子地址-L */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
}
I2CON = RELEASE_BUS_STA; /* 重新啟動總線 */
while( SI==0 );
SendByte(sla+1);
if( I2STAT!=0X40 )
{ I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<no-1; i++)
{ I2CON = RELEASE_BUS_ACK; /* 接收一字節數據并發送應答位 */
while( SI==0 ); /* 等待接收數據 */
if( I2STAT!=0X50 )
{ I2CON = GENERATE_STOP;
return(0);
}
*s = I2DAT; /* 讀取數據 */
s++;
}
I2CON = RELEASE_BUS_NOACK; /* 接收最后一字節數據并發送非應答位 */
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; /* 結束總線 */
return(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -