好文档 - 专业文书写作范文服务资料分享网站

嵌入式系统课程设计实验报告

天下 分享 时间: 加入收藏 我要投稿 点赞

7

嵌入式系统课程设计必做部分

学院:电控学院

专业:通信工程

设计名称:IIC同步串行通讯

1、 设计的目的:

1.掌握S3C44B0IIC控制器的编程方法

2.编程实现串行EEPROM存储器24C16的数据存储和访问。

2、设计的内容:

1.学习S3C44B0 IIC控制器的原理与编程方法; 2.学习IIC存储器24C16的编程方法;

3.理解IIC存储器24C16的与S3C44B0的电路连接原理; 4.掌握C语言中断程序设计方法;

5.编程实现对24C16的数据存储和访问。

3、设计思路、遇到的问题及解决方法:

此次试验,我们结合《嵌入式系统原理及应用》教材以及老师提供的各种pdf和word资料,了解到了各种寄存器的配置方法,如IICDS等。对于例程中的各种函数,如Wr24C16(), Rd24C16(),__irq IicInt()等,通过对程序的仔细研读,最终了解了它们的各自用途,并在此基础上,编写了主函数。实现了从0-255共256个字节的写入及读取操作。

这次实验我们遇到了不少的难题,像开始使用ARM-Project Manager平台一开始,由于对此平台的不了解,我们走了许都弯路。像对于头文件的配置问题,总是配置不对,后来发现头文件为程序自主生成,无需配置。还有关于程序中的一些.s文件,开始并不知道是有何作用,后来在老师的指点下,发现有必要将其加入到sourse文件栏中调用,同时调用的同时,由于不理解调用的路径问题,多次编译失败,后来发现了问题,是路径配置不当,最终更改了路径,解决了问题。

再有,在对老师提供的例程进行阅读时候,发现了不少的啰嗦以及错误语句,例如Uart_Printf(\语句就不应该为Uart_Printf(\这些问题我们都通过调试最终给予了改正。

- 2 -

4、设计的结果及验证

正确输出结果如下截图,从超级终端中回显显示了正确数据,实验成立。

5、程序流程图如下:

开始 Uart端口初始化,rPCONF,rPUPF,rINTCON,pISR_IIC,rINTMSK,rIICCON各个寄存器初始化,向量端口设置,设置循环变量i=0; 用Wr24C16函数写入0-255。共256个数据,其中将数值I写入到地址为I的bank0中,方便读取 Rd24C16函数读取,Uart_Printf函数打印0-255共256个数,地址分别为0-255 结束 - 3 -

6、全部源代码如下(可验证)

#include

#include \#include \#include \#include \#include \#include #include #include #include #include #define WRDATA (1) #define POLLACK (2) #define RDDATA (3) #define SETRDADDR (4) #define IICBUFSIZE 0x20 U8 _iicData[IICBUFSIZE]; volatile int _iicDataCount; volatile int _iicStatus; volatile int _iicMode; int _iicPt;

void __irq IicInt(void);

void Wr24C16(U32 slvAddr,U32 addr,U8 data) {

_iicMode=WRDATA; _iicPt=0;

_iicData[0]=(U8)addr; _iicData[1]=data; _iicDataCount=2;

rIICDS=slvAddr;//0xa0 ,写 移位寄存器 rIICSTAT=0xf0; //MasTx,Start

//Clearing the pending bit isn't needed because the pending bit has been cleared.

while(_iicDataCount!=-1);//中断完成,总线不忙,可以传送,同时移位寄存器已经准备好两个数据量 _iicMode=POLLACK; while(1) {

rIICDS=slvAddr; // 0xa0 ,写 移位寄存器 _iicStatus=0x100; rIICSTAT=0xf0; //MasTx,Start

- 4 -

rIICCON=0xaf; //resumes IIC operation.IIC-BUS控制寄存器 while(_iicStatus==0x100); //rIICSTAT数值发给iicStatus,0xf0

if(!(_iicStatus&0x1)) // Last-received bit is 0 (ACK was received),判断ack是否收到数据 break; // when ACK is received }

rIICSTAT=0xd0; //stop MasTx condition IIC-bus不忙 rIICCON=0xaf; //resumes IIC operation. Delay(1); //wait until stop condtion is in effect. //write is completed. }

void Rd24C16(U32 slvAddr,U32 addr,U8 *data) {

_iicMode=SETRDADDR; //写模式开启 _iicPt=0; //data【】的计数器 _iicData[0]=(U8)addr; //取地址 _iicDataCount=1;

rIICDS=slvAddr; //移位寄存器地址联系 rIICSTAT=0xf0; //MasTx,Start ,总线忙

//Clearing the pending bit isn't needed because the pending bit has been cleared. while(_iicDataCount!=-1); _iicMode=RDDATA; _iicPt=0; //数组数据变量 _iicDataCount=1; //?

rIICDS=slvAddr; //设置移位寄存器输出地点 rIICSTAT=0xb0; //MasRx,Start IIC-bus不忙 rIICCON=0xaf; //resumes IIC operation. 总线控制 while(_iicDataCount!=-1); *data=_iicData[1]; }

void __irq IicInt(void) //中断挂起 {

U32 iicSt,i; //? rI_ISPC=BIT_IIC; //? iicSt=rIICSTAT; //写入fo,d0,

if(iicSt&0x8){} // when bus arbitration is failed. IIC-bus仲裁过程状态标志位

if(iicSt&0x4){} // when a slave address is matched with IICADD IIC-bus从地址状态标志位 if(iicSt&0x2){} // when a slave address is 0000000b IIC-bus 地址为0状态标志: if(iicSt&0x1){} // when ACK isn't received IIC-bus上一次接收到的状态标志位 switch(_iicMode) {

case POLLACK: _iicStatus=iicSt; break; case RDDATA:

- 5 -

嵌入式系统课程设计实验报告

7嵌入式系统课程设计必做部分学院:电控学院专业:通信工程设计名称:IIC同步串行通讯1、设计的目的:1.掌握S3C44B0IIC控制器的编程方法2.
推荐度:
点击下载文档文档为doc格式
8ok6213tny9pg7z7ha02
领取福利

微信扫码领取福利

微信扫码分享