datasheet

STM32:I2C接口读写EEPROM(AT24C02)试验例程

2019-08-14来源: eefocus关键字:STM32  2C接口  读写EEPROM  AT24C02

硬件平台:stm32f10xZET6

开发环境:keil MDK uVisionv4.10

开发语言:C、ST_lib_3.5固件库


EEPROM:电可擦可编程只读存储器。


【stm32f10xZET6开发板的I2C外设物理层特点】

(1)两条串行总线:一条双向数据线(SDA),一条时钟线(SCL);

(2)从设备地址唯一;

(3)支持总线仲裁;

(4)三种速率传输模式:

    标准模式100kbit/s

    快速模式400kbit/s

    高速模式3.4Mbit/s (目前大多I2C设备尚不支持高速模式)

(5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整;

(6)连接到相同总线的IC数量受到总线的最大电容400pF限制;


【I2C接口特性】

(1) STM32 中和大容量型号芯片均有多达 2 个I2C总线接口;

(2) 能够工作于多主机或多从机模式,主从均可收发;

(3) 支持标准模式 100Kbit/s 和快速模式 400Kbit/s,不支持高

速模式;

(4) 支持 7 位或 10 位从设备地址寻址;

(5) 内置了硬件 CRC 发生器/ 校验器;

(6) I2C 的接收和发送都可以使用 DMA 操作;

(7) 支持系统管理总线(SMBus)总线 2.0 版;


typedef struct

{

  uint32_t I2C_ClockSpeed;          /*!< 指定时钟总线速率,100/400kHz */

  uint16_t I2C_Mode;                /*!< 指定为I2C通信模式 */

  uint16_t I2C_DutyCycle;           /*!< 指定I2C快速模式 */

  uint16_t I2C_OwnAddress1;         /*!< 指定从设备自身地址,7/10bit(地址0x0A对应宏) */

  uint16_t I2C_Ack;                 /*!< 使能或禁止ack */

  uint16_t I2C_AcknowledgedAddress; /*!< 指定7/10bit从设备地址下的ack */

} I2C_InitTypeDef;


在 stm32 如何建立与 EEPROM 的通讯步骤:

(1) 配置 I/O 端口,确定并配置 I2C 的模式,使能 GPIO 和 I2C

时钟。

(2) 写:

    1) 检测 SDA 是否空闲;

    2) 按 I2C 协议发出起始信号;

    3) 发出 7 位器件地址和写模式;

    4) 要写入的存储区首地址;

    5) 用页写入方式或字节写入方式写入数据;

    6) 发送 I2C 通讯结束讯信号

每个操作之后要检测“事件”确定是否成功。写完后检测 EEPROM 是否进

入 standby 状态。

(3) 读:

    1) 检测 SDA 是否空闲;

    2) 按 I2C 协议发出起始讯号;

    3) 发出 7 位器件地址和写模式(伪写);

    4) 发出要读取的存储区首地址;

    5) 重发起始讯号;第 260 页 共 729 页

    6) 发出 7 位器件地址和读模式;

    7) 接收数据;

类似写操作,每个操作之后要检测“事件”确定是否成功。


I2C_GenerateSTART();    // 产生 I2C 的通讯起始信号 S

I2C_Send7bitAddress();  // 发送7位从设备地址

I2C_SendData();         // 发送一个数据字节(8bit)

I2C_GenerateSTOP();     // 产生 I2C 的通讯停止信号 P

I2C_CheckEvent ();      // I2C 传输时的事件监测


/* 代码演示 - mian.c */

/**

  ******************************************************************************

  * @file    main.c

  * @author  fire

  * @version V1.0

  * @date    2013-xx-xx

  * @brief   I2C EEPROM(AT24C02)测试,测试信息通过USART1打印在电脑的超级终端

  ******************************************************************************

  */

  

#include "stm32f10x.h"

#include "bsp_usart1.h"

#include "bsP_i2c_ee.h"

#include "bsP_led.h"

#include

 

#define  EEP_Firstpage      0x00

u8 I2c_Buf_Write[256];

u8 I2c_Buf_Read[256];

void I2C_Test(void);

 

/**

  * @brief  主函数

  * @param  无

  * @retval 无

  */

