Question
I2C EEPROM Memory accessing
Posted on March 19, 2015 at 13:09
Hello, I am using STM32F0 HAL Drivers to access external EEPROM 24C64 with STM32F The functions I am using areHAL_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****/
#i2c-writing-page-boundaries #i2c #hal-diver #stm32f0-i2c