【STM32CubeMX】9,STM32之I2C,EEPROM

发布者:qazwsx007最新更新时间:2019-08-14 来源: eefocus关键字:STM32CubeMX  STM32  I2C  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)


         { HAL_Delay(500);

testarr[0]+=3;

if(HAL_I2C_Mem_Write(&hi2c1,0xa0,60,I2C_MEMADD_SIZE_8BIT,&testarr[0],1,3000)==HAL_OK)

{

printf (" testarr[0]=%drn",testarr[0]);

printf ("write OK !!!rn");

HAL_Delay(5);

 

 

}

else 

printf ("write false !!!rn");

// HAL_I2C_Mem_Write(&hi2c1,EEPROM_I2C_ADDRESS,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000);//&hi2c1³öÎÊÌ⣬ÁíÍâÒ²²»ÊÇ0xa1

if( HAL_I2C_Mem_Read(&hi2c1,0xa1,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000)==HAL_OK)//Ìî0xa1,»òÕß0xa0¶¼¿ÉÒÔ

{

printf ("Read OK !!!rn");

printf (" testarr[1]=%drn",testarr[1]);

}

else 

printf ("Read false !!!rn");

}

HAL_Delay(500);

testarr[0]+=3;

if(HAL_I2C_Mem_Write(&hi2c1,0xa0,60,I2C_MEMADD_SIZE_8BIT,&testarr[0],1,3000)==HAL_OK)

{

printf (" testarr[0]=%drn",testarr[0]);

printf ("write OK !!!rn");

HAL_Delay(5);



}

else 

printf ("write false !!!rn");

// HAL_I2C_Mem_Write(&hi2c1,EEPROM_I2C_ADDRESS,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000);//&hi2c1³öÎÊÌ⣬ÁíÍâÒ²²»ÊÇ0xa1

if( HAL_I2C_Mem_Read(&hi2c1,0xa1,60,I2C_MEMADD_SIZE_8BIT,&testarr[1],1,3000)==HAL_OK)//Ìî0xa1,»òÕß0xa0¶¼¿ÉÒÔ

{

printf ("Read OK !!!rn");

printf (" testarr[1]=%drn",testarr[1]);

}

else 

printf ("Read false !!!rn");

}

1,这个问题搞了几天了,最后是借鉴硬石科技写的底层EEPROM,自己的一直通不了,很郁闷。

 


#ifndef __I2C_EEPROM_H__

#define __I2C_EEPROM_H__

/* °üº¬Í·Îļþ ----------------------------------------------------------------*/

#include "stm32f1xx_hal.h"

 

/* ÀàÐͶ¨Òå ------------------------------------------------------------------*/

/* ºê¶¨Òå --------------------------------------------------------------------*/

#define I2C_OWN_ADDRESS                            0x0A              // stm32±¾»úI2CµØÖ·

#define I2C_SPEEDCLOCK                             400000            // I2CͨÐÅËÙÂÊ(×î´óΪ400K)

#define I2C_DUTYCYCLE                              I2C_DUTYCYCLE_2   // I2CÕ¼¿Õ±Èģʽ£º1/2 

 

#define EEPROM_I2Cx                                I2C1

#define EEPROM_I2C_RCC_CLK_ENABLE()                __HAL_RCC_I2C1_CLK_ENABLE()

#define EEPROM_I2C_RCC_CLK_DISABLE()               __HAL_RCC_I2C1_CLK_DISABLE()

 

#define EEPROM_I2C_GPIO_CLK_ENABLE()               __HAL_RCC_GPIOB_CLK_ENABLE()

#define EEPROM_I2C_GPIO_CLK_DISABLE()              __HAL_RCC_GPIOB_CLK_DISABLE()   

#define EEPROM_I2C_GPIO_PORT                       GPIOB   

#define EEPROM_I2C_SCL_PIN                         GPIO_PIN_6

#define EEPROM_I2C_SDA_PIN                         GPIO_PIN_7

 

/* 

 * EEPROM 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_I2C_ADDRESS                         0xA0

 

/* À©Õ¹±äÁ¿ ------------------------------------------------------------------*/

extern I2C_HandleTypeDef hi2c_eeprom;

 

