?? iic.c
字號:
#include "REG931.H"
#include "memory.h"
#include "system.h"
#include "key.h"
#include "vfd.h"
#include "display.h"
#include "uart.h"
#include "iic.h"
// these functions use for P89LPC931 MCU
/****************************************************************
* 設置總線函數(設置為從機)
* 功能用于設置I2C 控制寄存器包括總線時鐘選擇及從地址.不接受廣播地址
* 入口參數addr 從地址
****************************************************************/
void Init_iic(void){
#ifdef INCLUDE_I2C_CODE
I2ADR = IIC_SLAVE_ADDR & 0xfe; /* 設置從地址不接收廣播地址*/
I2CON = RELEASE_BUS_ACK; /* 啟動硬件I2C */
EI2C=1; // enable iic interrupt
#endif
}
/***************************************************************
* 發送數據
* 功能:向總線發送數據
* 入口參數:c 所要發送的數據
* 出口參數:當接收到非應答位時返回0,否則返回1
***************************************************************/
#if 0
bit SendByte(uchar c){
#ifdef INCLUDE_I2C_CODE
if( I2STAT==0xC0 ) /* 上次發送數據后,接收到非應答位 */
{
I2CON = RELEASE_BUS_ACK;
return(0);
}
I2DAT = c; /* 發送數據 */
I2CON = RELEASE_BUS_ACK; /* 釋放總線 */
while( SI==0 ); /* 等待字節數據發送完成 */
return(1);
#endif
}
#endif
/***************************************************************
* 接收字節函數
* 功能:讀取總線傳來的字節數據并發送應答位,正常接收返回1。
* 入口參數:c 此時讀入的數據變量的地址
* 出口參數:接收到總線結束信號或重新啟動總線信號時返回0
***************************************************************/
#if 0
bit RcvByte(uchar *c){
#ifdef INCLUDE_I2C_CODE
uchar uc;
I2CON = RELEASE_BUS_ACK; /* 清除標志位, clear SI */
while( SI == 0 ) ; /* 放開總線,等待接收 */
uc=I2STAT;
if( uc == 0xA0 ) /* 接收到停止位或重新啟動位 */
{
I2CON = RELEASE_BUS_ACK;/* 先放開總線,再返回0 */
return(0);
}
*c = I2DAT; /* 取數據 */
return(1);
#endif
}
#endif
/****************************************************************
* I2C 中斷服務函數
* 功能:用于監控總線上的信號,并對主機作出響應。
* 注: 要打開中斷允許,最好把I2C中斷優先級設置高一點。
* 接收到對本器件操作的尋址信號時,進入中斷
* I2C中斷入口地址為0033H,即interrupt 6
****************************************************************/
void I2c_Isr(void) interrupt 6 {
#ifdef INCLUDE_I2C_CODE
uchar indata;
uchar uc;
uc = I2STAT;
switch(uc) {
case RDSLA: /* 主機讀操作 */
#if 0
while(1){
if(TxIndex<TxLen)
if( SendByte(TxDBuff[TxIndex])==0 ) break;
else
break;
TxIndex++;
}
I2CON = 0x44; /* 開放總線 */
MCU_KEYINT_PIN=1;
break;
#else
TxIndex=0;
I2DAT = TxDBuff[TxIndex++];
I2CON= RELEASE_BUS_ACK;
bIicBusy=1; //iic bus busy for rcv data
break;
case RDSLA_DATA:
if(TxIndex<TxLen){
I2DAT=TxDBuff[TxIndex];
TxIndex++;
}
I2CON = RELEASE_BUS_ACK; /* 清除標志位, clear SI */
MCU_KEYINT_PIN=1;
break;
case RDSLA_DATA_NOACK:
case RDSLA_STOP:
I2CON = RELEASE_BUS_ACK;/* 先放開總線,再返回0 */
bIicBusy=0; // iic bus idle
MCU_KEYINT_PIN=1;
// TxLen=TxIndex=0;
break;
#endif
///////////////////////////////////////////////////////
case WRSLA: /* 主機寫操作 */
#if 0
if(!bRxDProcessEnd){
I2CON=RELEASE_BUS_NOACK;
bRxDProcessEnd=0;
break;
}
while(1) {
if( RcvByte(&indata)==0 ) break; /* 若接收到總線結束則退出 */
RxDBuff[RxIndex] = indata;
RxIndex++;
}
I2CON = 0x44; /* 開放總線 */
RxLen=RxDBuff[1]+3;
bRxDProcessEnd=0;
break;
#else
if(bRxDProcessEnd /* && !bIicBusy*/ ){
I2CON= RELEASE_BUS_ACK;
bIicBusy=1; //iic bus busy for rcv data
RxIndex=0;
}
else{
I2CON= RELEASE_BUS_ACK;
// bIicBusy=1;
}
break;
case WRSLA_DATA: /* 主機寫 data */
if(bIicBusy){
indata= I2DAT; /* 取數據 */
if(RxIndex<RXD_BUF_SIZE)
RxDBuff[RxIndex]= indata;
else{
I2CON = RELEASE_BUS_NOACK; /* 清除標志位, clear SI */
break;
}
RxIndex++;
}
I2CON = RELEASE_BUS_ACK; /* 清除標志位, clear SI */
break;
// case WRSLA_DATA_NOACK:
case WRSLA_STOP: /* 接收到停止位或重新啟動位 */
I2CON = RELEASE_BUS_ACK;/* 先放開總線,再返回0 */
RxLen= RxDBuff[1]+3;
bRxDProcessEnd=0;
bIicBusy=0; // iic bus idle
I2C_Uart_InforProcess( );
break;
#endif
default:
I2CON = RELEASE_BUS_ACK; /* 清除標志位, clear SI */
break;
}
#endif
}
void StartI2CData(uchar len){
#ifdef INCLUDE_I2C_CODE
TxLen=len;
TxIndex=0;
MCU_KEYINT_PIN=0;
#else
len=len;
#endif
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -