今天学习一下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 */
}