I2C
简介
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.
I2C(内部集成电路)总线接口处理微控制器与串行 I2C 总线间的通信。它提供多主模式功
能,可以控制所有 I2C 总线特定的序列、协议、仲裁和时序。它支持标准模式 (Sm)、快速模
式 (Fm) 和超快速模式 (Fm+)。
- 从模式和主模式
- 多主模式功能
- 标准速度模式(高达 100 kHz)
- 快速模式(高达 400 kHz)
- 超快速模式(高达 1 MHz)
- 7 位和 10 位寻址模式
I2C start/stop
- 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
- 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
I2C read
- Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
- Slave发送ACK
- Master发送reg addr(8bit),等待ACK
- Slave发送ACK
- Master发起START
- Master发送I2C addr(7bit)和r操作1(1bit),等待ACK
- Slave发送ACK
- Slave发送data(8bit),即寄存器里的值
- Master发送ACK。或者Master发送NACK,要求结束。
- 第8步和第9步可以重复多次,即顺序读多个寄存器
I2C write
- Master发起START
- Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
- Slave发送ACK
- Master发送reg addr(8bit),等待ACK
- Slave发送ACK
- Master发送data(8bit),即要写入寄存器中的数据,等待ACK
- Slave发送ACK
- 第6步和第7步可以重复多次,即顺序写多个寄存器
- Master发起STOP
例子
I2C signal diagram: SDA(green) and SCL(yellow)
write 0x55 DAC
USB to I2C
通过USB虚拟串口实现PC与I2C设备进行通信。使用STM32L073xx MCU,硬件I2C和软件模拟I2C,用看门狗检测运行状态。
底层firmware实现代码和硬件电路图见链接:
- 此时I2C是做主机–>https://github.com/tclxspy/USB_I2C_73
- 另附上I2C做从机的代码–>https://github.com/tclxspy/QSFP28_PSM4
USB安装成功:
串口助手调试
部分代码main.c
#include "main.h"
#include "stm32l0xx_hal.h"
#include "usb_device.h"
#include "i2c.h"
#include "soft_i2c.h"
#include "stm32l0xx_nucleo.h"
#include "usbd_cdc_if.h"
#include "modsel.h"
/* Buffer use