AnsweredAssumed Answered

I2C EEPROM Memory accessing

Question asked by potdar.rohit on Mar 19, 2015
Latest reply on Apr 4, 2015 by liao.chengyi
Hello, I am using STM32F0 HAL Drivers to access external EEPROM 24C64 with STM32F030. The functions I am using are HAL_I2C_Mem_Write/Read but the communication is not always successful. Also it worked while using smd eeprom but while using dip IC it does not work. I have given the code below for reference.
Please let me know if I am missing something here.

/**
  ******************************************************************************
  * File Name          : I2C.c
  * Date               : 13/10/2014 19:30:51
  * Description        : This file provides code for the configuration
  *                      of the I2C instances.
  ******************************************************************************
  *
  * COPYRIGHT(c) 2014 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
 
/* Includes ------------------------------------------------------------------*/
#include "i2c.h"
#include "gpio.h"
 
/* USER CODE BEGIN 0 */
//uint8_t Data2Bwritten[8] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
/* USER CODE END 0 */
 
I2C_HandleTypeDef hi2c1;
 
/* I2C1 init function */
void MX_I2C1_Init(void)
{
 
  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0xF000F0FF;//0x30108AFF;//0x00101D7C 0x2000090E;
  hi2c1.Init.OwnAddress1 = 0;//(0xA0>>1);
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
  hi2c1.Init.OwnAddress2 = 0xFF;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;
  HAL_I2C_Init(&hi2c1);
 
  //I2C_TransferConfig();
    /**Configure Analogue filter
    */
  HAL_I2CEx_AnalogFilter_Config(&hi2c1, I2C_ANALOGFILTER_ENABLED);
 
}
 
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
 
  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==I2C1)
  {
    /* Peripheral clock enable */
    __I2C1_CLK_ENABLE();
   
    /**I2C1 GPIO Configuration   
    PB8     ------> I2C1_SCL
    PB9     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
  }
}
 
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{
 
  if(hi2c->Instance==I2C1)
  {
    /* Peripheral clock disable */
    __I2C1_CLK_DISABLE();
   
    /**I2C1 GPIO Configuration   
    PB8     ------> I2C1_SCL
    PB9     ------> I2C1_SDA
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8|GPIO_PIN_9);
 
  }
}
 
void EEMEM_Write(uint16_t memAdd, uint8_t * Data2Bwritten, uint16_t len)
{
    uint32_t Try_Count = EEPROM_ACESS_TRY_CNT;
     
    while(HAL_I2C_IsDeviceReady(&hi2c1, EEPROM_1_ADDRESS,EEPROM_ACESS_TRY_CNT,EEPROM_ACESS_TIMEOUT) != HAL_OK)
    {
    }
    while(HAL_I2C_Mem_Write(&hi2c1, EEPROM_1_ADDRESS, memAdd, 2, (uint8_t *)Data2Bwritten, len, EEPROM_ACESS_TIMEOUT) != HAL_OK)
    {
        if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
        {
          return;
        }
        else
        {
            if(Try_Count-- == 0)
                return;        
        }  
    }
}
 
void EEMEM_Read(uint16_t memAdd, uint8_t * Data2Bwritten, uint16_t len)
{
    uint32_t Try_Count = EEPROM_ACESS_TRY_CNT;
     
    while(HAL_I2C_IsDeviceReady(&hi2c1, EEPROM_1_ADDRESS,EEPROM_ACESS_TRY_CNT,EEPROM_ACESS_TIMEOUT) != HAL_OK)
    {
    }
    while(HAL_I2C_Mem_Read(&hi2c1, EEPROM_1_ADDRESS, memAdd, 2, (uint8_t *)Data2Bwritten, len, EEPROM_ACESS_TIMEOUT) != HAL_OK)
    {
        if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
        {
          return;
        }
        else
        {
            if(Try_Count-- == 0)
                return;        
        }      
    }
    return;
}
/**
  * @}
  */
 
/**
  * @}
  */
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Outcomes