STM32-i^2C

发布于 2024-12-19  35 次阅读


i^2C

EEPROM i^2C

  • 存关键参数
  • pid控制参数

FLASH:spi接口 10mb/s

  • 容量比较大
  • 用作数据代码存储
  • 先擦后写(擦->FFFFF)

  ‍

I2C

  串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步

通信过程

  1. 主机发送起始信号启用总线
  2. 主机发送一个字节数据指明从机地址和后续字节的传送方向
  3. 被寻址的从机发送应答信号回应主机
  4. 发送器发送一个字节数据
  5. 接收器发送应答信号回应发送器
  6. ........ (循环步骤4、5)
  7. 通信完成后主机发送停止信号释放总线

  第4步和第5步用的是发送器和接收器,不是主机和从机,这是由第一个字节的最后一位决定主给从发,还是从给主发。

  也就是说,第一个字节和最后的停止信号一定是主机发给从机,但中间就不一定了。

image-20241121181856-lc999fm

  ‍

  起始信号 高到低跳变

  ‍

  ‍

  ‍

  ‍

  这次实验用GPIO模拟时序

  AT 24C02

image-20241121182405-zj731q9

image-20241121182549-dajy4dt

  地址:0xA1 0xA0

image-20241121182640-qgbueo4

  ‍

  ‍

  用GPIO模拟I2C时序

  ‍

  ‍

  ‍

  myiic.c 文件存放 iic 驱动代码,24cxx.c 文件存放 24C02 驱动代码

  ‍

  iic

//²úÉúIICÆðʼÐźÅ
void IIC_Start(void)
{
	SDA_OUT();     //sdaÏßÊä³ö
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý 
}	  
//²úÉúIICÍ£Ö¹ÐźÅ
void IIC_Stop(void)
{
	SDA_OUT();//sdaÏßÊä³ö
	IIC_SCL=0;
	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL=1; 
	IIC_SDA=1;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
	delay_us(4);							   
}

  if(READ_SDA)receive++;//根据总线高低,来读

image-20241121184341-2upqtyy


人生到处知何似,应似飞鸿踏雪泥。