1.软件准备
(1)编程平台:Keil5
(2)CubeMX
(3)XCOM(串口调试助手)
2.硬件准备
(1)AT24C02模块
(2)F1的板子,本例使用经典F103C8T6
(3)ST-link 下载器
(4)USB-TTL模块
(5)杜邦线若干
3.模块资料
(1)模块简介:
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
(2)模块参数:
●宽范围的工作电压1.8V~5.5V
●2线串行接口,完全兼容I2C总线
●内部写周期(最大5 ms)
●可按字节写
●页写:8字节页(24C02)
●擦写寿命:100万次、数据保持时间:100年
更多详细信息参考:AT24CXX手册
4.CubeMX配置
(1)芯片选择
(2)配置RCC、SYS、时钟树
配置RCC
配置SYS
配置时钟树
(3)配置串口1
(4)配置IIC
(5)设置路径、生成代码工程
5、Keil5代码
(1)勾选Use MicroLIB
(2) usart.c函数添加
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
/*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END 1 */
(3)main函数
#include "stdio.h"
#define ADDR_24LCxx_Write 0xA0 //写24C02的时候,从器件地址为10100000(0xA0)
#define ADDR_24LCxx_Read 0xA1 //读24C02的时候,从器件地址为10100001(0xA1)
#define BufferSize 256 //缓存数组大小
#define Data_Size 8 //每次写入8个字节(64bit)
#define WriteRead_Num BufferSize/Data_Size //需要重复写入的次数
uint8_t WriteBuffer[BufferSize],ReadBuffer[BufferSize]; //写缓存、读缓存
uint16_t i,num;
//--------------------------------------------------------------------
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
for(uint16_t i=0; i<256; i++)
WriteBuffer[i]=i; //初始化写数组,写入0-255,共256个数据
for (num=0; num<WriteRead_Num; num++)
{
//参数分别为:IIC号、设备地址、从机寄存器地址、从机寄存器地址字节长度(8/16)、发送的数据的起始地址、传输数据的大小、操作超时时间
if(HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, Data_Size*num, I2C_MEMADD_SIZE_8BIT,WriteBuffer+Data_Size*num,8, 1000) == HAL_OK)
HAL_Delay(5); //每次写入需要间隔至少5ms
else
break; //写入失败跳出for循环
}
if(num==WriteRead_Num) //数据如果全部写入,num会等于WriteRead_Num
{
printf("---------------写入成功---------------\r\n");
//参数分别为:IIC号、读的地址、从机寄存器地址、从机寄存器地址字节长度(8/16)、数据缓存区、读出的字节数、操作超时时间
HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 1000);
for(i=0; i<256; i++)
printf("0x%02x ",ReadBuffer[i]); //十六进制串口打印
}
else
printf("---------------写入失败---------------\r\n");
while (1)
{
}
}
6.接线、效果
STM32 -> PB6 —— 模块SCL
STM32 -> PB7 —— 模块SDA