/* º¯ÊýÉùÃ÷ ------------------------------------------------------------------*/

 

void               MX_I2C_EEPROM_Init(void);

void               I2C_EEPROM_WriteData(uint16_t Addr, uint8_t Reg, uint8_t Value);

HAL_StatusTypeDef  I2C_EEPROM_WriteBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);

HAL_StatusTypeDef I2C_EEPROM_WriteAnyLength(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);

 

uint8_t            I2C_EEPROM_ReadData(uint16_t Addr, uint8_t Reg);

HAL_StatusTypeDef  I2C_EEPROM_ReadBuffer(uint16_t Addr, uint8_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);

HAL_StatusTypeDef  I2C_EEPROM_IsDeviceReady(uint16_t DevAddress, uint32_t Trials);

 

#endif /* __I2C_EEPROM_H__ */

 

/******************* (C) COPYRIGHT 2015-2020 ӲʯǶÈëʽ¿ª·¢ÍÅ¶Ó *****END OF FILE****/


 

/**

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

  * ÎļþÃû³Ì: bsp_EEPROM.c 

  * ×÷    Õß: ӲʯǶÈëʽ¿ª·¢ÍŶÓ

  * °æ    ±¾: V1.0

  * ±àдÈÕÆÚ: 2015-10-04

  * ¹¦    ÄÜ: °åÔØEEPROM£¨AT24C02£©µ×²ãÇý¶¯³ÌÐò

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

  * ˵Ã÷£º

  * ±¾Àý³ÌÅäÌ×Ӳʯstm32¿ª·¢°åYS-F1ProʹÓá£

  * 

  * ÌÔ±¦£º

  * ÂÛ̳£ºhttp://www.ing10bbs.com

  * °æȨ¹éӲʯǶÈëʽ¿ª·¢ÍŶÓËùÓУ¬ÇëÎðÉÌÓá£

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

  */

/* °üº¬Í·Îļþ ----------------------------------------------------------------*/

#include "bsp_EEPROM.h"

 

/* ˽ÓÐÀàÐͶ¨Òå --------------------------------------------------------------*/

/* ˽Óк궨Òå ----------------------------------------------------------------*/

#define EVAL_I2Cx_TIMEOUT_MAX                   3000

 

/* ˽ÓбäÁ¿ ------------------------------------------------------------------*/

I2C_HandleTypeDef hi2c_eeprom;

uint32_t I2cxTimeout = EVAL_I2Cx_TIMEOUT_MAX;

 

/* À©Õ¹±äÁ¿ ------------------------------------------------------------------*/

/* ˽Óк¯ÊýÔ­ÐÎ --------------------------------------------------------------*/

/* º¯ÊýÌå --------------------------------------------------------------------*/

/**

  * º¯Êý¹¦ÄÜ: I2CÍâÉè³õʼ»¯

  * ÊäÈë²ÎÊý: ÎÞ

  * ·µ »Ø Öµ: ÎÞ

  * ˵    Ã÷£ºÎÞ

  */

void MX_I2C_EEPROM_Init(void)

{

  hi2c_eeprom.Instance             = EEPROM_I2Cx;

  hi2c_eeprom.Init.ClockSpeed      = I2C_SPEEDCLOCK;

  hi2c_eeprom.Init.DutyCycle       = I2C_DUTYCYCLE;

  hi2c_eeprom.Init.OwnAddress1     = 0;

  hi2c_eeprom.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;

  hi2c_eeprom.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

  hi2c_eeprom.Init.OwnAddress2     = 0;

  hi2c_eeprom.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

  hi2c_eeprom.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;

  HAL_I2C_Init(&hi2c_eeprom);

}

 

/**

  * º¯Êý¹¦ÄÜ: I2CÍâÉèÓ²¼þ³õʼ»¯ÅäÖÃ

  * ÊäÈë²ÎÊý: hi2c£ºI2C¾ä±úÀàÐÍÖ¸Õë

  * ·µ »Ø Öµ: ÎÞ

  * ˵    Ã÷: ¸Ãº¯Êý±»HAL¿âÄÚ²¿µ÷ÓÃ

  */

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)