int main(void)

  

  /* 串口1初始化 */

USART1_Config();

printf("rn 这是一个I2C外设(AT24C02)读写测试例程 rn");

//LED_GPIO_Config();

 

 

/* I2C 外设初(AT24C02)始化 */

I2C_EE_Init();

 

 

printf("rn 这是一个I2C外设(AT24C02)读写测试例程 rn");

 

I2C_Test();

  

  while (1)

  {      

  }

}

 

/**

  * @brief  I2C(AT24C02)读写测试

  * @param  无

  * @retval 无

  */

void I2C_Test(void)

{

u16 i;

 

 

printf("写入的数据nr");

    

for ( i=0; i<=255; i++ ) // 填充缓冲

  {                            

    I2c_Buf_Write[i] = i;

 

 

    printf("0x%02X ", I2c_Buf_Write[i]);

    if(i%16 == 15)    

        printf("nr");    

   }

 

    //将I2c_Buf_Write中顺序递增的数据写入EERPOM中 

    //LED1(ON);

I2C_EE_BufferWrite (I2c_Buf_Write, EEP_Firstpage, 256);

//LED1(OFF);   

  

  printf("nr写成功nr");

   

   printf("nr读出的数据nr");

  //将EEPROM读出数据顺序保持到I2c_Buf_Read中

    //LED2(ON);   

I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 256); 

   //LED2(OFF);

   

  //将I2c_Buf_Read中的数据通过串口打印

for (i=0; i<256; i++)

{

if(I2c_Buf_Read[i] != I2c_Buf_Write[i])

{

printf("0x%02X ", I2c_Buf_Read[i]);

printf("错误:I2C EEPROM写入与读出的数据不一致nr");

return;

}

    printf("0x%02X ", I2c_Buf_Read[i]);

    if(i%16 == 15)    

        printf("nr");

    

}

  printf("I2C(AT24C02)读写测试成功nr");

}

 

/* 代码演示 - bsp_i2c_ee模块 */

#ifndef __I2C_EE_H

#define __I2C_EE_H

 

#include "stm32f10x.h"

 

/* 

 * AT24C02 2kb = 2048bit = 2048/8 B = 256 B

 * 32 pages of 8 bytes each

 *

 * Device Address

 * 1 0 1 0 A2 A1 A0 R/W

 * 1 0 1 0 0  0  0  0 = 0XA0

 * 1 0 1 0 0  0  0  1 = 0XA1 

 */

 

/* EEPROM Addresses defines */

#define EEPROM_Block0_ADDRESS   0xA0 /* E2 = 0 */

//#define EEPROM_Block1_ADDRESS 0xA2 /* E2 = 0 */

//#define EEPROM_Block2_ADDRESS 0xA4 /* E2 = 0 */

//#define EEPROM_Block3_ADDRESS 0xA6 /* E2 = 0 */

 

void I2C_EE_Init(void);

void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite);

void I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr);

void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite);

void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead);

void I2C_EE_WaitEepromStandbyState(void);

 

#endif /* __I2C_EE_H */

 

//--------------------------------------------------------

/**

  ******************************************************************************

  * @file    bsp_i2c_ee.c

  * @author  STMicroelectronics

  * @version V1.0

  * @date    2013-xx-xx

  * @brief   i2c EEPROM(AT24C02)应用函数bsp

  ******************************************************************************

  */ 

 

#include "bsp_i2c_ee.h"

 

/* STM32 I2C 快速模式 */

#define I2C_Speed              400000

 

/* 这个地址只要与STM32外挂的I2C器件地址不一样即可 */

#define I2C1_OWN_ADDRESS7      0X0A   

 

/* AT24C01/02每页有8个字节 */

#define I2C_PageSize           8

 

/* AT24C04/08A/16A每页有16个字节 */

//#define I2C_PageSize           16

 

uint16_t EEPROM_ADDRESS;

 

/**

  * @brief  I2C1 I/O配置

  * @param  无

  * @retval 无

  */

static void I2C_GPIO_Config(void)

