嵌入式STM32学习:I2C-读写EEPROM2

发布者:传邮万里最新更新时间:2019-06-21 来源: eefocus关键字:STM32  I2C  读写EEPROM2 手机看文章 扫描二维码
随时随地手机看文章

bsp_i2c_ee.h


#ifndef __I2C_EE_H

#define __I2C_EE_H


#include "stm32f4xx.h"




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

#define EEPROM_I2C_SCL_GPIO_PORT            GPIOB                       

#define EEPROM_I2C_SCL_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define EEPROM_I2C_SCL_SOURCE               GPIO_PinSource6

#define EEPROM_I2C_SCL_AF                   GPIO_AF_I2C1


#define EEPROM_I2C_SDA_PIN                  GPIO_Pin_7                  

#define EEPROM_I2C_SDA_GPIO_PORT            GPIOB                       

#define EEPROM_I2C_SDA_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define EEPROM_I2C_SDA_SOURCE               GPIO_PinSource7

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

//#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);

uint32_t I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr);

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

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

void I2C_EE_WaitEepromStandbyState(void);


#endif /* __I2C_EE_H */


bap_i2c_ee.c


#include "./i2c/bsp_i2c_ee.h"

#include "./usart/bsp_debug_usart.h"




uint16_t EEPROM_ADDRESS;





static __IO uint32_t  I2CTimeout = I2CT_LONG_TIMEOUT;   



static uint32_t I2C_TIMEOUT_UserCallback(uint8_t errorCode);





/**

  * I2C I配置

  */

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);


}


/**

  * I2C 工作模式配置

  */

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;                            /* 高电平数据稳定,低电平数据变化,I2C时钟线的占空比 */

  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);                                       /* I2C初始化 */

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


  I2C_AcknowledgeConfig(EEPROM_I2C, ENABLE);  

}


/**

  * I2C外设(EEPROM)初始化

  */

void I2C_EE_Init(void)

{

  I2C_GPIO_Config(); 


  I2C_Mode_Configu();



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

#ifdef EEPROM_Block0_ADDRESS

  /* 选择 EEPROM Block0 来写入 */

  EEPROM_ADDRESS = EEPROM_Block0_ADDRESS;

#endif


#ifdef EEPROM_Block1_ADDRESS  

  EEPROM_ADDRESS = EEPROM_Block1_ADDRESS;

#endif


#ifdef EEPROM_Block2_ADDRESS  

  EEPROM_ADDRESS = EEPROM_Block2_ADDRESS;

#endif


#ifdef EEPROM_Block3_ADDRESS  

  EEPROM_ADDRESS = EEPROM_Block3_ADDRESS;

#endif

}


/**

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

  * @param   

  *     @arg pBuffer:缓冲区指针

  *     @arg WriteAddr:写地址

  *     @arg NumByteToWrite:写的字节数

  */

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--)

[1] [2]
关键字:STM32  I2C  读写EEPROM2 引用地址:嵌入式STM32学习:I2C-读写EEPROM2

上一篇:嵌入式stm32学习:SPI-读写串行FLASH
下一篇:嵌入式stm32学习:I2C-读写EEPROM

推荐阅读最新更新时间:2024-11-17 11:22

