#include <MSP430X14X.H>
#define IIC_PORT_DIR P5DIR //==SDA 接P5.1 ;SCL接 P5.0 ,INT接P2.5
#define IIC_PORT_IN P5IN
#define IIC_PORT_OUT P5OUT
#define SDA BIT1
#define SCL BIT0
#define SDA_1 (IIC_PORT_DIR &= ~SDA) //数据总线默认为1,设置SDA为输入口则SDA=1
#define SDA_0 (IIC_PORT_DIR |= SDA) //SDA输出寄存器始终为0,当设置SDA为输出口 SDA=0
#define SCL_1 (IIC_PORT_OUT |=SCL)
#define SCL_0 (IIC_PORT_OUT &=~SCL)
#define IIC_TIME 100
void delay(unsigned int time)
{
while(--time)WDTCTL=WDTPW+WDTCNTCL;
}
void iic_init(void)
{
IIC_PORT_DIR |= (SCL);
SDA_1;
IIC_PORT_OUT &= ~SDA;
}
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能:启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c(void)
{
SDA_1; delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
SDA_0; delay(IIC_TIME);
SCL_0; delay(IIC_TIME);
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c(void)
{
SDA_0; delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
SDA_1; delay(IIC_TIME);
SCL_0; delay(IIC_TIME);
}
/*******************************************************************
字节数据传送函数
函数原型: void SendByte(uchar c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(unsigned char ch)
{
unsigned char i = 8;
SCL_0; delay(IIC_TIME);
while(i--)
{
SDA_0;
if(ch & 0x80)SDA_1;
ch <<= 1;
delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
SCL_0; delay(IIC_TIME);
}
}
/*******************************************************************
字节数据接收函数
函数原型: uchar RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
********************************************************************/
unsigned char RcvByte(void)
{
unsigned char rdata = 0;
unsigned char i = 8;
SDA_1; // 改成输入模式
delay(IIC_TIME);
while(i--)
{
rdata <<= 1;
SCL_0; delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
if(IIC_PORT_IN &SDA) rdata |= 0x01; // 读入数据
}
delay(IIC_TIME);
return(rdata);
}
/********************************************************************
应答子函数
原型: void Ack_I2c(bit a);
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
void Ack_I2c(void)
{
unsigned int tmp;
SDA_1; delay(IIC_TIME);
delay(IIC_TIME);
SCL_0; delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
tmp = 100;
while(tmp)
{
tmp --;
if((IIC_PORT_IN &SDA) == 0){_NOP();break;} // 读入数据
};
SCL_0; delay(IIC_TIME);
delay(IIC_TIME);
}
void master_ack(void) //主应答函数
{
SDA_0; delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
SCL_0; delay(IIC_TIME);
}
void no_ack(void)
{
SDA_1; delay(IIC_TIME);
SCL_1; delay(IIC_TIME);
SCL_0; delay(IIC_TIME);
}
unsigned char TestAck(void)
{
unsigned char a;
SDA_1; //设为输入
a=IIC_PORT_IN &SDA;
return(a);
}