网站默认样式,企业文化展厅设计方案,wordpress更新记录,wordpress获取登录这头像IIC总线协议介绍
IIC#xff1a;Inter Integrated Circuit#xff0c;集成电路总线#xff0c;是一种同步、串行、半双工通信总线。
同步#xff1a;需要时钟线 串行#xff1a;数据一位一位地发送 半双工#xff1a;同一时间只能接受或发送#xff0c;不能同时发送或…IIC总线协议介绍
IICInter Integrated Circuit集成电路总线是一种同步、串行、半双工通信总线。
同步需要时钟线 串行数据一位一位地发送 半双工同一时间只能接受或发送不能同时发送或接收
总线就是传输数据的通道 协议就是传输数据的规则
IIC总线结构图 SDA数据线——空闲处于高电平接上拉电阻 SCL时钟线——空闲处于高电平接上拉电阻
总线支持多设备连接允许多主机存在每个设备都有一个唯一的地址
连接到总线上的数目受总线的最大电容400pf限制
数据传输速率标准模式100k bit/s 快速模式400k bit/s 高速模式3.4M bit/s
IIC协议
三个信号起始信号、停止信号、应答信号 两个注意数据有效性、数据传输顺序 一个状态空闲状态 起始信号SCL高电平时SDA从高电平变为低电平 停止信号SCL为高电平时SDA从低电平变为高电平 应答信号上拉电阻影响下SDA默认为高而从机拉低SDA就是确认收到数据即ACK否则NACK。
数据先发送高位MSB以字节传输数据在SCL高电平稳定
发送完后注意释放SDA从机应答
空闲状态两根线都是高电平
void iic_start(void)
{IIC_SDA(1);IIC_SCL(1);iic_delay();IIC_SDA(0);iic_delay();//钳住总线准备发送or接收数据IIC_SCL(0);iic_delay();
}void iic_stop(void)
{IIC_SDA(0);iic_delay();IIC_SCL(1);iic_delay();IIC_SDA(1);//发送总线停止信号iic_delay();
}检测应答信号
uint8_t iic_wait_ack(void)
{IIC_SDA(1);iic_delay();IIC_SCL(1);iic_delay();if(IIC_READ_SDA)//SDA为高电平NACK{iic_stop();return 1;}IIC_SCL(0);//SCL拉低结束ACK检查iic_delay();return 0;
}void iic_ack(void)
{IIC_SCL(0);iic_delay();IIC_SDA(0);iic_delay();IIC_SCL(1);iic_delay();
}void iic_nack(void)
{IIC_SCL(0);iic_delay();IIC_SDA(1);iic_delay();IIC_SCL(1);iic_delay();
}发送一字节数据
void iic_send_byte(uint8_t data)
{for(uint8_t i0; i8; i){IIC_SDA((data 0x80) 7);iic_delay();IIC_SCL(1);iic_delay();IIC_SCL(0);data 1;}IIC_SDA(1); //发送完成主机释放SDA线
}//1ack0nack
uint8_t iic_read_byte(uint8_t ack)
{uint8_t receive;for(uint8_t i; i8; i){receive 1;IIC_SCL(1);iic_delay();if(IIC_READ_SDA)receive;IIC_SCL(0);iic_delay();}if(!ack)iic_nack();elseiic_ack();return receive;
}AT24C02
EEPROM是一种掉电后数据不丢失的存储器常用来存储一些配置信息在系统重新上电时就可以加载。
与之相比的是后备域需要额外电源供电才能防止丢失。
AT24C02是一个2K bit的EEPROM存储器使用IIC通信方式。 A0/1/2设备地址决定引脚 WP写保护引脚如果接高电平就只能读取不能写入 SCL、SDA接上拉电阻 24C02由32页组成每页8Byte
AT24C02通讯地址 不可编程部分1010可编程部分由硬件管脚A0/A1/A2决定数据传输方向读数据‘1’还是写数据‘0’
写操作地址0xA0读操作地址0xA1 支持的写操作页写、字节写
AT24C02读写时序
写操作支持字节写模式和页写模式
字节写模式就是一个地址一个数据进行写入。 页写模式就是连续写入数据。只需要写一个地址连续写入数据时地址会自增。但存在页的限制。超出一页时超出数据覆盖原先写入的数据。但读会自动翻页。
读模式支持当前地址读模式、随机地址读模式和顺序读模式
当前读模式是基于上一次读/写操作的最后位置继续读出数据。 随机地址读模式是指定地址读出数据。 顺序读模式是连续读出数据。
硬件和软件IICC对比
硬件IIC比较复杂速度快较稳定需使用特定管脚软件IIC操作过程比较清晰速度较慢稳定任意管脚比较灵活
IIC配置步骤
使能SCL和SDA对应时钟__HAL_RCC_GPIOB_CLK_ENABLE()设置GPIO工作模式SDA开漏/SCL推挽输出模式使用HAL_GPIO_Init初始化编写基本信号起始信号、停止信号、应答信号主机send_ack、sen_nack、wait ack编写读和写函数iic_read_byte、iic_send_byte发送完成主机释放SDA
为什么IIC总线SDA建议用开漏模式
IIC的SDA引脚既要做为输出又要作为输入用开漏输出模式很好地实现输出输入共用避免IO模式频繁切换带来的麻烦。
输出时主机MCU输出0可以拉低信号来实现低电平发送主机输出1实际不起作用由外部上拉电阻上拉实现高电平发送。
输入时主机MCU设置输出1状态此时由于MCU无法输出1相当于释放MCU此时外部器件可以主动拉低SDA引脚/释放SDA引脚实现SDA脚的高低电平变化。
由于开漏输出模式下MCU还是可以读取IDR状态寄存器来获取引脚高低电平即可获得SDA脚的高低电平状态从而实现输入检测。