飞道的博客

物联网ARM开发-1协议I2C

428人阅读  评论(0)

前言: I2C主要在服务应用在管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

目录

一、I2C总线通信原理

1、I2C总线简介

2、I2C总线物理·拓扑结构

3、I2C协议规定的开始信号、结束信号和应答信号

4、数据传输

5、STM32F4-I2C控制器特性

6、框图

二、EEPROM(24CXX)存储芯片介绍

1、EEPRROM简介

2、本芯片AT24C02芯片简介

(1)设备地址

(2) 硬件和原理图

(3)读写时序(根据AT24C02芯片手册内容)

三、2IC读写EEPROM实例HAL库版本

1、实验要求:实现主机与EEPROM(24C02)双向通信。

2、硬件原理图分析

3、cubmx配置

4、编程思路

5、实验效果

四、2IC读写EEPROM实例软件模拟设计


一、I2C总线通信原理

1、I2C总线简介

I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。

I2C总线特征
  • 两条总线线路:一条串行数据SDA,一条串行时钟线SCL来完成数据的传输及外围器件的扩展
  • I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址
  • I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
  • I2C总线上的主设备与从设备之间以字节(8位)为单位进行单双工的数据传输

 

2、I2C总线物理·拓扑结构


I2C 总线在物理连接上分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

3、I2C协议规定的开始信号、结束信号和应答信号

总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

  • 开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
  • 结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
  • 应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

4、数据传输

数据传输以 字节为单位 , 主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位, 数据在时钟的高电平被采样,一个字节按数据位 从高位到低位的顺序进行传输。
主设备在传输有效数据之前 要 先指定从设备的地址,一般为7位,然后再发生数据传输的方向位, 0表示主设备向从设备写数据,1表示主设备向从设备读数据。
应答信号
接收数据的器件 在接收到 8bit 数据后,向发送数据的器件发出 低电平 的应答信号,表示已收到数据。这个信号可以是主控器件发出,也可以是从动器件发出。总之,由接收数据的器件发出。  非应答数据线拉高来表示

 

  •  主设备往从设备写数据 (W0)

  •   主设备读从设备数据 (R1)

5、STM32F4-I2C控制器特性

软件模拟I2C时序
由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。

硬件控制产生I2C时序
STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C协议的方式减轻了 CPU 的工作,且使软件设计更加简单

6、框图

I2C的主要特点
● I2C总线规范 rev03 兼容性:
- 从机模式和主机模式
- 多主机功能- 标准模式(高达 100kHz )
- 快速模式(高达 400kHz )
- 超快速模式(高达 1 MHz )
- 7 位和 10 位地址模式
- 软件复位
● 1 字节缓冲带 DMA 功能

STM32F4-I2C通讯引脚:STM32芯片有多个I2C外设,它们的I2C通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚。

 

二、EEPROM(24CXX)存储芯片介绍

1、EEPRROM简介

EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。       
EEPROM常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPOM 芯片最常用的通讯方式就是 I 2 C 协议
AT24XX芯片容量    XX表示:01、02、04、16、32、64、…..    单位: Kbit

2、本芯片AT24C02芯片简介

AT24C02是一个2K位串行CMOS,内部含有256个字节,此芯片具有I2C通讯接口,芯片内保存的数据在掉电的情况下不丢失(EEPROM),常用于存放比较重要的数据。本实验使用的是SOP-8封装的AT24C02芯片,其引脚说明见下图

(1)设备地址

24CXX的设备地址:       
24CXX的设备地址为7位:      
高4位恒定为 1010      
低3位取决于A0-A2的电平状态
注:一般主机在读写24CXX都是把设备地址连同读写位组合成一个字节一起发送

(2) 硬件和原理图

 

(3)读写时序(根据AT24C02芯片手册内容)

一个写操作需要8位数据字的地址,跟随着设备地址和响应位。一旦收到地址,EEPROM会再次响应0,然后输入第一个8位数据字。在接收到8位数据字后,EEPROM将输出一个“0”,寻址设备(如微控制器)必须以停止条件终止写序列。

