芯片stm32f103c8t6
.h文件
#ifndef _AT24C02_H
#define _AT24C02_H
//AT24C02_ADDR = 0xA0
void AT24C02_init(void);
char AT24C02_ReadByte(unsigned char AT24C02_ADDR,unsigned char BYTE_ADDR);
unsigned char AT24C02_WirteByte(unsigned char AT24C02_ADDR,unsigned char BYTE_ADDR,char Byte);
#endif
.c文件
#include "stm32f10x.h"
#include "MyI2C.h"
#include "Delay.h"
/**
* 如果程序没有初始化过I2C,则需要初始化一次I2C通信协议
* @param 无
* @retval 无
*/
void AT24C02_init(void)
{
MyI2C_Init();
}
/**
* AT24C02芯片读取数据
* @param AT24C02_ADDR:芯片地址,BYTE_ADDR:数据地址
* @retval recByte
* @note recByte=0xFF(-1):读取失败,recByte范围:0-254
*/
char AT24C02_ReadByte(unsigned char AT24C02_ADDR,unsigned char BYTE_ADDR)
{
char recByte = 0xFF;//-1
MyI2C_Start();
MyI2C_SendByte(AT24C02_ADDR);
if(MyI2C_Receive_ACK() == 1)
{
MyI2C_Stop();
}
MyI2C_SendByte(BYTE_ADDR);
if(MyI2C_Receive_ACK() == 1)
{
MyI2C_Stop();
}
MyI2C_Start();
MyI2C_SendByte(AT24C02_ADDR | 0x01);
if(MyI2C_Receive_ACK() == 1)
{
MyI2C_Stop();
}
recByte = MyI2C_ReadByte();
MyI2C_Send_ACK(1);
MyI2C_Stop();
return recByte;
}
/**
* AT24C02芯片写入数据
* @param AT24C02_ADDR:芯片地址,BYTE_ADDR:数据地址,Byte:写入的数据
* @retval 1:写入成功,0:写入失败
*/
unsigned char AT24C02_WirteByte(unsigned char AT24C02_ADDR,unsigned char BYTE_ADDR,char Byte)
{
if(BYTE_ADDR > 255)//AT24C02最大地址
return 0;
MyI2C_Start();
MyI2C_SendByte(AT24C02_ADDR);
if(MyI2C_Receive_ACK() == 1)
{
MyI2C_Stop();
return 0;
}
MyI2C_SendByte(BYTE_ADDR);
if(MyI2C_Receive_ACK() == 1)
{
MyI2C_Stop();
return 0;
}
MyI2C_SendByte(Byte);
if(MyI2C_Receive_ACK() == 1)
{
MyI2C_Stop();
return 0;
}
MyI2C_Stop();
Delay_ms(5);//等待AT24C02将数据从缓冲区写入存储区完成,连续写入时必要操作
return 1;
}
note