STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器

STM32-HAL库06-IIC驱动FM24CL16B非易失存储器

一、所用材料:

STM32VGT6自制控制板
STM32CUBEMX(HAL库软件)
MDK5

二、所学内容:

通过HAL库的硬件IIC对FM24CL16B存储器进行写与读取操作。

三、CUBEMX配置:

第一步:选取IIC1进行配置

第二步:配置SYS

第三步:配置RCC

第四步:配置时钟

第五步:文件配置

四、MDK5程序编写:

1.配置FM24CL16B.h文件

c 复制代码
#ifndef __FM24CL16_H
#define __FM24CL16_H	 

//========移植的时候,根据所选芯片引入相应的头文件==========在main.h里面查看
#include "stm32f4xx_hal.h"
#include "i2c.h"

#define FM_24LC16_Write 0xA0
#define FM_24LC16_Read  0xA1
#define BufferSize 2048

//电机参数内存分配
#define Rs_add	0
#define Rr_add	4


void FM24CL16B_Write_data(uint16_t add , uint8_t data);
uint8_t FM24CL16B_Read_data(uint16_t add);
void Parameter_Write (uint16_t para_add , float para_data);
float Parameter_Read (uint16_t para_add);

#endif

2.配置FM24CL16B.c文件

c 复制代码
#include "FM24CL16B.h"
#include "i2c.h"
#include "stdio.h"

/********************************************
函数名称:FM24CL16写数据
函数参数:add---写入数据的地址(0-2048)
		  data---写入的数据(0-256)
函数解析:向指定地址写入特定数据,并且在写入
		  后读取一次打印至串口
********************************************/
void FM24CL16B_Write_data(uint16_t add , uint8_t data)
{
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write, add, I2C_MEMADD_SIZE_8BIT,&data,1,0xff);
	HAL_Delay(5);//此处延时必加
	printf("\r\n EEPROM 24C02 Write Test OK \r\n");
	
	FM24CL16B_Read_data(add);
}
/********************************************
函数名称:FM24CL16读数据
函数参数:add---读数据的地址(0-2048)
函数解析:读取指定地址的数据并返回该数据
********************************************/
uint8_t FM24CL16B_Read_data(uint16_t add)
{
	uint8_t Read_data;
	HAL_I2C_Mem_Read(&hi2c1, FM_24LC16_Read, add, I2C_MEMADD_SIZE_8BIT,&Read_data,1, 0xff);
	printf("地址:%d   16进制:0x%02X   10进制:%d \r\n",add,Read_data,Read_data);
	return Read_data;
}
/********************************************
函数名称:浮点数参数写入
函数参数:para_add---写入参数的头地址
		  para_data-写入的参数浮点数值
函数解析:将浮点数参数值写入到指定的参数地址
********************************************/
void Parameter_Write (uint16_t para_add , float para_data)
{
	uint16_t zhengshu ;
	uint8_t zhengshu1 ;
	uint8_t zhengshu2 ;
	uint16_t xiaoshu ;
	uint8_t xiaoshu1 ;
	uint8_t xiaoshu2 ;
	
    zhengshu = (uint16_t)para_data;
    zhengshu1 = zhengshu/256;
    zhengshu2 = zhengshu%256;
    xiaoshu  = (para_data-zhengshu)*1000.0;
    xiaoshu1 = xiaoshu/256;
    xiaoshu2 = xiaoshu%256;
	
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add, I2C_MEMADD_SIZE_8BIT,&zhengshu1,1,0xff);
	HAL_Delay(5);//此处延时必加
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add+1, I2C_MEMADD_SIZE_8BIT,&zhengshu2,1,0xff);
	HAL_Delay(5);//此处延时必加
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add+2, I2C_MEMADD_SIZE_8BIT,&xiaoshu1,1,0xff);
	HAL_Delay(5);//此处延时必加
	HAL_I2C_Mem_Write(&hi2c1, FM_24LC16_Write,para_add+3, I2C_MEMADD_SIZE_8BIT,&xiaoshu2,1,0xff);
	HAL_Delay(5);//此处延时必加
	
	FM24CL16B_Read_data(para_add);
	FM24CL16B_Read_data(para_add+1);
	FM24CL16B_Read_data(para_add+2);
	FM24CL16B_Read_data(para_add+3);
}
/********************************************
函数名称:浮点数参数读取
函数参数:para_add---读取参数的头地址
函数解析:将浮点数参数值从内存中读出并返回
********************************************/
float Parameter_Read (uint16_t para_add)
{
	float para_data;
	uint8_t zhengshu1 ;
	uint8_t zhengshu2 ;
	uint8_t xiaoshu1 ;
	uint8_t xiaoshu2 ;
	
    zhengshu1 =FM24CL16B_Read_data(para_add);
	zhengshu2 =FM24CL16B_Read_data(para_add+1);
	xiaoshu1 = FM24CL16B_Read_data(para_add+2);
	xiaoshu2 = FM24CL16B_Read_data(para_add+3);
	para_data = zhengshu1*256+zhengshu2+(xiaoshu1*256+xiaoshu2)*0.001;
	printf("参数值为:%f",para_data);
	
	return para_data;
}

3.配置main.c文件

c 复制代码
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();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_TIM5_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  __HAL_TIM_CLEAR_IT(&htim5, TIM_IT_UPDATE);
  HAL_TIM_Base_Start_IT(&htim5);							
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE BEGIN 2 */
  Parameter_Write (Rr_add , 1458.0597);//写入Rr_add的参数值,并且会读取一次
  Parameter_Read (Rs_add);			   //读取Rs_add的参数值,此值之前已经写进去过了
  HAL_Delay(10000);
  /* USER CODE END 2 */

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

  /* USER CODE END 3 */
}

4.测试

相关推荐
智购科技自动售货机工厂12 分钟前
2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH
开发语言·数据库·单片机·嵌入式硬件·人机交互
jianqiang.xue34 分钟前
专栏简介:《嵌入式 AI 智能体设计实战》
人工智能·stm32·单片机·物联网·架构·esp32
铅笔小新z1 小时前
【stm32】I2C 通信协议
stm32·单片机·嵌入式硬件
一条破秋裤1 小时前
GPIO输入输出
单片机·嵌入式硬件
单片机仿真设计1 小时前
【proteus仿真】基于 STM32 单片机货架巡检机器人设计(仿真图+程序)
stm32·单片机·嵌入式硬件·机器人·proteus·毕设
虎王物联10 小时前
STM32 HAL库串口DMA空闲中断:高效接收不定长Modbus数据帧
stm32·单片机·嵌入式硬件·dma·modbus
自小吃多10 小时前
DXF文件导入与PCB板框定义笔记
笔记·嵌入式硬件
SUNNYSPY00110 小时前
AO4402-ASEMI便携设备电源开关AO4402
单片机
单片机仿真设计13 小时前
【proteus仿真】基于 STC89C52 单片机家用智能台灯设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
2601_9507906813 小时前
深圳国产单片机厂商怎么选?技术能力与服务能力检查表
单片机·嵌入式硬件·国产mcu·芯片厂商·深圳单片机·单片机选型