IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 蓝桥杯嵌入式快速通关篇,IIC通讯及EEPROM -> 正文阅读

[嵌入式]蓝桥杯嵌入式快速通关篇,IIC通讯及EEPROM

目录

基本部分

IIC及EEPROM在蓝桥杯中的考法

举例:
第九届省赛


第七届省赛


第六届省赛
在ct1117e上的EEPROM的通常使用方法就如上图所示 扩展板上还有三轴加速度计使用iic通讯,这里我们稍微提一下,其使用的通讯方式还是iic通讯。只不过使用的地址和要读取的寄存器有所不同(使用扩展板时,IIC引脚也要相应改变。

IIC的基本使用方法

在赛点资源包中是由iic的驱动文件的,省赛的一般在如下路径

赛点资源数据包_嵌入式_2019\3-底层驱动代码参考\i2c.c

使用时将i2c.h,和i2c.c两个文件复制到工程里,并在i2c.c文件末尾写上自己的读写函数,代码如下:

void i2c_write(u8 add ,u8 reg ,u8 data){
	I2CStart();
	
	I2CSendByte(add);
	I2CWaitAck();
	
	I2CSendByte(reg);
	I2CWaitAck();
	
	I2CSendByte(data);
	I2CWaitAck();
	
	I2CStop();
	
}

u8 i2c_read(u8 add ,u8 reg){
	u8 data ;
	I2CStart();
	I2CSendByte(add);
	I2CWaitAck();
	
	I2CSendByte(reg);
	I2CWaitAck();
	I2CStart();
	I2CSendByte(add+1);
	I2CWaitAck();
	data =I2CReceiveByte();
	I2CWaitAck();

	I2CStop();
	return data;
	
	
}
	

第一个函数void i2c_write(u8 add ,u8 reg ,u8 data);
是iic通讯的写函数,第一个 add是设备的地址,如0xa0是EEPROM的地址,0x38 是扩展板上的三轴加速度计的通讯地址。
第二个形参是寄存器的地址,需要注意的是AT24C02的地址是从0x00~0xff,如果超出该地址值会出现错误。地址和写入或读取的数据的类型都是无符号字符型,其他类型的数据有可能出现错误。就是说,但个地址存入读出的值不会超过255,即存取的的数据范围是0 ~255,那我们如何存入更大范围的数据呢,这个我在后面会介绍。
第二个函数是
u8 i2c_read(u8 add ,u8 reg)
在指定的从机的指定第地址中读取一个字节数据,add是从机地址,reg是寄存器地址。
以上代码能理解就结合文档中的时序图理解,不好理解的话直接背下来也是可以的,自己多敲几遍就好了,关键要熟练。
为了帮助理解,可以参考这篇文章
iic的读取时序问题

代码需要注意的点(出现问题也可依次检查)

读取的操作结束后,都建议延迟几毫秒,实测如果不延迟数据极有可能会出错,延迟操作可以加到函数末尾,也可在函数调用后。

调用函数之前,要先使用i2c.c文件中已有的函数i2c_init()来初始化iic要使用到的时钟,引脚等。

读写函数并不能直接存取超过范围的数,如果存入的数不在0到255之间,肯定会出错,地址也一样,要注意范围。

应用部分

简单应用

存取标志位,阈值等:

u8 flag=0;//也可以是0-255的数,不能超范围
i2c_write(0xa0,0,flag);
//0xa0 是从机的通讯地址,0 是寄存器的地址,这里取0 ~0xff的范围都可以
//读取时
flag=i2c_write(0xa0,0,flag);

进阶应用

存取更大的数,比如无符号16进制数,范围是0-65535

u16 data;
u8 data_h,data_l;
data_h=(data&0xff00)>>8;
data_l=data&0x00ff;
i2c_write(0xa0,0,data_h);
Delay_Ms(5);
i2c_write(0xa0,1,data_l);
Delay_Ms(5);
//即分别取出数据的高八位和低八位,,分别存入两个地址。
//读取
data_h=i2c_read(0xa0,0);
Delay_Ms(5);
data_l=i2c_reaad(0xa0,1);
Delay_Ms(5);
data=((u16)data_h<<8)|data_l;

实际上,更大的数,或者浮点数都可以用类似的方法储存,只是就更为繁琐了,下面给出一种更为通用的方法。

存取结构体,在结构体中就可以放各种类型的数据了,不管是多大的数,是整型,浮点,还是数组,都可以放到一起,具体代码如下:

//先定义两个函数,来存取数组
void writebuffer(u8 *buffer ,int len){
	int i=0 ;
	for(i=0;i<len;i++){//用循环将数组传入,读也一样,
		i2c_write(0xa0,i,buffer[i]);
		Delay_Ms(5);
	}

}
void readbuffer(u8 *buffer ,int len){
	int i=0;
	for(i=0;i<len;i++){
		buffer[i]=i2c_read(0xa0,i);
		Delay_Ms(5);
	}
}

//要存储的结构体
typedef struct{
	u8 data1;
	int data2;
	float data3;
}Data;

Data data_tosave={0,-1,2.2};
u8 length=sizeof(Data);
u8 buffer[length];
memcpy(buffer,&data_tosave,length)//将结构体的数据拷贝到buffer中
writebuffer(buffer,length);//保存数据
readbuffer(buffer,length);//读取数据

其关键思想是将结构体的数据拷贝到一个数组中,再依次存储和读去,当然,代码量较大,没有必要还是尽量不要使用。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:52:33  更:2022-02-07 13:55:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:24:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码