IIC.C
#include "iic.h"
extern void printf(const char* fmt, ...);
void delay_us(void)
{
unsigned int i = 2000;
while(i--);
}
void i2c_init(void)
{
RCC->MP_AHB4ENSETR |= (0x1 << 5);
GPIOF->MODER &= (~(0xF << 28));
GPIOF->MODER |= (0x5 << 28);
GPIOF->OTYPER &= (~(0x3 << 14));
GPIOF->OSPEEDR |= (0xF << 28);
GPIOF->PUPDR &= (~(0xF << 28));
I2C_SCL_H;
I2C_SDA_H;
}
void i2c_start(void)
{
SET_SDA_OUT;
I2C_SCL_H;
I2C_SDA_H;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_L;
}
void i2c_stop(void)
{
SET_SDA_OUT;
I2C_SCL_L;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_H;
delay_us();
I2C_SDA_H;
delay_us();
}
void i2c_write_byte(unsigned char dat)
{
unsigned int i;
SET_SDA_OUT;
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us();
if(dat & 0x80)
{
I2C_SDA_H;
}
else
{
I2C_SDA_L;
}
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
dat <<= 1;
}
}
unsigned char i2c_read_byte(unsigned char ack)
{
unsigned int i;
unsigned char dat; SET_SDA_IN;
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us();
delay_us();
I2C_SCL_H;
delay_us();
dat <<= 1;
if(I2C_SDA_READ)
{
dat |= 1;
}
else
{
dat |= 0;
}
delay_us();
}
if(!ack)
i2c_ack();
else
i2c_nack();
return dat;
}
unsigned char i2c_wait_ack(void)
{
I2C_SCL_L;
I2C_SDA_H;
delay_us();
SET_SDA_IN;
I2C_SCL_H;
delay_us();
if(I2C_SDA_READ)
return 1;
I2C_SCL_L;
return 0; /
}
void i2c_ack(void)
{
SET_SDA_OUT;
delay_us();
I2C_SDA_L;
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
I2C_SCL_L;
}
void i2c_nack(void)
{
SET_SDA_OUT; /
I2C_SCL_L;
delay_us();
I2C_SDA_H;
delay_us();
I2C_SCL_H;
delay_us();
delay_us();
I2C_SCL_L;
}