?? i2c.c
字號:
#include <intrins.h>
#include "i2c.h"
//typedef unsigned char byte;
//bit WRITEBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte DATABYTE);
//bit READBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE);
//bit WRITEDATAARRAY(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE);
//bit READDATAARRAY(byte N,byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE);
//sbit SDA=0X90; //P1.0
//sbit SCL=0X92; //P1.2
//#define DELAY1US() _nop_();_nop_();_nop_();_nop_();_nop_()
//#define DELAY2US() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
//#define DELAY5US() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
//void START_BIT(void);
//void STOP_BIT(void);
//bit SEND_BYTE(unsigned char BYTEVALUE);
//unsigned char RECEIVE_BYTE(void);
//void ACK(bit IFACK);
/* 發(fā)送一個起始位 */
void START_BIT(void)
{
SDA=1;
DELAY1US();
SCL=1;
DELAY5US();
SDA=0;
DELAY5US();
SCL=0;
DELAY1US();
}
/*發(fā)送一個停止位*/
void STOP_BIT(void)
{
SDA=0;
DELAY1US();
SCL=1;
DELAY5US();
SDA=1;
DELAY5US();
DELAY1US();
}
/* 發(fā)送一個字節(jié),如果收到應(yīng)答,返回1 */
bit SEND_BYTE(byte BYTEVALUE)
{
byte BITMASK=0X80;
byte i;
bit ACK_BIT;
for(i=0;i<8;i++)
{
SDA=(BYTEVALUE&BITMASK)?1:0;
DELAY1US();
SCL=1;
DELAY5US();
SCL=0;
BITMASK=BITMASK>>1;
}
DELAY2US();
SDA=1;
DELAY2US();
SCL=1;
DELAY2US();
ACK_BIT=SDA?0:1;
SCL=0;
return(ACK_BIT);
}
/*接收一個字節(jié)*/
byte RECEIVE_BYTE(void)
{
byte BITMASK=0X80;
byte i;
byte RETURNVALUE=0;
for(i=0;i<8;i++)
{
SDA=1;
SCL=0;
DELAY5US();
SCL=1;
DELAY2US();
if(SDA) RETURNVALUE|=BITMASK;
BITMASK=BITMASK>>1;
}
SCL=0;
return(RETURNVALUE);
}
/*發(fā)出應(yīng)答信號*/
void ACK(bit IFACK)
{
SDA=IFACK?1:0;
DELAY2US();
SCL=1;
DELAY5US();
SCL=0;
DELAY2US();
}
/*寫一個字節(jié),如果成功,返回0;*/
bit WRITEBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte DATABYTE)
{
START_BIT();
if(!SEND_BYTE(CON_ADDR)) return(1);
if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
if(!SEND_BYTE(DATABYTE)) return(1);
STOP_BIT();
return(0);
}
/*讀一個字節(jié),如果成功,返回0;*/
/* bit READBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE)
{
START_BIT();
if(!SEND_BYTE(CON_ADDR)) return(1);
if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
START_BIT();
if(!SEND_BYTE(CON_ADDR|0X01)) return(1);
*DATABYTE=RECEIVE_BYTE();
ACK(0);
STOP_BIT();
return(0);
}*/
bit WRITEDATAARRAY(byte N,byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE)
{
char i;
START_BIT();
if(!SEND_BYTE(CON_ADDR)) return(1);
if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
for(i=0;i<N;i++)
{
if(!SEND_BYTE(*DATABYTE)) return(1);
DATABYTE++;
}
STOP_BIT();
return(0);
}
bit READDATAARRAY(byte N,byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE)
{
char I;
START_BIT();
if(!SEND_BYTE(CON_ADDR)) return(1);
if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
START_BIT();
if(!SEND_BYTE(CON_ADDR|0X01)) return(1);
for(I=0;I<N;I++)
{
*DATABYTE=RECEIVE_BYTE();
if(I==N-1)
{
ACK(1);
}
else ACK(0);
DATABYTE++;
}
STOP_BIT();
return(0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -