嵌入式微机原理及应用课程大作业文档格式.docx

上传人:b****3 文档编号:18436185 上传时间:2022-12-16 格式:DOCX 页数:14 大小:40.09KB
下载 相关 举报
嵌入式微机原理及应用课程大作业文档格式.docx_第1页
第1页 / 共14页
嵌入式微机原理及应用课程大作业文档格式.docx_第2页
第2页 / 共14页
嵌入式微机原理及应用课程大作业文档格式.docx_第3页
第3页 / 共14页
嵌入式微机原理及应用课程大作业文档格式.docx_第4页
第4页 / 共14页
嵌入式微机原理及应用课程大作业文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

嵌入式微机原理及应用课程大作业文档格式.docx

《嵌入式微机原理及应用课程大作业文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式微机原理及应用课程大作业文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

嵌入式微机原理及应用课程大作业文档格式.docx

连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。

I2C总线的数据传送速率在标准工作方式下为100kbit/s,快速方式下最高传送速率达400kbit/s。

3)I2C总线上的时钟信号

在I2C总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的所有器件的逻辑与完成的。

SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。

此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。

当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。

其后,第一个结束高电平期的器件又将SCL线拉成低电平。

这样就在SCL线上产生一个同步时钟。

可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。

4)数据的传送

在数据传送过程中,必须确认数据传送的开始和结束。

在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如下图所示。

当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号;

当SCL线为高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。

开始和结束信号都是由主器件产生。

在开始信号以后,总线即被认为处于忙状态;

在结束信号以后的一段时间内,总线被认为是空闲的。

图5-35I2C总线启动和停止信号的定义

I2C总线的数据传送格式是:

在I2C总线开始信号后,送出的第一个字节数据是用来选择从器件地址的,其中前7位为地址码,第8位为方向位(R/W)。

方向位为“0”表示发送,即主器件把信息写到所选择的从器件;

方向位为“1”表示主器件将从从器件读信息。

开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第8位(R/W)确定。

在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位,而且每个传送的字节后面必须跟一个认可位(第9位),也叫应答位(ACK)。

数据的传送过程如下图所示。

每次都是先传最高位,通常从器件在接收到每个字节后都会作出响应,即释放SCL线返回高电平,准备接收下一个数据字节,主器件可继续传送。

如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收I2C总线上的数据字节)可以使时钟SCL线保持低电平,从器件必须使SDA保持高电平,此时主器件产生1个结束信号,使传送异常结束,迫使主器件处于等待状态。

当从器件处理完毕时将释放SCL线,主器件继续传送。

图5-36I2C总线数据传送过程

当主器件发送完一个字节的数据后,接着发出对应于SCL线上的一个时钟(ACK)认可位,在此时钟内主器件释放SDA线,一个字节传送结束,而从器件的响应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。

从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。

I2C总线还具有广播呼叫地址用于寻址总线上所有器件的功能。

若一个器件不需要广播呼叫寻址中所提供的任何数据,则可以忽略该地址不作响应。

如果该器件需要广播呼叫寻址中提供的数据,则应对地址作出响应,其表现为一个接收器。

5)总线竞争的仲裁

总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。

例如,多单片机系统中,可能在某一时刻有两个单片机要同时向总线发送数据,这种情况叫做总线竞争。

I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:

当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。

总线竞争的仲裁是在两个层次上进行的。

首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。

由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。

6)I2C总线的一次典型工作流程

1、开始:

信号表明传输开始。

2、地址:

主设备发送地址信息,包含7位的从设备地址和1位的指示位(表明读或者写,即数据流的方向)。

3、数据:

根据指示位,数据在主设备和从设备之间传输。

数据一般以8位传输,最重要的位放在前面;

具体能传输多少量的数据并没有限制。

接收器上用一位的ACK(回答信号)表明每一个字节都收到了。

传输可以被终止和重新开始。

4、停止:

信号结束传输。

S3C44B0X的I2C控制

S3C44B0X处理器提供了一个I2C串行总线,其模块框图如下图所示,包括一个专门的串行数据线和串行时钟线。

它的操作模式有四种:

1、主设备发送模式;

2、主设备接收模式;

3、从设备发送模式;

4、从设备接收模式。

图5-37S3C44B0X处理器I2C串行总线框图

1)I2C总线控制寄存器

表5-34I2C总线控制寄存器

寄存器名称

地址

读写状态

描述

复位值

IICCON

0x01D60000

R/W

IIC总线控制寄存器

0000XXXX

初始状态

ACK使能

[7]

0:

禁止产生ACK信号

1:

允许产生ACK信号

Tx时钟源选择

[6]

IICCLK=fMCLK/16

IICCLK=fMCLK/512

Tx/Rx中断使能

[5]

禁止Tx/Rx中断1:

使能Tx/Rx中断

中断清除标记

[4]

写0:

清除中断标志并重新启动写操作

读1:

中断标志置位

发送时钟值

[3:

0]

发送加载初始数据,决定发送频率

未定义

2)状态寄存器

表5-35状态寄存器

IICSTAT

0x01D60004

IIC总线控制/状态寄存器

00000000

模式选择

[7:

6]

IIC总线主/从Tx/Rx模式选择位

00:

从接收模式01:

主接收模式

10:

从发送模式11:

主发送模式

忙信号状态/起停条件

读0:

IIC总线不忙写0:

产生IIC总线停止信号

IIC总线忙写1:

产生IIC总线启动信号

串行输出使能

禁止Tx/Rx信号传输1:

使能Tx/Rx信号传输

仲裁状态标记

[3]

总线仲裁成功

总线仲裁不成功

从设备状态标记

[2]

作为从设备时:

检测到启动或停止信号1:

接收到地址

零地址状态标记

[1]

总线地址为0

接收到的最低数据位状态标记

[0]

接收到ACK应答信号1:

没有接收到ACK应答信号

3)地址寄存器

表5-36地址寄存器

IICADD

0x01D60008

IIC总线地址寄存器

XXXXXXXX

从地址

从设备的设备地址和页面地址

位0为读写控制(0为写,1为读)

任何时候都可对该值进行读操作,当IICSTAT的串行输出使能位为0时,可对该值进行写操作

 

4)移位数据寄存器

表5-37移位数据寄存器

IICDS

0x01D6000C

IIC总线发送/接收数据漂移寄存器

数据漂移

IIC总线要移位发送/接收的数据。

任何时候都可对该值进行读操作,当IICSTAT的串行输出使能位为0时,可对该值进行写操作。

4软件设计

1)I2C接口初始化

I2C接口初始化操作通过函数voidiic_init()完成,首先必须进行I2C端口初始化

rPCONF=(rPCONF&

0xFFFFFF0)|0xa;

/*PF0:

IICSCL,PF1:

IICSDA*/

rPUPF|=0x3;

/*pull-updisable*/

然后配置I2C控制寄存器

rIICCON=(1<

<

7)|(0<

6)|(1<

5)|(0xf);

/*Enableinterrupt,IICCLK=MCLK/16*/

rIICADD=0x10;

/*S3C44B0Xaddress*/

rIICSTAT=0x10;

2)I2C写操作

I2C写操作通过函数voidiic_write_24C08(U32slvAddr,U32addr,U8data)完成,其中slvAddr为从设备地址,在本系统中为0xa0,addr为待写入数据到芯片的地址,data为待写入的数据。

I2C写操作代码如下所示。

a.填写I2C命令,I2C缓冲区数据及大小。

iic_command=WRDATA;

iic_data_tx_index=0;

iic_buffer[0]=(U8)addr;

iic_buffer[1]=data;

iic_data_tx_size=2;

b.然后设置从设备地址并启动I2C操作,并将引发中断。

在I2C中断处理函数中进行读写操作,操作完毕iic_data_tx_size将被置为-1。

rIICDS=slvAddr;

rIICSTAT=0xf0;

/*MasTx,Start*/

c.等待写操作完成。

while(iic_data_tx_size!

=-1);

d.等待从设备应答。

rIICSTAT=0xd0;

/*topMasTxcondition*/

rIICCON=0xaf;

/*resumesIICoperation.*/

Delay

(1);

/*untilstopcondtionisineffect.*/

iic_command=POLLACK;

while

(1)

{

rIICDS=slvAddr;

iic_status=0x100;

rIICSTAT=0xf0;

/*MasTx,Start*/

rIICCON=0xaf;

/*resumesIICoperation.*/

while(iic_status==0x100);

if(!

(iic_status&

0x1))

break;

/*whenACKisreceived*/

}

/*stopMasTxcondition*/

/*untilstopconditionisineffect.*/

3)I2C读操作

I2C读操作通过函数voidiic_read_24C08(U32slvAddr,U32addr,U8*data)完成,其中slvAddr为从设备地址,在本系统中为0xa0,addr为待读入数据的地址,data为待读入数据的缓冲区指针。

I2C读操作代码如下所示。

a.填写I2C命令。

iic_command=SETRDADDR;

iic_data_tx_index=0;

iic_buffer[0]=(U8)addr;

iic_data_tx_size=1;

b.等待写操作完成。

rIICDS=slvAddr;

rIICSTAT=0xf0;

/*MasTx,Start*/

while(iic_data_tx_size!

c.启动I2C操作,并将引发中断。

在I2C中断处理函数中进行读写操作,操作完毕读取的数据被送入iic_buffer中。

iic_command=RDDATA;

iic_data_rx_index=0;

iic_data_rx_size=1;

rIICSTAT=0xb0;

/*MasRx,Start*/

rIICCON=0xaf;

/*resumesIICoperation.*/

while(iic_data_rx_size!

rIICSTAT=0x90;

/*stopMasRxcondition*/

Delay

(1);

*data=iic_buffer[1];

4)I2C中断处理

I2C中断中接收I2C命令并进行相应处理,包括对POLLACK、RDDATA、WRDATA命令的处理,代码如下所示。

rI_ISPC=BIT_IIC;

iicSt=rIICSTAT;

switch(iic_command)

casePOLLACK:

iic_status=iicSt;

break;

caseRDDATA:

iic_data_rx_size--;

iic_buffer[iic_data_rx_index++]=rIICDS;

if(iic_data_rx_size==-1)break;

/*Thelastdatahastobereadwithnoack.*/

if((iic_data_rx_size)==0)

rIICCON=0x2f;

/*resumesIICoperationwithNOACK.*/

}

else

rIICCON=0xaf;

/*resumesIICoperationwithACK*/

caseWRDATA:

caseSETRDADDR:

iic_data_tx_size--;

if(iic_data_tx_size==-1)break;

rIICDS=iic_buffer[iic_data_tx_index++];

/*iic_buffer[0]hasdummy*/

for(i=0;

i<

10;

i++);

/*untilrisingedgeofIICSCL*/

/*resumesIICoperation.*/

default:

5实验~计算结果

程序向24C08中写入256个字节数据,地址从0到255,然后读出256个字节数据,地址从0到255。

查看结果,发现写入和读出的结果相同,说明实验成功。

达到了本实验通过I2C总线向该芯片进行读写操作达到掌握I2C总线编程的目的。

6总结

通过此次实验我了解ADTIDE集成开发环境的基本功能,知道了I2C接口的用法同时也了解了I2C总线结构。

JX44B0教学实验系统上的EEPROM芯片24C08使用I2C总线与S3C44B0XI2C总线控制器进行连接,容量为1K字节。

当程序向24C08中写入256个字节数据时,地址从0到255,然后读出256个字节数据,地址从0到255,可以从结果看到前后两者相同。

此次实验让我明白了所学知识应用在实践方面的重要性,嵌入式的知识在生活中的应用也很广泛,这也更加增加了我对这么课程的兴趣。

参考文献

1>

田泽ARM7嵌入开发实验与实践北京:

北京航空航天大学出版社,2006

2>

张勇 

ARM原理与C程序设计西安:

西安电子科技大学出版社,2009

附录:

实验程序及注释(自编部分)

iic_command=RDDATA;

if((iic_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1