赞
踩
本文主要介绍如何使用STM32CubeMX快速部署I2C通信,并与EEPROM进行数据收发。
I2C是一种串行同步半双工通信方式。
I2C物理层是由一条双向数据总线SDA和一条双向时间总线SCL组成,I2C总线上可以挂载多个从机设备。
stm32f103的引脚说明,来自leung——STM32CubeMX学习笔记(9)PB8 PB9 为重映射。
I2C协议层定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。通信流程如下:
起始信号发出后,先发出设备地址决定与哪个从机通信,WRITE位为0表示写入为1表示读出。主机每发送完一个字节数据,都要等待从机的应答信号 (ACK),只有接收到应答信号后,主机才能继续发送或接收数据。然后开始写入/读出数据,对于EEPROM写入/读出的第一个数据是写入/读出内存的地址。若接收端希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。
EEPROM 是一种掉电后数据不丢失的存储器,最常用的通讯方式就是 I2C 协议,STM32F103开发板中使用的 EEPROM 芯片型号是AT24C02。
AT24C02 EEPROM 的 7 位设备地址是:101 0000b ,即 0xA0。由于 I2C 通讯时常常是地址跟读写方向连在一起构成一个 8 位数,且当 R/W 位为 0 时,表示写方向,所以加上 7 位地址,其值为“0xA0”,常称该值为 I2C 设备的“写地址”;当 R/W 位为 1时,表示读方向,加上 7 位地址,其值为“0xA1”,常称该值为“读地址”。
AT24C02有2K的存储容量,2K=2*1024=2048位,所以最多可以往AT24C02存储器里面写2048bit,可以写256个8位字节,写或者读的地址是0X00–0X7FF。
值得一提的是根据AT24C02的规格说明书,写入ROM是比较耗时的,写周期最大5ms,没写入完就指令写入下一组数据会出现错误,这点在编程时需要注意。
EEPROM的页写入:虽然I2C通信是串行通信,一次传输一个字节,但对于EEPROM定义了一种页写入的时序。我们希望向连续地址写入多个数据的时候,只要告诉 EEPROM 第一个内存地址 address1,后面的数据按次序写入到address2、address3…这样可以节省通讯的内容,加快速度。AT24C02 型号的芯片页写入时序最多可以一次发送 8 个数据 (即 n = 8 ),该值也称为页大小,某些型号的芯片每个页写入时序最多可传输 16 个数据。
24系列的eeprom提供缓存的技术,写入一页的数据,它先保存起来,当你停止对它操作时(stop信号后),eeprom再把缓存的数据写好。所以页操作的最大值时受限于IC的缓存区大小的。 ——来自:EEPROM的写入操作解析
当写入数据溢出页大小限制时,溢出数据会从页起始地址再写入,如果该地址原本有数据,会被覆盖,导致写入异常。
很好的分析AT24C02的博客:stm32专题十七:AT24C02
AT24C02 型EEPROM一页最多写入8个数据,所以一般来说我们不能写入超过8个数据,但是通过合理的程序编程我们可以实现跨页写入,从而一次写入多个数据。
1.新建工程,常规配置调试模式、时钟树、项目环境;
2.选择PB0、PB1、PB5配置为GPIO_Out,初始为高电平,用于测试程序的指示;
3.配置I2C模式、传输速度,需要中断时开中断。
4.GENERATE CODE
1.函数介绍
HAL库部署I2C通信主要使用HAL_I2C_Mem_Write函数和HAL_I2C_Mem_Read函数。
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。