首页 实验三 I2C串行通信实验

实验三 I2C串行通信实验

举报
开通vip

实验三 I2C串行通信实验昆明理工大学信息工程与自动化学院学生实验报告 ( 2011 —2012 学年 第 2 学期 ) 课程名称:嵌入式系统设计 开课实验室:信自楼443 2012年 月 日 年级、专业、班 计科092 学号 200910405214 姓名 徐兴繁 成绩 实验项目名称 I2C串行通信实验 指导教师 江虹 教师评语 该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□ 该同学的实验能力: A.强 □ B.中等 □ C.差 □ 该同学的...

实验三  I2C串行通信实验
昆明理工大学信息 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 与自动化学院学生实验报告 ( 2011 —2012 学年 第 2 学期 ) 课程名称:嵌入式系统 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 开课实验室:信自楼443 2012年 月 日 年级、专业、班 计科092 学号 200910405214 姓名 徐兴繁 成绩 实验项目名称 I2C串行通信实验 指导教师 江虹 教师评语 该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□ 该同学的实验能力: A.强 □ B.中等 □ C.差 □ 该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□ 实验报告是否规范: A.规范□ B.基本规范□ C.不规范□ 实验过程是否详细 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 : A.详细□ B.一般 □ C.没有 □ 教师签名: 年 月 日 1、 实验目的 · 通过实验掌握I2C串行数据通信协议的使用。 · 掌握EEPROM器件的读写方法。 · 通过实验掌握S3C44B0X处理器的I2C控制器的使用。 2、 实验原理 1. I2C接口以及EEPROM I2C总线为同步串行数据传输总线,其标准总线传输速率为100kb/s,增强总线可达400kb/s 。总线驱动能力为400pF。I2C 总线可构成多主和主从系统。 通用存储器芯片多为EEPROM,带I2C总线接口的EEPROM 有许多型号,其中AT24CXX 系列使用十分普遍,该系列产品具有低功耗和高可靠性等优点。其标准封装为8脚DIP封装形式 ,如下图3-18所示: 各引脚的功能说明如下: SCL 串行时钟。遵循ISO/IEC7816同步协议; 漏极开路,需接上拉电阻。 SDA 串行数据线;漏极开路,需接上拉电阻。 A0、A1、A2 器件/页面寻址地址输入端。 WP 读写保护 Vcc/GND 一般输入+5V的工作电压。 图3-18 AT24系列存储器芯片 2.I2C总线的读写控制逻辑 · 开始条件(START_C),当SCL为高电平时,SDA由高转为低,即为开始。 · 停止条件(STOP_C),当SCL为高电平时,SDA由低转为高,即为停止。 · 确认信号(ACK),在接收方应答下,每收到一个字节后便将SDA电平拉低, 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示确认。 · 数据传送(Read/Write),I2C总线启动或应答后,在SCL高电平期间,数据串行发送;在SCL低电平期间,数据准备,并允许SDA线上数据电平变换。总线以字节(8位)为单位传送数据,且高有效位(MSB)在前。 3.EEPROM读/写操作 · AT24C04结构与应用简述 AT24C04由输入缓冲器和EEPROM阵列组成。具有SRAM输入缓冲器的EEPROM器件,其写入操作变成对SRAM缓冲器的装载。装载完后启动一个自动写入逻辑将缓冲器中的全部数据一次写入EEPROM阵列中。对缓冲器的输入称为页写,缓冲器的容量称为页写字节数。AT24C04的页写字节数为8,占用最低3位地址。当写入不超过页写字节数时,对EEPROM器件的写入操作与对SRAM的写入操作相同;当超过页写字节数时,应等候5~10ms后再启动一次写操作。 · 设备地址(DADDR) AT24C04XX的器件地址(在实验系统中)是1010。 · AT24C04的数据操作格式 在I2C总线中,对AT24C04内部存储单元读/写,除了要给出器件的设备地址(DADDR)外,还须指定读/写的页面地址(PADDR)。两者组成操作地址(OPADDR)如下: 1010 A2 A1 - R/W (“-”为无效) 实验系统中AT24C04的引脚A2A1A0为000,因此,系统可寻址AT24C04的全部页面,共4KB。按照AT24C04器件手册读/写地址中的数据操作格式如下: 1)写入操作格式 任意写入一个字节到地址ADDR_W,其时序图如图3-19所示,写入操作格式如下: START_C OPADDR_W ACK ADDR_W ACK data ACK STOP_C 图3-19 任意写一个字节 从地址ADDR_W起连续写入n个字节(同一页面),其时序图如图3-20所示,写入操作格式如下: START_C OPADDR_W ACK ADDR_W ACK data1 ACK data2 ACK … dataN ACK STOP_C 图3-20 写n个字节 2)读出操作格式 从任意地址ADDR_R读一个字节的时序图如图3-21所示,读出操作格式为: START_C OPADDR_W ACK ADDR_R ACK OPADDR_R ACK data STOP_C 图3-21 任意读一个字节 从地址ADDR_R起连续读出n个字节(同一页面),其时序图如图3-22所示,读出操作格式为: START_C OPADDR_R ACK data1 ACK data2 ACK … dataN ACK STOP_C 图3-22 读n个字节 在读任意地址操作中,除了发送读地址外,还要发送页面地址(PADDR);因此,在连续读出n个字节操作前,要进行1个字节PADDR写入操作,然后重新启动读操作。注意,读操作完成后没有ACK。 4.S3C44B0X处理器I2C接口介绍 S3C44B0X处理器为用户进行应用设计提供了支持多主总线的I2C接口。处理器提供符合I2C协议的设备连接的双向数据线IICSDA和IICSCL,在IICSCL高电平期间,IICSDA的下降沿启动,上升沿停止。S3C44B0X处理器可以支持主发送、主接收、从发送、从接收四种工作模式。 其内部控制逻辑框图,如图3-23所示: 图3-23 S3C44B0X处理器I2C总线内部控制逻辑框图 在主发送模式下,处理器通过I2C接口与外部串行器件进行数据传送,需要使用到如下寄存器: · I2C总线控制寄存器IICCON · I2C总线状态寄存器IICSTAT · I2C总线地址寄存器 IICADD · I2C总线发送接收移位寄存器IICDS 各寄存器的用法、每位的含义参见参考书及讲义。 5.实验设计 在S3CEV40实验平台中,使用S3C44B0X处理器内置的I2C控制器作为I2C通信主设备,AT24C04 EEPROM为从设备。电路设计如图3-24所示: 图3-24 AT24C04 EEPROM控制电路 该实验的程序设计 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图如下所示: 3、 实验内容 编写程序对实验板上EEPROM器件AT24C04进行读写访问。实现从同一地址写入再读出,并进行比较,以检测EEPROM器件AT24C04和处理器IIC接口的工作是否正常。 4、 实验步骤 1.准备实验环境。使用Embest仿真器连接目标板,使用Embest S3CEV40实验板附带的串口线连接实验板上的UART0和PC机的串口。 2.在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。 3. 使用EmbestIDE通过Embest仿真器连接实验板,打开实验例程目录下IIC_test子目录下的IIC_Test.ews例程,编译链接通过后连接目标板,下载并运行它。 图3-25 I2C程序设计流程图 实验程序: /********************************************************************************************* * File: IIC.c * Author: embest * Desc: IIC source code * History: *********************************************************************************************/ /*--- include files ---*/ #include "44b.h" #include "44blib.h" #include "def.h" #include "iic.h" #ifdef PRINTLCD #include "lcd.h" /*--- Define in main.c ---*/ extern int input_char; extern INT8U buf[60]; extern INT16 vcol,vrow; extern INT16 pad; // between of two character #endif /*--- global variables ---*/ int iGetACK; /*--- function declare ---*/ void IicInt(void) __attribute__ ((interrupt ("IRQ"))); void Test_Iic(void); void Wr24C040(U32 slvAddr,U32 addr,U8 data); void Rd24C040(U32 slvAddr,U32 addr,U8 *data); /*--- function code ---*/ /********************************************************************************************* * name: read_16byte * func: read 16byte from eeprom * para: none * ret: none * modify: * comment: ********************************************************************************************/ void read_16byte(void) { unsigned int i; static U8 data[16]; /* clear array */ for( i=0; i<16; i++) data[i]=0; Uart_Printf(" Read 16 bytes from AT24C04\n"); #ifdef PRINTLCD print_lcd(vcol,vrow,BLACK," Read 16 bytes from AT24C04\n"); #endif /* read 16 byte from 24C04 */ for( i=0; i<16; i++ ) Rd24C040(0xa0,(U8)i,&(data[i])); /* printf read data */ for( i=0; i<16; i++ ) { Uart_Printf(" %2x ",data[i]); #ifdef PRINTLCD sprintf(buf," %2x ",data[i]); print_lcd(vcol+pad*i,vrow+pad,BLACK,buf); #endif } Uart_Printf("\n"); Delay(100); } /********************************************************************************************* * name: Test_Iic * func: test IIC * para: none * ret: none * modify: * comment: ********************************************************************************************/ void Test_Iic(void) { unsigned int i,j; static U8 data[16]; iGetACK = 0; Uart_Printf(" IIC Test using AT24C04...\n"); /* enable interrupt */ rINTMOD=0x0; rINTCON=0x1; rINTMSK=~(BIT_GLOBAL|BIT_IIC); pISR_IIC=(unsigned)IicInt; /* S3C44B0X slave address */ rIICADD=0x10; /*Enable ACK,interrupt, IICCLK=MCLK/16, Enable ACK//64Mhz/16/(15+1) = 257Khz */ rIICCON=0xaf; /* enbale TX/RX */ rIICSTAT=0x10; Uart_Printf(" Write char 0-f into AT24C04\n"); /* write 0-255 to 24C04 */ for( i=0; i<16; i++ ) Wr24C040(0xa0,(U8)i,i); read_16byte(); } /********************************************************************************************* * name: Wr24C040 * func: write data to 24C040 * para: slvAddr --- chip slave address * addr --- data address * data --- data value * ret: none * modify: * comment: ********************************************************************************************/ void Wr24C040(U32 slvAddr,U32 addr,U8 data) { iGetACK = 0; /* send control byte */ rIICDS = slvAddr; // 0xa0 rIICSTAT=0xf0; // Master Tx,Start while(iGetACK == 0); // wait ACK iGetACK = 0; /* send address */ rIICDS = addr; rIICCON = 0xaf; // resumes IIC operation. while(iGetACK == 0); // wait ACK iGetACK = 0; /* send data */ rIICDS = data; rIICCON = 0xaf; // resumes IIC operation. while(iGetACK == 0); // wait ACK iGetACK = 0; /* end send */ rIICSTAT = 0xd0; // stop Master Tx condition rIICCON = 0xaf; // resumes IIC operation. DelayMs(5); // wait until stop condtion is in effect. } /********************************************************************************************* * name: Rd24C080 * func: read data from 24C040 * para: slvAddr --- chip slave address * addr --- data address * data --- data pointer * ret: none * modify: * comment: ********************************************************************************************/ void Rd24C040(U32 slvAddr,U32 addr,U8 *data) { char recv_byte; iGetACK = 0; /* send control byte */ rIICDS = slvAddr; // 0xa0 rIICSTAT=0xf0; // Master Tx,Start while(iGetACK == 0); // wait ACK iGetACK = 0; /* send address */ rIICDS = addr; rIICCON = 0xaf; // resumes IIC operation. while(iGetACK == 0); // wait ACK iGetACK = 0; /* send control byte */ rIICDS = slvAddr; // 0xa0 rIICSTAT=0xb0; // Master Rx,Start rIICCON=0xaf; // resumes IIC operation. while(iGetACK == 0); // wait ACK iGetACK = 0; /* get data */ recv_byte = rIICDS; rIICCON = 0x2f; DelayMs(1); /* get data */ recv_byte = rIICDS; /* end receive */ rIICSTAT = 0x90; // stop Master Rx condition rIICCON = 0xaf; // resumes IIC operation. DelayMs(5); // wait until stop condtion is in effect. *data = recv_byte; } /********************************************************************************************* * name: IicInt * func: IIC interrupt handler * para: none * ret: none * modify: * comment: ********************************************************************************************/ void IicInt(void) { rI_ISPC=BIT_IIC; iGetACK = 1; } /********************************************************************************************* * File: main.c * Author: embest * Desc: c main entry * History: *********************************************************************************************/ /*--- include files ---*/ #include "44blib.h" #include "44b.h" /*--- function declare ---*/ /*--- extern function ---*/ extern void Test_Iic(); /*--- function code ---*/ /********************************************************************************************* * name: main * func: c code entry * para: none * ret: none * modify: * comment: *********************************************************************************************/ void Main(void) { sys_init(); /* Initial 44B0X's Interrupt,Port and UART */ _Link(); /* Print Misc info */ /* printf interface */ Uart_Printf ("\n Embest S3C44B0X Evaluation Board (S3CEV40)\n"); Uart_Printf("\n IIC operate Test Example\n"); Test_Iic(); while(1); } 五、实验结果: 在PC上观察超级终端程序主窗口。实验程序完成对AT24C04的同一地址读写并比较。若读/写成功,则可以看到如下显示 Embest 44B0X Evaluation Board(S3CEV40) IIC operate Test Example IIC Test using AT24C04... Write char 0-f into AT24C04 Read 16 bytes from AT24C04 0 1 2 3 4 5 6 7 8 9 a b c d e f 若读/写不正确,则可以看到如下显示: Embest 44B0X Evaluation Board(S3CEV40) IIC operate Test Example IIC Test using AT24C04... Write char 0-f into AT24C04 Read 16 bytes from AT24C04 f f f f f f f f f f f f f f f f 实验截图: 六、实验总结 通过本次学习掌握I2C串行数据通信协议的使用,以及EEPROM器件的读写方法。 实现了S3C44B0X处理器的I2C控制器的使用。平时接触串口和超级终端的次数比较少,在实验操作中遇到了很多问题,后请教同学完成实验。 8� 1� A0 VCC 7� 2 A1 WP 6� 3� A2 SCL 5� 4� GND SDA A0 1 A1 2 A2 3 GND 4 SDA 5 SCL 6 WP 7 VDD 8 U18 AT24LC04 IICSCL IICSDA GND VDD33 GND � EMBED Word.Picture.8 ��� _1240052824.doc
本文档为【实验三 I2C串行通信实验】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_633651
暂无简介~
格式:doc
大小:180KB
软件:Word
页数:11
分类:互联网
上传时间:2012-09-08
浏览量:61