STM32F407配置AT24C02
AT24C02使用I2C进行通信,相信大家对I2C通信都有所了解这里我就不在赘述了。
说一下AT24C02使用时的注意事项,
1.一定要在写数据完成后加一个5ms的延时,不能立刻进行数据的读取。
这一点在数据手册里也有说明 :如下图
废话不多说下面贴代码<#include “at24c02.h”
/********************************************
2021年8月12日,万千
QQ 1047342131:
*******************************************/
/**
- @brief AT24C02 写一个字节函数
- @note
- @param WordAdderess: 子地址 0——255
- @param data: 要写的数据
- @retval None
/
void AT24C02_WriteByte(uint8_t WordAdderess, uint8_t data)
{
I2C_Start();
I2C_SendByte(AT8266_Adderess); // 写地址
I2C_ReceiveAck();
I2C_SendByte(WordAdderess); // 写字节地址
I2C_ReceiveAck();
I2C_SendByte(data); // 写入的数据
I2C_ReceiveAck();
I2C_Stop();
Delayms(5); //这个延时是必须加的 AT24 系列系列芯片有一个写周期最大是5毫秒
}
/* - @brief 读指定AT24C02地址内存放的数据
- @note
- @param WordAdderess: 要读的数据地址
- @retval 返回数据
/
uint8_t AT24C02_ReadByte(uint8_t WordAdderess)
{
uint8_t data = 0;
I2C_Start();
I2C_SendByte(AT8266_Adderess); // 写地址
I2C_ReceiveAck();
I2C_SendByte(WordAdderess); // 字地址
I2C_ReceiveAck();
I2C_Start();
I2C_SendByte(AT8266_Adderess | 0x01); // 写地址
I2C_ReceiveAck();
data = I2C_ReceiveByte();
I2C_SendAck(0X01);
I2C_Stop();
return data;
}
/* - @brief 按页写数据 AT24C02 一页是八个字节
- @note
- @param WordAdderess: 要写的启示地址
- @param *data: 要写的数据 以数组的形式
- @retval None
/
void AT24C02_WritePage(uint8_t WordAdderess, uint8_t data)
{
I2C_Start();
I2C_SendByte(AT8266_Adderess); // 写地址
I2C_ReceiveAck();
I2C_SendByte(WordAdderess); // 写字节地址
I2C_ReceiveAck();
for (uint8_t i = 0; i < 8; i++)
{
I2C_SendByte(data[i]); // 写入的数据
I2C_ReceiveAck();
}
I2C_Stop();
Delayms(5); //这个延时是必须加的 AT24 系列系列芯片有一个写周期最大是5毫秒
}
/ - @brief 按顺序读一页
- @note
- @param WordAdderess: 读的起始地址
- @param *Rx_data: 存放数据的数组
- @retval None
*/
void AT24C02_ReadPage(uint8_t WordAdderess, uint8_t *Rx_data)
{
I2C_Start();
I2C_SendByte(AT8266_Adderess); // 写地址
I2C_ReceiveAck();
I2C_SendByte(WordAdderess); // 器件地址
I2C_ReceiveAck();
I2C_Start();
I2C_SendByte(AT8266_Adderess | 0x01); // 读地址
I2C_ReceiveAck();
Rx_data[0] = I2C_ReceiveByte();
I2C_SendAck(0X00);
for (uint8_t i = 1; i < 8; i++)
{
Rx_data[i] = I2C_ReceiveByte();
I2C_SendAck(0X00);
Delayms(100);
}
I2C_Stop();
}
完整代码链接:https://pan.baidu.com/s/1pZrVeXW-B-zOPk2GQOb2XQ
提取码:1111