昆明理工大学信息
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
与自动化学院学生实验报告
( 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