#include "i2c.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
I2C_HandleTypeDef hi2c1;
/* I2C1 init function */
void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
/* USER CODE END I2C1_Init 2 */
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(i2cHandle->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* I2C1 clock enable */
__HAL_RCC_I2C1_CLK_ENABLE();
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}
}
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{
if(i2cHandle->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspDeInit 0 */
/* USER CODE END I2C1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_I2C1_CLK_DISABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(I2C1_SCL_GPIO_Port, I2C1_SCL_Pin);
HAL_GPIO_DeInit(I2C1_SDA_GPIO_Port, I2C1_SDA_Pin);
/* USER CODE BEGIN I2C1_MspDeInit 1 */
/* USER CODE END I2C1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
ErrorCode eeprom_busy(void)
{
HAL_StatusTypeDef ret;
ret = HAL_I2C_IsDeviceReady(&hi2c1,SLAVER_ADDR,1000,5000);
if(ret != HAL_OK)
return ERR_I2C1DEVBUSY;
else
return ERR_OK;
}
ErrorCode eeprom_pagewrite(uint16_t memaddr,uint8_t *pdata)
{ HAL_StatusTypeDef ret;
if(memaddr%8 != 0)
return ERR_INVALID_PARAM;
ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pdata,8,5000);
if(ret != HAL_OK)
return ERR_I2C1PAGEWRITEFAIL;
else
return ERR_OK;
}
ErrorCode eeprom_write(uint16_t memaddr,uint8_t *pdata,uint16_t len)
{
HAL_StatusTypeDef ret;
uint16_t pagenum,tail,pre;
uint8_t *pback = pdata;
if(memaddr>256 || len>256)
return ERR_INVALID_PARAM;
if(memaddr%8 ==0)
{
pagenum = len/8;
tail = len%8;
while(pagenum--)
{
if(ERR_OK != eeprom_pagewrite(memaddr,pback))
return ERR_I2C1WRITEFAIL;
eeprom_busy();
memaddr+=8;
pback+=8;
}
if(tail)
{
ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,tail,5000);
if(HAL_OK != ret)
return ERR_I2C1WRITEFAIL;
eeprom_busy();
}
}
else
{
pre = 8-memaddr%8;
pagenum = (len-pre)/8;
if(!pagenum)
{
ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,pre,5000);
if(HAL_OK != ret)
return ERR_I2C1WRITEFAIL;
eeprom_busy();
memaddr+=pre;
pback+=pre;
if(len>pre)
{
ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,len-pre,5000);
if(HAL_OK != ret)
return ERR_I2C1WRITEFAIL;
eeprom_busy();
}
}
else
{
ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,pre,5000);
if(HAL_OK != ret)
return ERR_I2C1WRITEFAIL;
eeprom_busy();
memaddr+=pre;
pback+=pre;
tail = (len-pre)%8;
while(pagenum--)
{
if(ERR_OK != eeprom_pagewrite(memaddr,pback))
return ERR_I2C1WRITEFAIL;
eeprom_busy();
memaddr+=8;
pback+=8;
}
if(tail)
{
ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,tail,5000);
if(HAL_OK != ret)
return ERR_I2C1WRITEFAIL;
eeprom_busy();
}
}
}
return ERR_OK;
}
ErrorCode eeprom_read(uint16_t memaddr,uint8_t *buff,uint16_t len)
{
HAL_StatusTypeDef ret;
if(len > 256 || memaddr > 256)
return ERR_INVALID_PARAM;
if(256-memaddr < len)
len = 256-memaddr;
ret = HAL_I2C_Mem_Read(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,buff,len,1000);
if(ret != HAL_OK)
return ERR_I2C1READFAIL;
else
return ERR_OK;
}
/* USER CODE END 1 */