随机读需要一个“空”字节写序列来加载数据字地址。一旦设备地址字和数据字地址被输入并被EEPROM确认,微控制器必须生成另一个启动条件。微控制器通过发送一个设备地址和读写标志位选择1,来启动当前地址的读取。EEPROM确认设备地址并串行输出数据字。 微控制器不响应“0”,但会产生停止条件

 AT24C02芯片的器件地址为7位,高4位固定为1010,低3位有上表中的A0/A1/A2引脚的电平决定,还有一位(最低位R/W)用来选择读写方向。本实验中A0/A1/A2引脚接在GND上了,因此器件地址为1010000;加上最低位的读写方向位后,写器件地址为10100000(0xA0),读器件地址为10100001(0xA1)

SCL:串行时钟,SDA:串行数据I/O

 

 

三、2IC读写EEPROM实例HAL库版本

1、实验要求:实现主机与EEPROM(24C02)双向通信。

2、硬件原理图分析

 

IIC的时钟线和数据线对应PB8、PB9

3、cubmx配置

开始168mhz时钟,串口通信,IIC外部管脚配置

 

主从地址必须在0到127之间,我们这边只有一个设备所以是0。生产工程打开keil。

4、编程思路

实现一个写函数、一个读函数,在主程序中写入EEPROM并从EEPROMN读出来打印

我们使用到两个HAL库函数 

代码中注意我们的EEPROM是8字节使用I2C_MEMADD_SIZE_8BIT


  
  1. int fputc(int ch,FILE *p)
  2. {
  3. while(!(USART1->SR & ( 1<< 7)));
  4. USART1->DR = (uint8_t) ch;
  5. return ch;
  6. }
  7. #define WriteAddr 0xA0
  8. #define ReadAddr 0xA1
  9. uint8_t Wbuf[ 20] = "EEPROM TEST OK!";
  10. uint8_t Rbuf[ 20] = { 0};
  11. /********* 24c02 写数据函数 *****************
  12. * @brief
  13. * @param MemAddr 起始位置
  14. * @param 数据存储区
  15. * @param 数据长度
  16. ********* 24c02 写数据函数 ******************/
  17. void EEPROM_Write(uint16_t MemAddr,uint8_t *Wbuf, uint16_t len)
  18. {
  19. while(len--)
  20. {
  21. while(HAL_I2C_Mem_Write(&hi2c1, WriteAddr, MemAddr, I2C_MEMADD_SIZE_8BIT, Wbuf, 1, 100) != HAL_OK){};
  22. MemAddr++;
  23. Wbuf++;
  24. }
  25. }
  26. /********* 24c02 读数据函数 *****************
  27. * @brief
  28. * @param MemAddr 起始位置
  29. * @param 数据存储区
  30. * @param 数据长度
  31. ********* 24c02 读数据函数 ******************/
  32. void EEPROM_Read(uint16_t MemAddr,uint8_t *Rbuf, uint16_t len)
  33. {
  34. while(HAL_I2C_Mem_Read(&hi2c1, ReadAddr, MemAddr, I2C_MEMADD_SIZE_8BIT, Rbuf,len, 100) != HAL_OK){};
  35. }
  36. /* USER CODE END 0 */
  37. /**
  38. * @brief The application entry point.
  39. *
  40. * @retval None
  41. */
  42. int main(void)
  43. {
  44. /* USER CODE BEGIN 1 */
  45. /* USER CODE END 1 */
  46. /* MCU Configuration----------------------------------------------------------*/
  47. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  48. HAL_Init();
  49. /* USER CODE BEGIN Init */
  50. /* USER CODE END Init */
  51. /* Configure the system clock */
  52. SystemClock_Config();
  53. /* USER CODE BEGIN SysInit */
  54. /* USER CODE END SysInit */
  55. /* Initialize all configured peripherals */
  56. MX_GPIO_Init();
  57. MX_USART1_UART_Init();
  58. MX_I2C1_Init();
  59. /* USER CODE BEGIN 2 */
  60. printf( "II2C test\r\n");
  61. EEPROM_Write( 0,Wbuf, sizeof(Wbuf));
  62. HAL_Delay( 500);
  63. EEPROM_Read( 0,Rbuf, sizeof(Rbuf));
  64. printf( "%s",Rbuf);
  65. /* USER CODE END 2 */
  66. /* Infinite loop */
  67. /* USER CODE BEGIN WHILE */
  68. while ( 1)
  69. {
  70. /* USER CODE END WHILE */
  71. /* USER CODE BEGIN 3 */
  72. }
  73. /* USER CODE END 3 */
  74. }

5、实验效果

四、2IC读写EEPROM实例软件模拟设计

后续补充

转载:https://blog.csdn.net/m0_60718520/article/details/127455913
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场