{

  GPIO_InitTypeDef GPIO_InitStruct;

  if(hi2c->Instance==EEPROM_I2Cx)

  {  

    /* ʹÄÜÍâÉèʱÖÓ */

    EEPROM_I2C_RCC_CLK_ENABLE();        

    EEPROM_I2C_GPIO_CLK_ENABLE();

    

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    GPIO_InitStruct.Pin = EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(EEPROM_I2C_GPIO_PORT, &GPIO_InitStruct);

  }

}

 

/**

  * º¯Êý¹¦ÄÜ: I2CÍâÉèÓ²¼þ·´³õʼ»¯ÅäÖÃ

  * ÊäÈë²ÎÊý: hi2c£ºI2C¾ä±úÀàÐÍÖ¸Õë

  * ·µ »Ø Öµ: ÎÞ

  * ˵    Ã÷: ¸Ãº¯Êý±»HAL¿âÄÚ²¿µ÷ÓÃ

  */

void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)

{

  if(hi2c->Instance==EEPROM_I2Cx)

  {

    /* ½ûÓÃÍâÉèʱÖÓ */

    EEPROM_I2C_GPIO_CLK_DISABLE();

  

    /**I2C1 GPIO Configuration    

    PB6     ------> I2C1_SCL

    PB7     ------> I2C1_SDA 

    */

    HAL_GPIO_DeInit(EEPROM_I2C_GPIO_PORT, EEPROM_I2C_SCL_PIN|EEPROM_I2C_SDA_PIN);

  }

}

 

 

/**

  * º¯Êý¹¦ÄÜ: I2CͨÐÅ´íÎó´¦Àíº¯Êý

  * ÊäÈë²ÎÊý: ÎÞ

  * ·µ »Ø Öµ: ÎÞ

  * ˵    Ã÷: Ò»°ãÔÚI2CͨÐų¬Ê±Ê±µ÷Óøú¯Êý

  */

static void I2C_EEPROM_Error (void)

{

  /* ·´³õʼ»¯I2CͨÐÅ×ÜÏß */

  HAL_I2C_DeInit(&hi2c_eeprom);

  

  /* ÖØгõʼ»¯I2CͨÐÅ×ÜÏß*/

  MX_I2C_EEPROM_Init();

  printf("EEPROM I2CͨÐų¬Ê±£¡£¡£¡ ÖØÐÂÆô¶¯I2C...n");

}

 

/**

  * º¯Êý¹¦ÄÜ: ͨ¹ýI2CдÈëÒ»¸öÖµµ½Ö¸¶¨¼Ä´æÆ÷ÄÚ

  * ÊäÈë²ÎÊý: Addr£ºI2CÉ豸µØÖ·

  *           Reg£ºÄ¿±ê¼Ä´æÆ÷

  *           Value£ºÖµ

  * ·µ »Ø Öµ: ÎÞ

  * ˵    Ã÷: ÎÞ

  */

void I2C_EEPROM_WriteData(uint16_t Addr, uint8_t Reg, uint8_t Value)

{

  HAL_StatusTypeDef status = HAL_OK;

  

  status = HAL_I2C_Mem_Write(&hi2c_eeprom, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, &Value, 1, I2cxTimeout);

  

  /* ¼ì²âI2CͨÐÅ״̬ */

  if(status != HAL_OK)

  {

    /* µ÷ÓÃI2CͨÐÅ´íÎó´¦Àíº¯Êý */

    I2C_EEPROM_Error();

  }

}

 

