stm32固件库I2C操作

发布者:haoying最新更新时间:2025-01-15 来源: jianshu关键字:stm32  固件库  I2C操作 手机看文章 扫描二维码
随时随地手机看文章

野火eeprom.JPG


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

#define I2C_PageSize           8


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

//#define I2C_PageSize           16         




/* STM32 I2C 快速模式 */

#define I2C_Speed              400000


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

#define I2C_OWN_ADDRESS7      0X0A   


/*I2C接口*/

#define EEPROM_I2C                          I2C1

#define EEPROM_I2C_CLK                      RCC_APB1Periph_I2C1

#define EEPROM_I2C_CLK_INIT                             RCC_APB1PeriphClockCmd


#define EEPROM_I2C_SCL_PIN                  GPIO_Pin_8                 

#define EEPROM_I2C_SCL_GPIO_PORT            GPIOB                       

#define EEPROM_I2C_SCL_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define EEPROM_I2C_SCL_SOURCE               GPIO_PinSource8

#define EEPROM_I2C_SCL_AF                   GPIO_AF_I2C1


#define EEPROM_I2C_SDA_PIN                  GPIO_Pin_9                  

#define EEPROM_I2C_SDA_GPIO_PORT            GPIOB                       

#define EEPROM_I2C_SDA_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define EEPROM_I2C_SDA_SOURCE               GPIO_PinSource9

#define EEPROM_I2C_SDA_AF                   GPIO_AF_I2C1


/*等待超时时间*/

#define I2CT_FLAG_TIMEOUT         ((uint32_t)0x1000)

#define I2CT_LONG_TIMEOUT         ((uint32_t)(10 * I2CT_FLAG_TIMEOUT))


/*信息输出*/

#define EEPROM_DEBUG_ON         0


#define EEPROM_INFO(fmt,arg...)           printf('<<-EEPROM-INFO->> 'fmt'n',##arg)

#define EEPROM_ERROR(fmt,arg...)          printf('<<-EEPROM-ERROR->> 'fmt'n',##arg)

#define EEPROM_DEBUG(fmt,arg...)          do{

                                          if(EEPROM_DEBUG_ON)

                                          printf('<<-EEPROM-DEBUG->> [%d]'fmt'n',__LINE__, ##arg);

                                          }while(0)


/* 

 * 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 */


================================


uint16_t EEPROM_ADDRESS;





static __IO uint32_t  I2CTimeout = I2CT_LONG_TIMEOUT;   



static uint32_t I2C_TIMEOUT_UserCallback(uint8_t errorCode);





/**

  * @brief  I2C1 I/O配置

  * @param  无

  * @retval 无

  */

static void I2C_GPIO_Config(void)

{


  GPIO_InitTypeDef  GPIO_InitStructure; 

   

  /*!< EEPROM_I2C Periph clock enable */

  EEPROM_I2C_CLK_INIT(EEPROM_I2C_CLK, ENABLE);

  

  /*!< EEPROM_I2C_SCL_GPIO_CLK and EEPROM_I2C_SDA_GPIO_CLK Periph clock enable */

  RCC_AHB1PeriphClockCmd(EEPROM_I2C_SCL_GPIO_CLK | EEPROM_I2C_SDA_GPIO_CLK, ENABLE);


  /*!< GPIO configuration */

  /* Connect PXx to I2C_SCL*/

  GPIO_PinAFConfig(EEPROM_I2C_SCL_GPIO_PORT, EEPROM_I2C_SCL_SOURCE, EEPROM_I2C_SCL_AF);

  /* Connect PXx to I2C_SDA*/

  GPIO_PinAFConfig(EEPROM_I2C_SDA_GPIO_PORT, EEPROM_I2C_SDA_SOURCE, EEPROM_I2C_SDA_AF);  

  

  /*!< Configure EEPROM_I2C pins: SCL */   

  GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

  GPIO_Init(EEPROM_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);


  /*!< Configure EEPROM_I2C pins: SDA */

  GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SDA_PIN;

  GPIO_Init(EEPROM_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);

 

}


/**

  * @brief  I2C 工作模式配置

  * @param  无

  * @retval 无

  */

static void I2C_Mode_Configu(void)