{

  GPIO_InitTypeDef  GPIO_InitStructure; 

 

  /* 使能与 I2C1 有关的时钟 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  

    

  /* PB6-I2C1_SCL、PB7-I2C1_SDA*/

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;        // 开漏输出

  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

 

/**

  * @brief  I2C 工作模式配置

  * @param  无

  * @retval 无

  */

static void I2C_Mode_Configu(void)

{

  I2C_InitTypeDef  I2C_InitStructure; 

 

  /* I2C 配置 */

  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

  /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */

  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

  I2C_InitStructure.I2C_OwnAddress1 = I2C1_OWN_ADDRESS7; 

  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;

  /* I2C的寻址模式 */

  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

  /* 通信速率 */

  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;

  

  /* I2C1 初始化 */

  I2C_Init(I2C1, &I2C_InitStructure);

  

  /* 使能 I2C1 */

  I2C_Cmd(I2C1, ENABLE);   

}

 

/**

  * @brief  I2C 外设(EEPROM)初始化

  * @param  无

  * @retval 无

  */

void I2C_EE_Init(void)

{

 

  I2C_GPIO_Config(); 

 

  I2C_Mode_Configu();

 

/* 根据头文件i2c_ee.h中的定义来选择EEPROM要写入的地址 */

#ifdef EEPROM_Block0_ADDRESS

  /* 选择 EEPROM Block0 来写入 */

EEPROM_ADDRESS =

[1] [2] [3]

关键字:STM32  2C接口  读写EEPROM  AT24C02

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471027.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 IIC通信往24C02写数据、读数据
下一篇:MDK5+CH340驱动安装

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32驱动超声波模块

;           //使能中断NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM6,DISABLE);}//定时器6中断服务程序u32 msHcCount = 0;void TIM6_IRQHandler(void)   //TIM6中断{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM6, TIM_IT_Update);       
发表于 2019-08-19

STM32单片机连接HC_SR04超声波模块测距

首先,先来看一下这个模块的基本功能和原理。HC-SR04超声波测距模块可提供约2cm400厘米的非接触式距离感测功能,测距精度可达高到3毫米;模块包括超声波发射器,接收器与控制电路像智能小车的测距以及转向,或是一些项目中,常常会用到。智能小车测距可以及时发现前方的障碍物,使智能小车可以及时转向,避开障碍物。注意是5v输入,但是我用stm32的3.3v输入也是没有问题的。二,工作原理      1.给超声波模块接入电源和地      。2.给脉冲触发引脚(trig)输入一个长为20us的高电平方波   
发表于 2019-08-19
STM32单片机连接HC_SR04超声波模块测距

基于STM32的超声波传感器测距(含代码)

1. 实验原理        超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。         测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 =  Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s
发表于 2019-08-19
基于STM32的超声波传感器测距(含代码)

STM32F103 USART1串口重映射功能的实现

; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); /*  RX PB7 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOB,&GPIO_InitStructure);}static void Usart_Config1(u32 baudrate){ USART_InitTypeDef
发表于 2019-08-19
STM32F103 USART1串口重映射功能的实现

基于STM32的超声波HC-SR04历程

了 TIM_Cmd(TIM2,DISABLE);//关闭定时器 length=TIM_GetCounter(TIM2)/58; if(length<=0) length=0;        TIM_SetCounter(TIM2,0);  //取出TIM2定时器counter寄存器里的值 SysTick_Delay_Ms(200);   return length; } /*    主函数  */ #include "stm32f10x.h"#include "
发表于 2019-08-19

STM32F103 时钟系统明晰

本人小白一个,利用课外时间自学STM32。个人感觉,STM32的时钟系统什么的,感觉很复杂,对整个时钟系统的概念都很模糊,只知道该怎么配置,却不知道是怎么来的,所以就花了一天功夫专门上网搜集了一下资料,整理之后在此用通俗易懂的语言分享出来。如有用词不当以及总结错误的地方,还希望各位大佬指出。博主也好及时进行自我纠正,在此先谢过了。经常在配置外设时,总会有一句开启APB1或者APB2下的哪个外设的时钟,还有什么AHB时钟,SYSCLK时钟,让人很是很头疼。下面,你只需要记住这些死知识就够了:SYSCLK: 系统时钟,最大可以达到72MHZ。HCLK: AHB总线时钟,由SYSCLK分频得到,一般都是设置为不分频。经过时钟总线桥
发表于 2019-08-19

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved