【笔记】 IIC总线理解

来源:本站
导读:目前正在解读《【笔记】 IIC总线理解》的相关信息,《【笔记】 IIC总线理解》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《【笔记】 IIC总线理解》的详细说明。
简介:IIC总线传输格式的理解 。

IIC总线传输格式的理解

【笔记】 IIC总线理解

在写中

首先,主机发送开始命令,然后主机发送7位地址数据和1位R/W到从机中,然后从机到主机发送一个响应信号,主机收到响应信号的时候,主机向从机发送数据,当数据发送完毕,从机向主机发送响应信号,然后主机发送结束信号,特别注意:如果一段时间内没有接收到从机的应答信号,则表示,从机已正确接收数据,所以,在写操作的响应信号和读操作的第一个响应信号,不需要写应答信号的函数

在读中

首先,主机发送开始命令,然后主机发送7位地址数据和1位R/W到从机中,然后从机到主机发送一个响应信号,主机收到响应信号的时候,开始接收从机发送的1字节数据,发送完毕,等待主机到从机的应答信号,现在需要写应答函数了在程序中,然后结束信号。

下面根据时序图,写出时序,基于STM32的:

//引脚初始化

void IIC_Init(void)

{

RCC->APB2ENR|=1<<3;

GPIOB->CRH&=0XFFFF00FF;

GPIOB->CRH|=0X00003300;

GPIOB->ODR|=3<<10;

}

//起始函数

void IIC_Start(void)

{

SDA_OUT(); //将引脚设置为输入模式

IIC_SDA=1;

IIC_SCL=1;

delay_us(4);

IIC_SDA=0;

delay_us(4);

IIC_SCL=0; //拉低,时刻等待数据的到来

}

//结束函数

void IIC_Stop(void)

{

SDA_OUT();

IIC_SCL=0;

IIC_SDA=0;

delay_us(4);

IIC_SCL=1;

IIC_SDA=1;

delay_us(4);

}

//等待应答,根据应答0/1之前的时序图所得

u8 IIC_Wait_Ack(void)

{

u8 ucErrTime=0;

SDA_IN(); //设置为输入模式

IIC_SDA=1;delay_us(1);

IIC_SCL=1;delay_us(1);

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;

return 0;

}

//应答

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

// 不产生应答

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

// 发送一个字节

void IIC_Send_Byte(u8 txd)

{

u8 t;

SDA_OUT();

IIC_SCL=0;//

for(t=0;t<8;t++)

{

IIC_SDA=(txd&0x80)>>7;

txd<<=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

delay_us(2);

}

}

//接收1bit的数据

u8 IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SDA_IN();

for(i=0;i<8;i++ )

{

IIC_SCL=0;

delay_us(2);

IIC_SCL=1;

receive<<=1;

if(READ_SDA)receive++;

delay_us(1);

}

if (!ack)

IIC_NAck();

else

IIC_Ack();

return receive;

}

提醒:《【笔记】 IIC总线理解》最后刷新时间 2024-03-14 00:54:37,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《【笔记】 IIC总线理解》该内容的真实性请自行鉴别。