{

  I2C_InitTypeDef  I2C_InitStructure; 


  /* I2C 配置 */

  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;    

  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;                            /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */

  I2C_InitStructure.I2C_OwnAddress1 =I2C_OWN_ADDRESS7; 

  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;  

  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /* I2C的寻址模式 */

  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;                             /* 通信速率 */

  I2C_Init(EEPROM_I2C, &I2C_InitStructure);                                       /* I2C1 初始化 */

  I2C_Cmd(EEPROM_I2C, ENABLE);                                                      /* 使能 I2C1 */


  I2C_AcknowledgeConfig(EEPROM_I2C, 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 = EEPROM_Block0_ADDRESS;

#endif


#ifdef EEPROM_Block1_ADDRESS  

    /* 选择 EEPROM Block1 来写入 */

  EEPROM_ADDRESS = EEPROM_Block1_ADDRESS;

#endif


#ifdef EEPROM_Block2_ADDRESS  

    /* 选择 EEPROM Block2 来写入 */

  EEPROM_ADDRESS = EEPROM_Block2_ADDRESS;

#endif


#ifdef EEPROM_Block3_ADDRESS  

    /* 选择 EEPROM Block3 来写入 */

  EEPROM_ADDRESS = EEPROM_Block3_ADDRESS;

#endif

}


/**

  * @brief   将缓冲区中的数据写到I2C EEPROM中

  * @param   

  *     @arg pBuffer:缓冲区指针

  *     @arg WriteAddr:写地址

  *     @arg NumByteToWrite:写的字节数

  * @retval  无

  */

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

{

  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;


  Addr = WriteAddr % I2C_PageSize;

  count = I2C_PageSize - Addr;

  NumOfPage =  NumByteToWrite / I2C_PageSize;

  NumOfSingle = NumByteToWrite % I2C_PageSize;

 

  /* If WriteAddr is I2C_PageSize aligned  */

  if(Addr == 0) 

  {

    /* If NumByteToWrite < I2C_PageSize */

    if(NumOfPage == 0) 

    {

      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);

      I2C_EE_WaitEepromStandbyState();

    }

    /* If NumByteToWrite > I2C_PageSize */

    else  

    {

      while(NumOfPage--)

      {

        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize); 

        I2C_EE_WaitEepromStandbyState();

        WriteAddr +=  I2C_PageSize;

        pBuffer += I2C_PageSize;

      }


      if(NumOfSingle!=0)

      {

        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);

        I2C_EE_WaitEepromStandbyState();

      }

    }

  }

  /* If WriteAddr is not I2C_PageSize aligned  */

  else 

  {

    /* If NumByteToWrite < I2C_PageSize */

    if(NumOfPage== 0) 

    {

      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);

      I2C_EE_WaitEepromStandbyState();

    }

    /* If NumByteToWrite > I2C_PageSize */

    else

    {

      NumByteToWrite -= count;

      NumOfPage =  NumByteToWrite / I2C_PageSize;

      NumOfSingle = NumByteToWrite % I2C_PageSize;  

      

      if(count != 0)

      {  

        I2C_EE_PageWrite(pBuffer, WriteAddr, count);

        I2C_EE_WaitEepromStandbyState();

        WriteAddr += count;

        pBuffer += count;

      } 

      

      while(NumOfPage--)

      {

        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);

        I2C_EE_WaitEepromStandbyState();

        WriteAddr +=  I2C_PageSize;

        pBuffer += I2C_PageSize;  

[1] [2] [3]
关键字:stm32  固件库  I2C操作 引用地址:stm32固件库I2C操作

上一篇:STM32串口打印乱码
下一篇:STM32低功耗模式下GPIO如何配置最节能?

推荐阅读最新更新时间:2026-03-25 12:00

stm32固件库I2C操作
野火eeprom.JPG /* AT24C01/02每页有8个字节 */ #define I2C_PageSize 8 /* AT24C04/08A/16A每页有16个字节 */ //#define I2C_PageSize 16 /* STM32 I2C 快速模式 */ #define I2C_Speed 400000 /* 这个地址只要与STM32外挂的I2C器件地址不一样即可 */ #define I2C_OWN_ADDRESS7 0X0A /*I2C接口*/ #define EEPROM_I2C I2C1 #define EE
[单片机]
stm32固件库SPI操作
野火25Q128.JPG ''' /* Private typedef -----------------------------------------------------------*/ //#define sFLASH_ID 0xEF3015 //W25X16 //#define sFLASH_ID 0xEF4015 //W25Q16 //#define sFLASH_ID 0XEF4017 //W25Q64 define sFLASH_ID 0XEF4018 //W25Q128 //#d
[单片机]
初识STM32固件库——我们认为管件库应该是什么样子的
一、STM32固件库文件分析 汇编编写的启动文件startup_stm32f10x_hd.s 设置堆栈指针 设置PC指 初始化中断向量表 配置系统时钟 对用C库函数 __main最终去到C的世界 时钟配置文件 system_stm32f10x.c:将外部时钟HSE=8M,经过PLL倍频为72M 外设相关的(xx:GPIO UART I2C SPI FSMC) stm32f10x.h:实现内核之外的外设寄存器映射 stm32f10x_xx.h存放外设的初始化结构体、外设初始化结构体成员的参数列表、外设固件库的函数声明 stm32f10x_xx.c外设驱动函数库文件 内和相关的 core_c
[单片机]
如何从官网下载STM32固件库
想在ST官网下载STM32F10x的固件库,找了很长时间才找到,为了方便像我一样的菜鸟学习方便,现将如何从官网下载STM32F10x固件库展示如下: 首先进入官网http:/www.st.com/ ,如下图: 在下面选项卡中选择Support- Tools & Resources,如下图: 进入如下界面: 点击左面的Software Tools,进入如下界面: 再点击左侧的Runtime Software下的Firmware进入如下界面: 在右侧Firmware for MCUs下点选STM32,进入如下界面: 搜索也好,一个一个找也好,最后都会看到如下的一项: 可以看到最新的firmware是3.5
[单片机]
如何从官网下载<font color='red'>STM32</font><font color='red'>固件库</font>
STM32的三种开发方式 HAL库固件库安装与用户手册
  相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好、黑猫也好,抓到耗子就是好猫。 STM32的三种开发方式   通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。   网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的
[单片机]
<font color='red'>STM32</font>的三种开发方式 HAL库<font color='red'>固件库</font>安装与用户手册
浅谈STM32芯片行丝印含义,固件库命名规则及三大结构发展图示
STM32芯片上的5行丝印 1、ARM代表ARM内核,ARM后面跟着的是 X,代表芯片版本 内核是不变的 只是ST的版本 X是最终版本,就是以后这个型号就不会再升级了,有数字的代理以后还可以升级 2/3、第二行和第三行是型号 4、原厂出厂编号 5、MYS是马来西亚封装产地,641是代表2016年41周生产的 CHN是国内封装产地 STM32固件库命名规则 1、系统文件名和源文件名以‘ stm32f10x_’的形式表示。 2、在单一文件中使用的常量在该文件中定义。在多个文件中使用的常量定义在头文件中。所有常量都以大写字母表示。 3、寄存器当做常量看待,同样以大写字母表示,多数情况下,在STM3210X参考手册中使用相同的缩写
[单片机]
浅谈<font color='red'>STM32</font>芯片行丝印含义,<font color='red'>固件库</font>命名规则及三大结构发展图示
STM32的GPIO 输出—使用固件库点亮LED
硬件设计 在本教程中STM32 芯片与LED 灯的连接见图1,这是一个RGB 灯,里面由红蓝绿三个小灯构成, 使用PWM控制时可以混合成256 不同的颜色。 图1 LED 硬件原理图 这些LED 灯的阴极都是连接到STM32 的GPIO引脚,只要我们控制GPIO引脚的电平输出状态,即可控制LED 灯的亮灭。若您使用的实验板LED 灯的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。 软件设计 为了使工程更加有条理,我们把LED 灯控制相关的代码独立分开存储,方便以后移植。在“工程模板”之上新建“bsp_led.c”及“ bsp_led.h”文件,其中的“bsp”即BoardSupport
[单片机]
<font color='red'>STM32</font>的GPIO 输出—使用<font color='red'>固件库</font>点亮LED
STM32固件库使用USART
1.USART的配置 (1)关键结构体 GPIO_InitTypeDef USART_InitTypeDef NVIC_InitTypeDef//用于接收的中断 1.1USART的TX在PA9,RX在PA10. 2.时钟线 2.1 USART时钟挂载在APB2上 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//配时钟 3.代码段 3.1(单发送) void usart_init(void){ GPIO_InitTypeDef gpio_
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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