学习目标:
熟练掌握iic协议,知道时序,原理,作用,特点等。
IIC时序图:
①起始信号:初始状态SCL,SDA均为高电平,当SDA拉低。
②终止信号:数据传输结束后,SCL拉高,此时当SDA拉高。
③应答信号:主机每发送1B,就在第9个时钟脉冲期间释放数据线,由从机返回应答。 返回信号低电平表示应答,为高电平表示无应答。
观察上图标号③就可以发现,有效应答的要求是从机在第 9 个时钟脉冲之前的低电平期间
将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机(读操作),则在它收到最后一个字节后,发送一个 NACK 信号,以通知(从机)发送器结束数据发送,并释放SDA 线,以便主机接收器发送一个停止信号。
⑤数据传输:
I2C.c文件下的代码:
iic初始化
void iic_init(void)
{
GPIO_InitTypeDef iic_gpio;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
iic_gpio.GPIO_Mode = GPIO_Mode_Out_PP;//推挽
iic_gpio.GPIO_Pin = GPIO_Pin_12;//SCL
iic_gpio.GPIO_Speed = GPIO_Speed_50MHz; /* 高速 */
GPIO_Init(GPIOC,&iic_gpio);
iic_gpio.GPIO_Mode = GPIO_Mode_Out_OD;//推挽
iic_gpio.GPIO_Pin = GPIO_Pin_11;//SCL
iic_gpio.GPIO_Speed = GPIO_Speed_50MHz; /* 高速 */
GPIO_Init(GPIOC,&iic_gpio);
iic_stop();
}
开始和停止函数
起始信号:初始状态SCL,SDA均为高电平,当SDA拉低时,表示起始信号。
void iic_start(void)
{
IIC_SDA(1);
IIC_SCL(1);
delay_us(2);
IIC_SDA(0);//高到低起始信号
delay_us(2);
IIC_SCL(0);
delay_us(2);
}
终止信号:数据传输结束后,SDA为低,SCL拉高,当SDA拉高,表示终止信号。
void iic_stop(void)
{
IIC_SDA(0);//
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SDA(1);//低到高结束信号
delay_us(2);
}
写时序和读时序
在SCL低电平时,是数据被从机取走的时刻;在SCL高电平时,是数据写入的时刻。
oid iic_write(uint8_t data)
{
uint8_t i;
for(i = 0; i < 8;i++)
{
if(data&0x80)
{
IIC_SDA(1);
}
else
{
IIC_SDA(0);
}
data <<= 1;
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
}
IIC_SDA(1);
}
/*1要应答 0不应答*/
uint8_t iic_read(unsigned char ack)
{
uint8_t i, rxdata = <