IIC通信---EEPROM24C02---STMF4

IIC通信协议

IIC是同步半双工通信,一个数据线SDA和一个时钟SCL线,可以接受和发送数据。在CPU与被控IC之间、IC与IC之间进行双向传送。

空闲状态

IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

起始信号

当SCL为高期间,SDA由高到低的跳转

在这里插入图片描述
代码实现为:

//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出模式IIC_SDA=1;	  	  IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  
停止信号

当SCL为高期间,SDA由低到高的跳转
在这里插入图片描述
代码实现:

//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; delay_us(4);			IIC_SDA=1;//发送I2C总线结束信号				   	
}
应答信号

发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位,表示接收器已经成功接收到了该字节。应答信号为高电平时,规定为非应答位,一般表示接收器接收该字节没有成功。
对于反馈有效应答位ACK的要求是,接收器第9个时钟脉冲之前的低电平将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电压。
在这里插入图片描述
代码实现为:

//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}	
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  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;  
} 
数据的有效性

IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平才允许变化。即数据在SCL的上升沿到来之前就需要准备好,并且在下降沿到来之前必须保持稳定。
在这里插入图片描述

数据的传送

在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(同步控制),即在SCL串行时钟的配合下,在SDA上逐位串行传送每一位数据,数据位的传输是边沿触发。

发送一字节代码实现为:

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT(); 	    IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;txd<<=1; 	  delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;	delay_us(2);}	 
} 

数据传输之前IIC_SCL必须等于0,即时信号为低电平,然后准备一位数据,准备好之后,IIC_SCL=1,即时钟信号为高电平,数据就传输过去了
对于下面的代码:

IIC_SDA=(txd&0x80)>>7;
txd<<=1;

无符号类型左移丢弃最高位,低位补0,无符号类型右移丢弃最低位,低位补0,txd&0x80让txd第8位数据不变,其他为变成0(txd的值不受影响),左移7位,将最高位的数据赋值给IIC_SDA,当IIC_SCL=1时,第八位数据就传输过去了,txd<<=1让第7位数据变成第8位数据,下次循环就传输原来第7位数据了。循环8次将一字节数据传输完毕。

读取数据代码实现:

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入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();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

对于下面的代码:

 receive<<=1;if(READ_SDA)receive++;   

READ_SDA是获取SDA线上的电压,高电压说明说明传送过来的数据是1,receive++,下一次的时候, receive<<=1,receive先右移一位,然后接受数据,这样循环8次,就能保证接受的数据在原来的位置上了。

与EEPROM通信

硬件连接

在这里插入图片描述
EEPROM是一种掉电后数据不丢失的存储芯片,可以在电脑上或专用设备上擦除已有信息,重新编程。
24C02的总容量是256个字节,接口是IIC
在这里插入图片描述

模式选择

硬件连接中,A2=A1=A0=0(接地),所以,我们读数据时,只需写入0xA1,表示读模式,写数据时,只需写入0xA0,表示写模式
在这里插入图片描述

写时序

下面是写入一个字节数据的过程
在这里插入图片描述

  1. 一个IIC_START信号
  2. 写入模式,写入0xA0
  3. 等待一个ACK
  4. 发送写入数据的地址(0~255)
  5. 等待一个ACK
  6. 发送一个字节
  7. 等待一个ACK
  8. 一个STOP信号
    具体代码如下
//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{				   	  	    																 IIC_Start();  if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0);	    //发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);//发送高地址	  }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据 	 IIC_Wait_Ack();	   IIC_Send_Byte(WriteAddr%256);   //发送低地址IIC_Wait_Ack(); 	 										  		   IIC_Send_Byte(DataToWrite);     //发送字节							   IIC_Wait_Ack();  		    	   IIC_Stop();//产生一个停止条件 delay_ms(10);	 
}
读数据

下面是读一个字节数据的过程
在这里插入图片描述

  1. 产生一个START信号
  2. 写入0xA0,表示是写模式
  3. 等待一个ACK
  4. 写入读数据的地址
  5. 等待一个ACK
  6. 产生一个START信号
  7. 写入0xA1,表示是读模式
  8. 等待一个ACK
  9. 读取数据
    实现代码如下:
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{				  u8 temp=0;		  	    																 IIC_Start();  if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0);	   //发送写命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr>>8);//发送高地址	    }else 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实训09.08:简单的算法练习

/*final 关键字 修饰的变量值 后期不可更改 相当于定义常量常量 &#xff1a;不可更改*/final int a 10;//a 20; 报错的值不可更改&#xff01;/*输入函数* */System.out.println("请输入数字&#xff1a;");Scanner scanner new Scanner(System.in);int b…

让自己闪亮

转载于:https://www.cnblogs.com/Gigabyte/archive/2009/01/03/you_can_shine.html

Java中的wait()和sleep()方法之间的区别

Java中的wait()和sleep()方法 (wait() and sleep() methods in Java) First, we will see how wait() method differs from sleep() method in Java? 首先&#xff0c;我们将看到wait()方法与Java中的sleep()方法有何不同&#xff1f; wait()方法 (wait() Method) This metho…

离线使用iPhone SDK文档的方法

在使用Xcode进行iPhone编程时&#xff0c;有时需要参考iPhone SDK的文档&#xff0c;不过每次ControlClick后&#xff0c;Xcode都会试图连接Internet&#xff0c;进行在线读取。有什么方法能够把资料下载到硬盘上进行离线阅读吗&#xff1f; 答案是肯定的。首先去Xcode的Prefer…

远程连接sql server 2000服务器的解决方案

