STM32使用IIC拓展EEPROM(AT24C02)

STM32使用IIC拓展EEPROM(AT24C02)

1. IIC的使用

  1. 时序图:
    在这里插入图片描述
    在这里插入图片描述
  2. 起始操作
    从上面的时序图可以得出,IIC协议的开始标志为:在SCL电平时将SDA
    对应代码:
void IIC_Start()
{
	SDA_OUT();
	IIC_SDA=1; IIC_SCL=1; 
	delay_us(4);
	IIC_SDA=0;        //开始信号
	delay_us(4);
	IIC_SCL=0;        //准备发送信号或者接收数据
}
  1. 终止操作
    SCL电平时将 SDA

对应代码:

void IIC_Stop()
{
	SDA_OUT();
	IIC_SCL=0; IIC_SDA=0;
	delay_us(4);
	IIC_SCL=1;
	IIC_SDA=1;        //结束信号
	delay_us(4);
}
  1. 发送应答
    当发送器发送完一个字节的数据后,由接收器对发送器发送的数据进行反馈. 当接收器的反馈为低电平时表示 成功接受, 当接收器的反馈为 高电平时表示 接收没有成功.

代码:

void IIC_Ack()			//产生ACK应答
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}

void IIC_NAck()			//不产生ACK应答
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
  1. 等待应答
    当发送器发送完一个字节的数据后,对接收器的反馈进行判定.根据SDA线进行判定

​ 代码:

u8 IIC_Wait_Ack()
{
	u8 ucErrTime=0;
	SDA_IN();				//设置为输入
	IIC_SDA=1; delay_us(1);
	IIC_SCL=1; delay_us(1);
	while (Read_SDA)
	{
		ucErrTime++;
		if (ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	IIC_SCL=0;           //时钟输出0
	return 0;
}
  1. 发送数据与读取数据
    在IIC收发数据时,在时钟信号为高电平期间,数据线的数据必须保持稳定, 只有在时钟线上的信号为低电平期间,数据线山的高电平或低电平状态才可以变化. 一般在SCL的上升沿到来之前就开始将SDA的数据进行变化,并在SDA下降沿之后SDA变化结束

发送代码:

void IIC_Send_Byte(u8 dat)		//IIC发送一个字节的数据
{
	u8 t;
	SDA_OUT();
	IIC_SCL=0;	//拉低时钟开始数据传输
	for (t=0;t<8;t++)
	{
		IIC_SDA=(dat&0x80)>>7;  //从数据的最高位开始传输
		dat<<=1;
		delay_us(2);
		IIC_SCL=1;
		delay_us(2);
		IIC_SCL=0;
		delay_us(2);
	}
}

读取代码:

u8 IIC_Read_Byte(unsigned char ack)	//IIC读取一个字节的数据并发送应答; ack=1时发送ACK, ack=0时发送NACK
{
	unsigned char i, receive=0;
	SDA_IN();	//设置为输入
	for (i=0;i<8;i++)
	{
		IIC_SCL=0;
		delay_us(2);
		IIC_SCL=1;
		receive<<=1;
		if (Read_SDA)
			receive++;
		delay_us(1);
	}
	if (!ack)
		IIC_NAck();
	else 
		IIC_Ack();
	return receive;
}

2. AT24C02的使用

原理图
在这里插入图片描述
首先将芯片按照此电路连接好

然后附上代码:

读操作:

u8 AT24CXX_ReadOneByte(u16 ReadAddr)		//从AT24CXX器件读出一个字节数据
{
	u8 temp;
	IIC_Start();
	IIC_Send_Byte(0xA0+((ReadAddr/256)<<1));	//发送器件地址0xA0,写数据
	IIC_Wait_Ack();
	IIC_Send_Byte(ReadAddr%256);	//发送低地址
	IIC_Wait_Ack();
	IIC_Start();
	IIC_Send_Byte(0xA1);			//进入接收模式
	IIC_Wait_Ack();
	temp = IIC_Read_Byte(0);
	IIC_Stop();				//停时
	return temp;
}

写操作:

void AT24CXX_WriteOneByte(u16 WriteAddr,u8 WriteData)			//向AT24CXX器件写一个字节数据
{
	IIC_Start();
	IIC_Send_Byte(0xA0+((WriteAddr/256)<<1));
	IIC_Wait_Ack();
	IIC_Send_Byte(WriteAddr%256);		//发送低地址
	IIC_Wait_Ack();
	IIC_Send_Byte(WriteData);
	IIC_Wait_Ack();
	IIC_Stop();
	delay_ms(10);
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用HAL库进行STM32IIC读写AT24C02时,你可以参考以下步骤: 1. 首先,你需要在你的工程中包含AT24CXX.c文件,并在代码中引用该文件。该文件中定义了一些常量和函数,用于初始化AT24CXX芯片、写入数据和读取数据等操作。 2. 在AT24CXX.c文件中,你可以看到定义了一些常量,如AT24C02的地址为255。这些常量可以根据你所使用的芯片型号进行修改。 3. 在AT24CXX.c文件中,还定义了一些函数,如AT24CXX_Init()用于初始化AT24CXX芯片,AT24CXX_Write()用于写入数据,AT24CXX_Read()用于读取数据,AT24CXX_Check()用于检查AT24CXX芯片是否正常工作。你可以根据需要调用这些函数来实现对AT24C02的读写操作。 4. 在配置STM32的引脚时,你需要将IIC的引脚与AT24C02芯片的引脚相连接。具体的引脚配置可以参考AT24CXX.c文件中的注释。 5. 在配置串口时,你可以选择使用串口进行数据查看,以便调试和验证读写操作的结果。 6. 最后,根据你的需求选择适当的时钟频率,生成Keil工程代码。 综上所述,你可以使用HAL库的函数和AT24CXX.c文件中定义的函数来实现对AT24C02芯片的读写操作。 #### 引用[.reference_title] - *1* *3* [STM32 (基于HAL库) 硬件IIC读写任意AT24CXX芯片](https://blog.csdn.net/weixin_56565733/article/details/124401443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32系列(HAL库)——F103C8T6通过IIC/I2C方式读写AT24C02—(EEPROM 存储模块)](https://blog.csdn.net/lwb450921/article/details/124394615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值