【蓝桥杯嵌入式拓展板】—I2C读写EEPROM详解

   日期:2021-02-28     浏览:167    评论:0    
核心提示:关于蓝桥杯嵌入式板子的I2C,如果你以前没有接触过I2C通信。重点:懂得通过电路图判断出I2C设备的地址会看I2C读写时序图。底层驱动,考试会给你当然,如果你真的是0基础,还有救!《【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC》这里是我以前写的,硬件实现I2C的一个文章,文章末尾有软件实现I2C的方法,硬件都会了,软件就很简单了传送门:https://blog.csdn.net/qq_45689790/article/detai

关于蓝桥杯嵌入式板子的I2C,如果你以前没有接触过I2C通信。
重点:

  1. 懂得通过电路图判断出I2C设备的地址
  2. 会看I2C读写时序图。
  3. 底层驱动,考试会给你

当然,如果你真的是0基础,还有救!

《【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC》这里是我以前写的,硬件实现I2C的一个文章,文章末尾有软件实现I2C的方法,硬件都会了,软件就很简单了

传送门:https://blog.csdn.net/qq_45689790/article/details/113725196?spm=1001.2014.3001.5501

不得不说,官方给了你I2C的底层驱动,写读取函数,参考手册,看时序图,真的是太简单了。

一、硬件原理图


通过原理图,判断 [SCL->PB6][PB7->SDA]

板载EEPROM 为2k ,E0~E2接地均为0,因此设备地址 0xA0,当然 读写标志位也是跟在设备地址的后面

  1. 读命令:设备地址 0xA0 + 1 = 0xA1
  2. 写命令:设备地址 0xA0 + 0 = 0xA0

这点在编程的时候会有所体现,想知道具体细节,翻到上面,找传送门。

二、实现读写函数
1、void Byte_Write(uint8_t Write_addr,uint8_t data)

void Byte_Write(uint8_t Write_addr,uint8_t data)
{ 
	I2CStart(); 				//1、发送开始信号
	I2CSendByte(0xA0);			//2、发送设备地址 写命令 0xA0 + 0 = 0xA0
	I2CWaitAck();				//3、等待响应
	I2CSendByte(Write_addr);	//4、等待响应 发送要写入EEPROM的地址
	I2CWaitAck();				//5、等待响应
	I2CSendByte(data);			//6、发送要写入的地址
	I2CWaitAck();				//7、等待响应
	I2CStop();					//8、发送停止信号
}

2、uint8_t Byte_Read(uint8_t Read_Addr)

我好像标错了,详见代码备注

uint8_t Byte_Read(uint8_t Read_Addr)
{ 
	uint8_t data = 0;
	I2CStart();						//1、发送开始信号 
	I2CSendByte(0xA0);				//2、发送设备地址 先写操作,0xA0 + 0 = 0xA0
	I2CWaitAck();					//3、等待响应 
	I2CSendByte(Read_Addr);			//4、写入要读的地址,告诉EEPROM等下需要返回哪个值
	I2CWaitAck();					//5、等待响应
	
	I2CStart();						//6、发送开始信号,接受EEPROM返回的数据
	I2CSendByte(0xa1);				//7、发送设备地址,读操作 0xA0 + 1 =0xA1
	I2CWaitAck();					//8、等待响应
	data = I2CReceiveByte();		//9、读出数据
	I2CSendNotAck();				//10、发送非应答信号,准备停止
	I2CStop();						//11、停止信号
	
	return data;
}

3Buffer_Write(uint8_t *_pWriteBuf ,uint8_t Write_Addr,uint8_t Write_Num)

void Buffer_Write(uint8_t *_pWriteBuf,uint8_t Write_Addr,uint8_t Write_Num)
{ 
//最多连续写8个 注意地址对齐
	uint8_t i ;
	
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(Write_Addr);
	I2CWaitAck();
	
	for(i = 0;i < Write_Num;i++)
	{ 
		I2CSendByte(_pWriteBuf[i]);
		I2CWaitAck();
	}
	I2CStop();
}

4、void Buffer_Read(uint8_t *_pReadBuf,uint8_t Read_Addr,uint8_t Read_Num)

自己写把,尝试一下


有问题,可以留言

欢迎交流探讨

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服