远程连接sql server 2000服务器的解决方案2007-04-07 11:29远程连接sql server 2000服务器的解决方案   一 看ping 服务器IP能否ping通。   这个实际上是看和远程sql server 2000服务器的物理连接是否存在。如果不行&#xff0c;请检查网络&#xff0c;查看配置&#xff0c…

实训09.10:HTML简单表格设计

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>燕雨简历</title></head><body><table border"" cellspacing"" cellpadding"" width"400px" height"6…

LCD显示实验----STM32f4--HAL

步骤 LCD初始化 LCD_Init(); //LCD初始化此函数在lcd.c文件里面 2. 设置LCD背景颜色 LCD_Clear(WHITE);此函数在lcd.c文件里面 3. 设置字体颜色 POINT_COLORRED; 写入要显示的字体 LCD_ShowString(10,80,240,24,24,"LTDC TEST");LCD_ShowSt…

JavaScript | 使用提示从用户输入值

Example 1) Input name and print 示例1)输入名称和打印 Code (JS & HTML): 代码(JS和HTML)&#xff1a; <!DOCTYPE html><HTML><HEAD><SCRIPT>var name prompt("Enter Your name:");var msg "Welcome "name;//alert(msg)…

一个游戏程序员的学习资料 (zz)

一个游戏程序员的学习资料//z 2012-4-19 14:39:51 PM IS2120CSDN想起写这篇文章是在看侯杰先生的《深入浅出MFC》时, 突然觉得自己在大学这几年关于游戏编程方面还算是有些心得&#xff0c;因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考。一则是作为自己今后两年…

项目管理中工作分解结构模型(WBSM)的应用

摘要 本文根据工作分解结构(WBS)的工作特点&#xff0c;运用系统工程的思想理论方法&#xff0c;构建了工作分解结构模型&#xff0c;并提出了模型算法;该模型方法的建立使得WBS工作更加简单可靠、思路清晰、基于更加可靠的科学基础之上。 1、工作分解结构模型(WBSM)方法工作程…

实训09.11:java重点内容介绍

package test;/** * OP:面向对象的简称* 类&#xff1a;同一特征的属性* * 类的定义&#xff1a;具有相同特征和行为的事物的抽象。&#xff08;不具体化&#xff09;* 对象&#xff08;实例对象&#xff09;&#xff1a;具体真实存在的实例。* 类是对象的实例&#xff1a;* *…

SPI通信原理---STM32F4--HAL

SPI接口原理 SPI是一种高速全双工同步通信&#xff0c;在芯片管脚上占用四根线&#xff0c;主要应用在EEPROM、FLASH、实时时钟、AD转换器&#xff0c;还有数字信号处理器和数字信号解码器之间。 SPI接口使用4根线通信。 MISO&#xff1a;主设备数据输入&#xff0c;从设备数…

Linux 引导管理器 grub2 使用简介

转自&#xff1a;杜昌彬的空间 首先向其致敬&#xff01;有改动。 grub是Linux系统即其他类unix系统的主流bootloder&#xff0c;由于grub原来版本的设计存在很大缺陷&#xff0c;与以前的grub很不相同&#xff0c;其使用和配置也发生很大变化。现在很多Linux发行版本都使用了…

pata1015_ATA / PATA的完整形式是什么?

pata1015ATA / PATA&#xff1a;高级技术附件/并行高级技术附件 (ATA/PATA: Advanced Technology Attachment/Parallel Advanced Technology Attachment) ATA is an abbreviation of Advanced Technology Attachment. ATA has existed for a long time with the name PATA. Whe…

产品

总结一下&#xff1a;  1、核心功能要做透&#xff0c;做的人家追不上&#xff0c;自己的优势要尽量的发挥&#xff1b;  2、产品口碑要建立&#xff0c;要关注高端用户&#xff0c;要调整自己心态&#xff1b;  3、敏捷、快&#xff0c;产品迭代要快&#xff0c;快速实现…

FreeRTOS在STM32F429上移植

准备工作 FreeRTOS系统源码基础工程&#xff0c;这里我们用跑马灯实验 1.在工程里面添加FreeRTOS源码 在工程里面新建一个名为FreeROTS的文件夹 将FreeRTOS源码添加到这个文件夹里面 protable里面只需留下Keil、MemMang、RVDS文件夹 2、向工程分组中添加文件 FreeRTOS_C…

C++中的指针与引用(转)

原文地址&#xff1a;http://www.cnblogs.com/skynet/archive/2010/09/22/1832911.html写在前面 指针和引用形式上很好区别&#xff0c;但是他们似乎有相同的功能,都能够直接引用对象&#xff0c;对其进行直接的操作。但是什么时候使用指针&#xff1f;什么时候使用引用呢&…

实训09.11:数据库一些简单操作

new Database 新建数据库 new Table 新建表 utf-8 编码格式 primary key 主键&#xff1a;特点&#xff1a;在表中是唯一的不可重复的&#xff0c;一般都是学号&#xff0c;编号 auto increment 自增&#xff0c;一般都把主键设置为自增 allow nul…

c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为八进制字符串(char [])...

c语言中将整数转换成字符串Given an ASCII string (char[]) and we have to convert it into octal string (char[]) in C. 给定一个ASCII字符串(char [])&#xff0c;我们必须在C中将其转换为八进制字符串(char [])。 Logic: 逻辑&#xff1a; To convert an ASCII string t…

Javascript的IE和Firefox兼容性汇编收藏.txt

document.form.item 问题 现有问题&#xff1a;现有代码中存在许多 document.formName.item("itemName") 这样的语句&#xff0c;不能在 MF 下运行 解决方法&#xff1a;改用 document.formName.elements["elementName"] 集合类对象问题 现有问题&#xff…