hal库i2c读写AT24C02

#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 */
posted @ 2025-12-20 13:29  程序员纽扣  阅读(1)  评论(0)    收藏  举报