今天学习一下IIC的功能,通过IIC操作外部24C02。
第一步:引脚配置:

第二步:选择I2C1的模式为I2C

第三步:配置I2C的具体参数

第四步,完成程序编写:
24C02驱动函数如下:
#include "24C02.h"
 #include "i2c.h"
 uint8_t T_buf[EE_SIZE]; /* 数据测试用缓冲区 16KB */
 uint8_t R_buf[EE_SIZE];
 /*
 ********************************************************************************
 * 函 数 名: ee_CheckOk
 * 功能说明: 判断EERPOM是否正常
 * 形  参: 无
 * 返 回 值: 0 表示正常, 1 表示不正常
 ********************************************************************************
 */
 uint8_t EE_CheckOk(void)
 {
 uint8_t i;
 i=HAL_I2C_IsDeviceReady(&hi2c1, EE_DEV_ADDR ,1, 100);
 }
 /*
 ********************************************************************************
 * 函 数 名: ee_Write
 * 功能说明: 向24C02写入数据
 * 形  参: MemAddress: 要写入的EEPROM的地址
 * Size: 要写入的数据数量
 * 返 回 值: 0 表示正常, 1 表示不正常
 ********************************************************************************
 */
 void ee_Write(uint16_t MemAddress, uint16_t Size)
 {
 uint16_t i;
 for (i=0; i<EE_SIZE; i++)
 {
 T_buf[i]=i;
 }
 //HAL_I2C_Mem_Write_DMA(&hi2c1, EE_DEV_ADDR, MemAddress, I2C_MEMADD_SIZE_8BIT,T_buf,Size);
 HAL_I2C_Mem_Write(&hi2c1,EE_DEV_ADDR,0,I2C_MEMADD_SIZE_8BIT,T_buf,Size,100);
 }
 /*
 ********************************************************************************
 * 函 数 名: ee_Read
 * 功能说明: 从24C02读出数据
 * 形  参: MemAddress: 开始读EEPROM的地址
 * Size: 要读出的数据数量
 * 返 回 值: 0 表示正常, 1 表示不正常
 ********************************************************************************
 */
 void ee_Read(uint16_t MemAddress, uint16_t Size) 
 {
 //HAL_I2C_Mem_Read(&hi2c1, EE_DEV_ADDR, MemAddress, I2C_MEMADD_SIZE_8BIT,R_buf,Size,100);
 HAL_I2C_Mem_Read(&hi2c1,EE_DEV_ADDR,0,I2C_MEMADD_SIZE_8BIT,aRxBuffer,100,100);
 }
 /*
 ********************************************************************************
 * 函 数 名: ee_Erase
 * 功能说明: 擦除24C02的数据
 * 形  参: MemAddress: 要写入的EEPROM的地址
 * Size: 要写入的数据数量
 * 返 回 值: 0 表示正常, 1 表示不正常
 ********************************************************************************
 */
 void ee_Erase(uint16_t MemAddress, uint16_t Size)
 {
 uint16_t i;
 for (i=0; i<EE_SIZE; i++)
 {
 T_buf[i]=0xFF;
 }
 HAL_I2C_Mem_Write_DMA(&hi2c1, EE_DEV_ADDR, MemAddress, I2C_MEMADD_SIZE_8BIT,T_buf,Size);
 }
 主函数main.c函数如下:
/* Includes ------------------------------------------------------------------*/
 #include "stm32f0xx_hal.h"
 #include "dma.h"
 #include "i2c.h"
 #include "usart.h"
 #include "gpio.h"
 /* USER CODE BEGIN Includes */
 /* USER CODE END Includes */
 /* Private variables ---------------------------------------------------------*/
 /* USER CODE BEGIN PV */
 /* Private variables ---------------------------------------------------------*/
 /* USER CODE END PV */
 /* Private function prototypes -----------------------------------------------*/
 void SystemClock_Config(void);
 /* USER CODE BEGIN PFP */
 /* Private function prototypes -----------------------------------------------*/
 /* USER CODE END PFP */
 /* USER CODE BEGIN 0 */
 uint8_t TxData[]="没有检测到EEPROM!\r\n";
 uint8_t RxData[8];
 /* USER CODE END 0 */
 #define EEPROM_ADDRESS 0xA0
 /* USER CODE BEGIN PV */
 uint8_t aTxBuffer[] = "321asdfghjkl";
 uint8_t aRxBuffer[100];
 int main(void)
 {
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration----------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
 HAL_UART_Receive_DMA(&huart1, RxData, 8); /* 这句要在while循环中 */
 /*if (EE_CheckOk()) // 如果没有检测到24C02,每隔2秒检测一次 //
 {
 HAL_UART_Transmit_DMA(&huart1, TxData, sizeof(TxData));
 HAL_Delay(2000);
 }*/ 
  }
  /* USER CODE END 3 */
 }