STM32 中断时间计算
定时中断发生的时间T: T = (arr+1)*(psc+1)/72M T=1/f 32的tclk已知 我们可以直接用这个tclk 去除我们设定的分频系数(psc+1) 也就是把tclk 分成了(psc+)份 这个分频系数的范围在1~65535 这样得到tclk/(psc+1)也就得到了定时器最终的频率 我们在倒过来 得到我们的周期(psc+1)/tclk 在乘上我们的装载值 也就得到我们想要的时间了 例
[单片机]
<font color='red'>STM32</font> 中断时间计算
stm32之USART/UART应用实例
硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 USART与UARTD的区别: usart:全双工通用异步串行收发器 uart:全双工通用同步/异步串行收发器 usart支持同步通讯时比uart多一条时钟线,usart用于异步通讯时跟uart一样。 单工: 只能单向传输数据 半双工:某一个时刻只能接受或者发送的双向传输数据 全双工:**可以同时进行接收和发送数据 异步:发送方发送一帧数据后不需要接受方应答继续发送下一帧 同步:发送方发送完一帧数据后需要等待接受方应答才能发下一帧 串行:每一传输按位进行,在一个导线上一位一位一次传输 并行:每次传输按两位或
[单片机]
<font color='red'>stm32</font>之USART/UART应用实例
stm32定时器(基本定时器)操作寄存器版
定时器本质 定时器的本质:计数器 定时器的构成:时钟源+计数器+重载值 1、stm32的定时器 stm32定时器数量较多、功能比较强;不同的定时器功能有不同。 stm32的定时器进行类型划分。分为三类:①基本定时器;②通用定时器;③高级定时器 基本定时器:用于定时器,还可以用于触发DAC(数模转换器)、ADC(模数转换器)工作。 通用定时器:具备基本定时器所有的功能;捕获输入、比较输出、捕获PWM波、生成PWM波、支持霍尔元件 高级定时器:具备通用定时器所有的功能:支持死区、刹车功能。 STM32F407的基本定时器有TIM6、TIM7. STM32F407的通用定时器有TIM2~TI
[单片机]
<font color='red'>stm32</font>定时器(基本定时器)操作寄存器版
STM32 SysTick定时器常见问题及延时函数的实现
Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:为什么要设置SysTick定时器? (1)产生操作系统的时钟节拍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 (2)便于不同处理器之间程序移植。 Cortex‐M3处理器内
[单片机]
<font color='red'>STM32</font> SysTick定时器常见问题及延时函数的实现
基于机智云物联网平台的空气质量多功能检测系统设计
摘要: 目前市面上的空气质量检测仪通常只能检测少数几种气体,面对空气中多种有害气体,就要使用不同的检测仪器。针对现有检测系统功能不全等问题,开发了由STM32单片机、各类传感器、LCD显示屏和WiFi通信模块组成的多功能检测系统,并利用机智云物联网平台传输数据到用户终端。该检测系统能够实现对空气中的CO、CO2、PM2.5、TVOC、甲醛的含量以及温湿度进行实时监测,并具有超标报警功能。 1引言 空气中的有害物质直接影响人们的心身健康,室内空气的危害气体主要有CO、CO2、PM2.5、甲醛等 。温湿度对人的舒适度有较大影响,低湿度环境对人有多种不利影响 。因此,对空气中的有害气体及环境的温湿度进行检测是必要的,对人员密集、
[单片机]
基于机智云物联网平台的空气质量多功能检测系统设计
stm32初学之LED按键中断
首先,我们选定需要控制的特定引脚, 然后为其配置特定的功能, 最后就可以通过按键控制LED的亮与灭了。 对于LED和按键的初始化比较相似,都是通过GPIO_InitTypeDef结构体来配置。 typedef struct { uint16_t GPIO_Pin; //引脚号 GPIOSpeed_TypeDef GPIO_Speed; //配置速度 GPIOMode_TypeDef GPIO_Mode; //工作模式 }GPIO_InitTypeDef; 这里还可以通过 GPIO_SetBits(GPIOC,GPIO_Pin_3);和GPIO_ResetBits(GPIOC,GPIO_Pin_3) 来使LED
[单片机]
STM32下串口的使用
STM32下关于串口的固件库写得相当好了,以下只是本文对串口库的一点点封装: /*HKY_uart.h*/ #ifndef _HKY_UART_H_ #define _HKY_UART_H_ #include stm32f10x_lib.h //#include platform_config.h #define GPIO_RTSPin GPIO_Pin_1 #define GPIO_CTSPin GPIO_Pin_0 #define GPIO_TxPin GPIO_Pin_2 #define GPIO_RxPin GPIO_Pin_3 void USART2_Config
[单片机]
ST推出STM32微控制器先进电机控制算法
2008年9月9日 ,意法半导体扩大32位STM32微控制器(MCU)支持的电机矢量控制函数库,新增了支持单旁路无传感器控制、内部永磁(IPM)电机控制和永磁同步(PMSM)电机弱磁控制的算法。目前市场上大约已有40种电机控制应用采用了意法半导体的基于Cortex-M3的STM32微控制器。 新增的控制函数功能被补充到STM32电机控制函数库2.0版内,在新一代电器、工业驱动器、电泵、加热通风空调(HVAC)系统、自动售货机、收款机和电动汽机车等应用领域,新算法将有助于加快产品上市时间,降低材料成本,优化电机选型,冲破运行限制。 同时,意法半导体通过增加对Kei
[工业控制]
ST推出<font color='red'>STM32</font>微控制器先进电机控制算法
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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