一、 iic.h
二、iIC.C
void Periph_i2c_int(void)
{
rcu_periph_clock_enable(RCU_GPIOD);
gpio_init(GPIOD, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, 0xffff);
GPIO_BOP(GPIOD) = I2C_SCL_PIN;
delay_us(10);
GPIO_BOP(GPIOD)= I2C_SDA_PIN;
delay_us(10);
}
/***************************************************/
// iic λ¶Áº¯Êý
/***************************************************/
uint8_t SDA_READ_ALL(void)
{
uint8 con=0;
uint16 con_pin=0;
con_pin = GPIO_ISTAT(GPIOD); //¶ÁÈ¡GPIOD¸÷Òý½Å״ֵ̬
con = (uint8)(con_pin>>8); //¶ÁÈ¡SDA¸÷Òý½Å״ֵ̬ ͨµÀ˳ÐòÓë¸Ã×ֽڸߵÍλÏà·´
x=con;
return con;
}
/**************************************************************
*ËùÓÐIIC¿ªÊ¼ÐźÅ
***************************************************************/
void IIC_Start_ALL()//START:when CLK is high,DATA change form high to low
{
GPIO_BOP(GPIOD)= I2C_ALL_PIN;
delay_us(10);
GPIO_BC(GPIOD) = I2C_SDA_PIN;
delay_us(10);
GPIO_BC(GPIOD) = I2C_SCL_PIN;
}
/**************************************************************
*ËùÓÐIICÍ£Ö¹ÐźÅ
***************************************************************/
void IIC_Stop_ALL()
{
GPIO_BOP(GPIOD)= I2C_ALL_PIN;
delay_us(10);
GPIO_BC(GPIOD)= I2C_SCL_PIN;
delay_us(10);
GPIO_BC(GPIOD)= I2C_SDA_PIN;
delay_us(10);
}
/**************************************************************
*ËùÓÐIIC·¢ËÍÒ»¸ö×Ö½Ú
***************************************************************/
uint8_t IIC_Send_Byte_ALL( uint8_t txd )
{
uint8_t t,bAck=0;
for(t=0;t<8;t++)
{
GPIO_BC(GPIOD)= I2C_SCL_PIN;
if(txd&0x80)
GPIO_BOP(GPIOD)= I2C_SDA_PIN; //SDA_H
else
GPIO_BC(GPIOD)= I2C_SDA_PIN; //SDA_L
delay_us(nop_iic);
GPIO_BOP(GPIOD)= I2C_SCL_PIN;
delay_us(nop_iic);
txd<<=1;
}
GPIO_BC(GPIOD)= I2C_SCL_PIN; //SCL_L
delay_us(nop_iic);
GPIO_BOP(GPIOD)= I2C_SCL_PIN; //SCL_H
delay_us(nop_iic);
// bAck=SDA_READ_ALL();
GPIO_BC(GPIOD)= I2C_SCL_PIN; //SCL_L
GPIO_BOP(GPIOD)= I2C_SDA_PIN; //SDA_H
delay_us(nop_iic);
return ((uint8_t)bAck);
}
/**************************************************************
*ËùÓÐIIC¶ÁÈ¡Ò»¸ö×Ö½Ú
***************************************************************/
void IIC_Read_Byte_ALL(uint8_t bLSByte)
{
uint8 i,j,a,b;
uint8 READ_AD[8]={0,0,0,0,0,0,0,0},Con[8]={0,0,0,0,0,0,0,0};
a=0x01;
b=0x80;
for(i=0;i<8;i++)
{
GPIO_BC(GPIOD)= I2C_SCL_PIN; //SCL_L
delay_us(nop_iic);
GPIO_BOP(GPIOD)= I2C_SCL_PIN; //SCL_H
delay_us(nop_iic);
Con[i]=SDA_READ_ALL();
}
GPIO_BC(GPIOD)= I2C_SCL_PIN; //SCL_L
delay_us(nop_iic);
if(!bLSByte)
{
for(i=8;i>0;i--) // ͨµÀÂÖѯ
{
a=0x80;
a>>=i-1;
for(j=8;j>0;j--) // ×Ö½Ú Î» µÄ ÕûºÏ
{
b=0x80;
b>>=j-1;
if(Con[j-1]&a)
READ_AD[i-1]|=b;
else
READ_AD[i-1]&=~b;
}
ResultL[i-1] = READ_AD[i-1];
}
GPIO_BOP(GPIOD)= I2C_SDA_PIN; //SDA_H
}
else
{
for(i=8;i>0;i--) // ͨµÀÂÖѯ
{
a=0x80;
a>>=i-1;
for(j=8;j>0;j--) // ×Ö½Ú Î» µÄ ÕûºÏ
{
b=0x80;
b>>=j-1;
if(Con[j-1]&a)
READ_AD[i-1]|=b;
else
READ_AD[i-1]&=~b;
}
ResultH[i-1] = READ_AD[i-1];
}
GPIO_BC(GPIOD)= I2C_SDA_PIN; //SDA_L
}
delay_us(nop_iic);
GPIO_BOP(GPIOD)= I2C_SCL_PIN; //SCL_H
delay_us(nop_iic);
GPIO_BC(GPIOD) = I2C_SCL_PIN; //SCL_L
delay_us(nop_iic);
GPIO_BOP(GPIOD)= I2C_SDA_PIN; //SDA_H ÊÍ·ÅSDA×ÜÏß ¸¡¿ÕģʽʱÐèÒªÔö¼Ó¸Ã¾ä
}