/**

  * º¯Êý¹¦ÄÜ: ͨ¹ýI2CдÈëÒ»¶ÎÊý¾Ýµ½Ö¸¶¨¼Ä´æÆ÷ÄÚ

[1] [2]
关键字:STM32CubeMX  STM32  I2C  EEPROM 引用地址:【STM32CubeMX】9,STM32之I2C,EEPROM

上一篇:STM32学习记录之cubemx配置IIC+逻辑分析仪的学习
下一篇: STM32CubeMX GPIO模拟I2C读写M24C64

推荐阅读最新更新时间:2024-11-08 21:35

stm32 usb和安卓手机的通讯过程
前段时间公司开发了一个安卓外设,主要是用某宝淘来的demo 在stm32F103的usb功能来和安卓设备的usb来通讯 叙述之前先来一个整体的框图吧: 需要准备的设备有: ①.安卓手机或者安卓pad,(手机必须支持otg功能,否则就得用host功能了) ②.otg转接线或者转接头 ③.安卓数据线(一定要是能通讯数据的线缆,有些山寨的这个线只有2根线,没有数据线) ④.带有usb功能的单片机(这个usb需要能支持用户自行定义) 接下来就开始捣鼓stm32单片机的程序了,下面是usb功能的代码: usb功能看了一下主要是借助hid的标准协议上衍生而来的一个usb标准设备 /********************
[单片机]
<font color='red'>stm32</font> usb和安卓手机的通讯过程
STM32基础学习】八种GPIO模式总结
八种IO模式再现 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 解释速查 浮空输入_IN_FLOATING 浮空输入,通常用作KEY识别 带上拉输入_IPU IO内部上拉电阻输入,默认电平是高 带下拉输入_IPD IO内部下拉电阻输入,默认电平是低。 模拟输入_AIN
[单片机]
STM32 中断使用
STM32中断有时候用多了容易乱,特此记录一下,因为之前一直是M3 M0交叉用,固件库有些区别容易弄混,这里说一下M3外部中断的配置 步骤: 1.将对应的IO配置为输入 2.将IO对应的中断的优先等级用NVIC配置好 3.设置好对应IO的中断模式和触发方式 4.将IO所属的中断线设为中断输入源 1---------以PB5为例子 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(G
[单片机]
STM32使用FSMC控制sram例程
一、基本概念 1. 与非总线复用的16位SRAM接口 FSMC配置 SRAM存储器和NOR闪存存储器共用相同的FSMC存储块,所用的协议依不同的存储器类型而有所不同。 控制SRAM存储器,FSMC应该具有下述功能: ● 使用或禁止地址/数据总线的复用功能。 ● 选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 ● 定义外部存储器的数据总线宽度:8或16位。 ● 使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 正如配置NOR闪存存储器一样,用户必须按照SRAM存储器的数据手册给出的时序数据,计算和设置下列参数: ● ADDSET:地址建立时间 ● ADDHOLD:地址保持时间 ● DATAST:数据建
[单片机]
STM32学习记录20 FFT
前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT。在网上找了很多这方面的资料做实验并进行比较,最终选择了使用STM32提供的DSP库这种方法。 本文将以一个实例来介绍如何使用STM32提供的DSP库函数进行FFT。 1.FFT运算效率   使用STM32官方提供的DSP库进行FFT,虽然在使用上有些不灵活(因为它是基4的FFT,所以FFT的点数必须是4^n),但其执行效率确实非常高效,看图1所示的FFT运算效率测试数据便可见一斑。该数据来自STM32 DSP库使用文档。 图1 FFT运算效率测试数据   由图
[单片机]
<font color='red'>STM32</font>学习记录20 FFT
STM32F407和STM32F051主从I2C通信方法
简介:本文章主要介绍STM32F407和STM32F051主从I2C通信方法。 M4作为主机: int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); /* USER CODE BEG
[单片机]
GPIO实现I2C从机的设计
在本阶段的工作中,需要实现一个由GPIO模拟的I2C从机工程设计,以前只使用GPIO模拟I2C设计过主机,对于从机的设计,还是首次。下面就讲本次工作中从机设计思想做详细记录。 I2C的简单总结 对于I2C信号,需要有START,STOP,ACK,NACK,以及接收DATA。接收DATA是在SCL的低电平可能发生跳变,START和STOP是在高电平跳变。当SCL保持高电平的时候,SDA从H跳变到L,即为START;当SCL保持高电平的时候,SDA从L跳变到H,即为STOP。 START信号: 图1 STOP信号 图2 ACK信号 图3 主机下发地址以及读写信号 图4 程序设计以及分析 //为所使用的硬件平台的寄存器
[单片机]
STM32系列是大端还是小端?
ARM的手册上有关于大小端的描述,如下: The processor can access data words in memory in little-endian format or big-endian format. It always accesses code in little-endian format. Note: Little-endian is the default memory format for ARM processors. STM32是固定配置为小端的 The bytes are coded in memory in Little Endian format. The lowest number
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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