|
#define DAT_I2C_DDR PC.DDR.B4
#define DAT_I2C_CR1 PC.CR1.B4
#define DAT_I2C_CR2 PC.CR2.B4
#define DAT_I2C_ODR PC.ODR.B4
#define DAT_I2C_IDR PC.IDR.B4
#define SCL_I2C_DDR PC.DDR.B5
#define SCL_I2C_CR1 PC.CR1.B5
#define SCL_I2C_CR2 PC.CR2.B5
#define SCL_I2C_ODR PC.ODR.B5
#define SCL_I2C_IDR PC.IDR.B5
unsigned char dat1154[3]= {0,0,5};
/******************************************************************************
函数:i2c_delay()
功能:
说明:
******************************************************************************/
#define i2c_nop nop()
void i2c_delay( void )
{
nop();
nop();
nop();
}
/******************************************************************************
函数:I2C_init()
功能:I2C总线初始化,释放总路线;使总线处于空闲状态 (总线为输入)
说明:在main()函数的开始处,应当执行一次本函数
******************************************************************************/
void I2C_init(void)
{
SCL_I2C_DDR=1;
SCL_I2C_CR1=0;
SCL_I2C_CR2=0;
SCL_I2C_ODR=1;
DAT_I2C_DDR=1;
DAT_I2C_CR1=0;
DAT_I2C_CR2=0;
DAT_I2C_ODR=1;
}
/******************************************************************************
函数:i2c_start()
功能:起动IIC
说明:执行前后都是输出模式
******************************************************************************/
void I2C_Start(void)
{
SCL_I2C_ODR=1;
SCL_I2C_DDR=1;
i2c_nop;
DAT_I2C_ODR=1;
DAT_I2C_DDR=1;
i2c_delay();
DAT_I2C_ODR=0;
i2c_delay();
SCL_I2C_ODR=0;
i2c_delay();
}
/******************************************************************************
函数:i2c_start()
功能:起动IIC
说明:执行前后都是输出模式
******************************************************************************/
void I2C_Stop(void)
{
SCL_I2C_ODR=0;
i2c_nop;
DAT_I2C_ODR=0;
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
DAT_I2C_ODR=1;
i2c_delay();
}
/******************************************************************************
函数:I2C_Write()
功能:向I2C总线写1个字节的数据
参数:dat是要写到总线上的数据
******************************************************************************/
unsigned char I2C_Write(unsigned char dat)
{
unsigned char n=8;
while(n)
{
i2c_delay();
if(dat&0x01)DAT_I2C_ODR=1;
else DAT_I2C_ODR=0;
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
i2c_delay();
dat=dat>>1;n--;
SCL_I2C_ODR=0;
}
i2c_delay();
DAT_I2C_DDR=0;
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
n=DAT_I2C_IDR; //NACK or ACK;
i2c_delay();
SCL_I2C_ODR=0;
i2c_delay();
DAT_I2C_DDR=1;
i2c_delay();
return n;
}
//******************************************************************
//.................先发高位................................
unsigned char I2C_WriteMSB(unsigned char dat)
{
unsigned char n=8;
while(n)
{
i2c_delay();
if(dat&0x80)DAT_I2C_ODR=1;
else DAT_I2C_ODR=0;
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
i2c_delay();
dat=dat<<1;n--;
SCL_I2C_ODR=0;
}
i2c_delay();
DAT_I2C_DDR=0;
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
n=DAT_I2C_IDR; //NACK or ACK;
i2c_delay();
SCL_I2C_ODR=0;
i2c_delay();
DAT_I2C_DDR=1;
i2c_delay();
return n;
}
/******************************************************************************
函数:I2C_Read()
功能:从从机读取1个字节的数据
返回:读取的1个字节数据
******************************************************************************/
unsigned char I2C_Read(unsigned char ack)
{
unsigned char dat=0;
unsigned char t = 8;
DAT_I2C_DDR=0;
while(t--)
{
dat <<= 1;
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
if (DAT_I2C_IDR)dat+=0x01;
i2c_delay();
SCL_I2C_ODR=0;
i2c_delay();
}
DAT_I2C_DDR=1;
DAT_I2C_ODR=ack; //NACK or ACK
i2c_delay();
SCL_I2C_ODR=1;
i2c_delay();
i2c_delay();
SCL_I2C_ODR=0;
i2c_delay();
return dat;
} |
|