261 lines
6.6 KiB
C
261 lines
6.6 KiB
C
|
/**
|
|||
|
******************************************************************************
|
|||
|
* @file bsp_i2c_ee.c
|
|||
|
* @author STMicroelectronics
|
|||
|
* @version V1.0
|
|||
|
* @date 2015-xx-xx
|
|||
|
* @brief i2c EEPROM(AT24C02)Ӧ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>bsp
|
|||
|
******************************************************************************
|
|||
|
* @attention
|
|||
|
*
|
|||
|
* ʵ<EFBFBD><EFBFBD>ƽ̨:<EFBFBD><EFBFBD><EFBFBD><EFBFBD> STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
|
|||
|
* <EFBFBD>Ա<EFBFBD> :http://firestm32.taobao.com
|
|||
|
*
|
|||
|
******************************************************************************
|
|||
|
*/
|
|||
|
|
|||
|
#include "./i2c/bsp_i2c_ee.h"
|
|||
|
#include "./usart/bsp_debug_usart.h"
|
|||
|
|
|||
|
|
|||
|
I2C_HandleTypeDef I2C_Handle;
|
|||
|
|
|||
|
/**
|
|||
|
* @brief I2C1 I/O<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static void I2C_GPIO_Config(void)
|
|||
|
{
|
|||
|
|
|||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|||
|
// RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
|
|||
|
|
|||
|
/*ʹ<><CAB9>I2Cʱ<43><CAB1>*/
|
|||
|
EEPROM_I2C_CLK_ENABLE();
|
|||
|
|
|||
|
/*ʹ<><CAB9>I2C<32><43>IO<49><4F>ʱ<EFBFBD><CAB1>*/
|
|||
|
EEPROM_I2C_SCL_GPIO_CLK_ENABLE();
|
|||
|
EEPROM_I2C_SDA_GPIO_CLK_ENABLE();
|
|||
|
|
|||
|
/*<2A><><EFBFBD><EFBFBD>I2C<32><43>SCL<43><4C>*/
|
|||
|
GPIO_InitStructure.Pin = EEPROM_I2C_SCL_PIN;
|
|||
|
GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
|
|||
|
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
|||
|
GPIO_InitStructure.Pull = GPIO_NOPULL;
|
|||
|
GPIO_InitStructure.Alternate = EEPROM_I2C_SCL_AF;
|
|||
|
HAL_GPIO_Init(EEPROM_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
|
|||
|
|
|||
|
/*<2A><><EFBFBD><EFBFBD>I2C<32><43>SDA<44><41>*/
|
|||
|
GPIO_InitStructure.Pin = EEPROM_I2C_SDA_PIN;
|
|||
|
HAL_GPIO_Init(EEPROM_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
|
|||
|
|
|||
|
/* Force the I2C peripheral clock reset */
|
|||
|
EEPROM_I2C_FORCE_RESET();
|
|||
|
|
|||
|
/* Release the I2C peripheral clock reset */
|
|||
|
EEPROM_I2C_RELEASE_RESET();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief I2C <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
static void I2C_Mode_Config(void)
|
|||
|
{
|
|||
|
/* I2C <20><><EFBFBD><EFBFBD> */
|
|||
|
I2C_Handle.Instance = EEPROM_I2C;
|
|||
|
I2C_Handle.Init.Timing = 0x40604E73;//100KHz
|
|||
|
I2C_Handle.Init.OwnAddress1 = 0;
|
|||
|
I2C_Handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
|||
|
I2C_Handle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
|||
|
I2C_Handle.Init.OwnAddress2 = 0;
|
|||
|
I2C_Handle.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
|
|||
|
I2C_Handle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
|
|||
|
I2C_Handle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
|
|||
|
|
|||
|
/* Init the I2C */
|
|||
|
HAL_I2C_Init(&I2C_Handle);
|
|||
|
|
|||
|
HAL_I2CEx_AnalogFilter_Config(&I2C_Handle, I2C_ANALOGFILTER_ENABLE);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief I2C <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(EEPROM)<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void I2C_EE_Init(void)
|
|||
|
{
|
|||
|
|
|||
|
I2C_GPIO_Config();
|
|||
|
I2C_Mode_Config();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>I2C EEPROM<EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @arg pBuffer:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @arg WriteAddr:д<EFBFBD><EFBFBD>ַ
|
|||
|
* @arg NumByteToWrite:д<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void I2C_EE_BufferWrite(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)
|
|||
|
{
|
|||
|
uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
|
|||
|
|
|||
|
Addr = WriteAddr % EEPROM_PAGESIZE;
|
|||
|
count = EEPROM_PAGESIZE - Addr;
|
|||
|
NumOfPage = NumByteToWrite / EEPROM_PAGESIZE;
|
|||
|
NumOfSingle = NumByteToWrite % EEPROM_PAGESIZE;
|
|||
|
|
|||
|
/* If WriteAddr is I2C_PageSize aligned */
|
|||
|
if(Addr == 0)
|
|||
|
{
|
|||
|
/* If NumByteToWrite < I2C_PageSize */
|
|||
|
if(NumOfPage == 0)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
|
|||
|
}
|
|||
|
/* If NumByteToWrite > I2C_PageSize */
|
|||
|
else
|
|||
|
{
|
|||
|
while(NumOfPage--)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, EEPROM_PAGESIZE);
|
|||
|
WriteAddr += EEPROM_PAGESIZE;
|
|||
|
pBuffer += EEPROM_PAGESIZE;
|
|||
|
}
|
|||
|
|
|||
|
if(NumOfSingle!=0)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/* If WriteAddr is not I2C_PageSize aligned */
|
|||
|
else
|
|||
|
{
|
|||
|
/* If NumByteToWrite < I2C_PageSize */
|
|||
|
if(NumOfPage== 0)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
|
|||
|
}
|
|||
|
/* If NumByteToWrite > I2C_PageSize */
|
|||
|
else
|
|||
|
{
|
|||
|
NumByteToWrite -= count;
|
|||
|
NumOfPage = NumByteToWrite / EEPROM_PAGESIZE;
|
|||
|
NumOfSingle = NumByteToWrite % EEPROM_PAGESIZE;
|
|||
|
|
|||
|
if(count != 0)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, count);
|
|||
|
WriteAddr += count;
|
|||
|
pBuffer += count;
|
|||
|
}
|
|||
|
|
|||
|
while(NumOfPage--)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, EEPROM_PAGESIZE);
|
|||
|
WriteAddr += EEPROM_PAGESIZE;
|
|||
|
pBuffer += EEPROM_PAGESIZE;
|
|||
|
}
|
|||
|
if(NumOfSingle != 0)
|
|||
|
{
|
|||
|
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief дһ<EFBFBD><EFBFBD><EFBFBD>ֽڵ<EFBFBD>I2C EEPROM<EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @arg pBuffer:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @arg WriteAddr:д<EFBFBD><EFBFBD>ַ
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
uint32_t I2C_EE_ByteWrite(uint8_t* pBuffer, uint8_t WriteAddr)
|
|||
|
{
|
|||
|
HAL_StatusTypeDef status = HAL_OK;
|
|||
|
|
|||
|
status = HAL_I2C_Mem_Write(&I2C_Handle, EEPROM_ADDRESS, (uint16_t)WriteAddr, I2C_MEMADD_SIZE_8BIT, pBuffer, 1, 100);
|
|||
|
|
|||
|
/* Check the communication status */
|
|||
|
if(status != HAL_OK)
|
|||
|
{
|
|||
|
/* Execute user timeout callback */
|
|||
|
//I2Cx_Error(Addr);
|
|||
|
}
|
|||
|
while (HAL_I2C_GetState(&I2C_Handle) != HAL_I2C_STATE_READY)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/* Check if the EEPROM is ready for a new operation */
|
|||
|
while (HAL_I2C_IsDeviceReady(&I2C_Handle, EEPROM_ADDRESS, EEPROM_MAX_TRIALS, I2Cx_TIMEOUT_MAX) == HAL_TIMEOUT);
|
|||
|
|
|||
|
/* Wait for the end of the transfer */
|
|||
|
while (HAL_I2C_GetState(&I2C_Handle) != HAL_I2C_STATE_READY)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>EEPROM<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>дѭ<EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><EFBFBD><EFBFBD>EEPROMҳ<EFBFBD>Ĵ<EFBFBD>С<EFBFBD><EFBFBD>AT24C02ÿҳ<EFBFBD><EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|||
|
* @param
|
|||
|
* @arg pBuffer:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @arg WriteAddr:д<EFBFBD><EFBFBD>ַ
|
|||
|
* @arg NumByteToWrite:д<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
uint32_t I2C_EE_PageWrite(uint8_t* pBuffer, uint8_t WriteAddr, uint8_t NumByteToWrite)
|
|||
|
{
|
|||
|
HAL_StatusTypeDef status = HAL_OK;
|
|||
|
/* Write EEPROM_PAGESIZE */
|
|||
|
status=HAL_I2C_Mem_Write(&I2C_Handle, EEPROM_ADDRESS,WriteAddr, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(pBuffer),NumByteToWrite, 100);
|
|||
|
|
|||
|
while (HAL_I2C_GetState(&I2C_Handle) != HAL_I2C_STATE_READY)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/* Check if the EEPROM is ready for a new operation */
|
|||
|
while (HAL_I2C_IsDeviceReady(&I2C_Handle, EEPROM_ADDRESS, EEPROM_MAX_TRIALS, I2Cx_TIMEOUT_MAX) == HAL_TIMEOUT);
|
|||
|
|
|||
|
/* Wait for the end of the transfer */
|
|||
|
while (HAL_I2C_GetState(&I2C_Handle) != HAL_I2C_STATE_READY)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>EEPROM<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param
|
|||
|
* @arg pBuffer:<EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD>EEPROM<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @arg WriteAddr:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>EEPROM<EFBFBD>ĵ<EFBFBD>ַ
|
|||
|
* @arg NumByteToWrite:Ҫ<EFBFBD><EFBFBD>EEPROM<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
uint32_t I2C_EE_BufferRead(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)
|
|||
|
{
|
|||
|
HAL_StatusTypeDef status = HAL_OK;
|
|||
|
|
|||
|
status=HAL_I2C_Mem_Read(&I2C_Handle,EEPROM_ADDRESS,ReadAddr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)pBuffer, NumByteToRead,1000);
|
|||
|
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*********************************************END OF FILE**********************/
|