ARM嵌入式系统课程设计-I2C总线接口设计.doc

上传人:李主任 文档编号:3257732 上传时间:2019-08-06 格式:DOC 页数:26 大小:254.05KB
返回 下载 相关 举报
ARM嵌入式系统课程设计-I2C总线接口设计.doc_第1页
第1页 / 共26页
ARM嵌入式系统课程设计-I2C总线接口设计.doc_第2页
第2页 / 共26页
ARM嵌入式系统课程设计-I2C总线接口设计.doc_第3页
第3页 / 共26页
ARM嵌入式系统课程设计-I2C总线接口设计.doc_第4页
第4页 / 共26页
ARM嵌入式系统课程设计-I2C总线接口设计.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《ARM嵌入式系统课程设计-I2C总线接口设计.doc》由会员分享,可在线阅读,更多相关《ARM嵌入式系统课程设计-I2C总线接口设计.doc(26页珍藏版)》请在三一文库上搜索。

1、 I2C总线接口设计 课程设计报告系 别: 信息科学与技术系 专业班级: 电信0801班 学生姓名: 学 号: 指导教师: (课程设计时间:2011年12月26日2012年01月06日)华中科技大学武昌分校ARM嵌入式系统课程设计任务书一、设计(调查报告/论文)题目课题:I2C 总线接口设计二、设计(调查报告/论文)主要内容编写程序对实验板上 EEPROM 器件24C08 进行读/写访问。实现从同一地址写入再读出数据,并进行比较,以检测EEPROM 器件24C08 和处理器I2C 接口的工作是否正常。把读写的数据通过串口传到PC机用超级终端(或串口助手)显示,把读取的数据用数码管显示或者点阵或

2、者液晶屏进行显示。三、原始资料开发板的原理图和实验参考程序,参考实验讲义和课设讲义一块ARM开发板和底板(未焊接)四、要求的设计(调查/论文)成果l 使用实验板和板上的IIC EEPROM芯片,实现对EEPROM的读写;l 完成实验方案的设计,根据原理图完成硬件的搭建;l 可选容量为256字节、1K字节;l 实现字节写、页写、当前地址读、随机地址读等功能,并封装成一个个可供用户调用的函数;l 显示功能:把读写的数据通过串口传到PC机用超级终端(或串口助手)显示,要求显示班级、姓名和学号;如果用ARM7的开发板,要求把读取的数据用数码管显示,其中能力强的同学可以通用点阵显示班级和学号;如果用AR

3、M9的开发板,要求用液晶屏显示班级姓名和学号,以及读取的数字。l 在实验完成的基础上完成课程设计报告的撰写,按照模板的格式书写,要求有软件流程图和调试过程。五、进程安排1准备和审题,讲解原理0.5天2系统分析13总体设计和硬件的完成1.54详细设计(编写代码)25调试和测试36撰写课程设计报告17课程设计成果验收0.58正式提交课程设计报告和系统源程序0.5六、主要参考资料嵌入式系统实验指导书ARM课程设计讲义I2C总线接口讲义KS24c08芯片资料Arm开发板硬件原理图和底板的硬件原理图74Hc04、74HC573和74HC595芯片资料指导教师(签名): 20 年 月 日目 录1.引言52

4、.课程设计目的63.课程设计题目描述和要求64.课程设计报告内容74.1实验原理74.2程序流程图114.3主程序代码125.调试过程及总结236.参考文献241. 引言 IIC即I2C,是一种总线结构。是作为英特尔IC的互补,这种总线类型是由菲利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源。这种方式简化了信号传输总线。例如:内存中的SPD信息,通过IIC,与BX芯片组联系,IIC 存在于英特尔PIIX4结构体系中。随着大规模集成电路技术的发展,把CPU和一

5、个单独工作系统所必需的ROM、RAM、I/O端口、A/D、D/A等外围电路集成在一个单片内而制成的单片机或微控制器愈来愈方便。目前,世界上许多公司生产单片机,品种很多。其中包括各种字长的CPU,各种容量的ROM、RAM以及功能各异的I/O接口电路等等,但是,单片机的品种规格仍然有限,所以只能选用某种单片机来进行扩展。扩展的方法有两种:一种是并行总线,另一种是串行总线。由于串行总线的连线少,结构简单,往往不用专门的母板和插座而直接用导线连接各个设备。因此,采用串行线可大大简化系统的硬件设计。PHILIPS公司早在十几年前就推出了I2C串行总线,利用该总线可实现多主机系统所需的裁决和高低速设备同步

6、等功能。因此,这是一种高性能的串行总线。I2C总线是各种总线中使用信号线最少,并具有自动寻址、多主机时钟同步和仲裁等功能的总线。因此,使用I2C总线设计计算机系统十分方便灵活,体积也小,因而在各类实际应用中得到广泛应用。飞利浦电子公司日前推出新型二选一I2C主选择器,可以使两个I2C主设备中的任何一个与共享资源连接,广泛适用于从MP3播放器到服务器等计算、通信和网络应用领域,从而使制造商和终端用户从中获益。PCA9541可以使两个I2C主设备在互不连接的情况下与同一个从设备相连接,从而简化了设计的复杂性。此外,新产品以单器件替代了I2C多个主设备应用中的多个芯片,有效节省了系统成本。2. 课程

7、设计目的1) 通过实验掌握I2C 串行数据通信协议的使用。2) 掌握EEPROM 器件的读/写方法。3) 通过实验掌握S3C44B0X或者S3C2440A 处理器的I2C 控制器的使3. 课程设计题目描述和要求IIC是PHILPS公司开发的串行总线,用于连接微处理器及其外围设备,具有如下特点:1) 只有两条总线线路,串行数据线SDA、串行时钟线SCL;2) 每个连接到总线的器件都可以用软件根据它唯一地址来识别;3) 传输数据间是简单的主从关系;4) 主机可以用作主机发送器或主机接收器;5) 多主机总线,可以检测冲突;6) 连接到同一总线上的IC数量只受到总线的最大电容400pF的限制;要求编写

8、程序对实验板上 EEPROM 器件24C08 进行读/写访问。实现从同一地址写入再读出数据,并进行比较,以检测EEPROM 器件24C08 和处理器I2C 接口的工作是否正常。1) 使用实验板和板上的IIC EEPROM芯片,实现对EEPROM的读写;2) 完成实验方案的设计,根据原理图完成硬件的搭建;3) 可选容量为256字节、1K字节;4) 实现字节写、页写、当前地址读、随机地址读等功能,并封装成一个个可供用户调用的函数;5) 显示功能:把读写的数据通过串口传到PC机用超级终端(或串口助手)显示,要求显示班级、姓名和学号;如果用ARM7的开发板,要求把读取的数据用数码管显示,其中能力强的同

9、学可以通用点阵显示班级和学号;如果用ARM9的开发板,要求用液晶屏显示班级姓名和学号,以及读取的数字。6) 在实验完成的基础上完成课程设计报告的撰写,按照模板的格式书写,要求有软件流程图和调试过程。4. 课程设计报告内容4.1 实验原理1) I2C 接口以及EEPROMI2C 总线为同步串行数据传输总线,其标准总线传输速率为100kb/s,增强总线可达400kb/s,总线驱动能力为400pF。I2C 总线可构成多主和主从系统。在多主系统结构中,系统通过硬件或软件仲裁获得总线控制使用权。应用系统中I2C 总线多采用主动结构,即总线上只有一个主控节点,总线上的其他设备都作为从设备。I2C 总线上的

10、设备寻址由器件地质界现决定,并且通过访问地址最低位来控制读/写方向。目前,通用存储器芯片多位 EEPROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行连接协议。带I2C总线接口的EEPROM 有许多型号,其中AT24CXXX 系列使用十分普遍,产品包括AT2401/02/04/08/等,其容量(字节数页)分别为1288/2568/5128/10248/2048,适用于25V 的低电压操作,具有低功耗和高可靠性等优点。AT24 系列存储器芯片采用COMS 工艺制造,内置有高压泵,可在单电压供电条件下工作,其标准封装为8 引脚DIP 封装形式,如图1-1 所示。图1-1 AT24 标准

11、封装引脚图各引脚的功能说明如下:SCL :串行时钟。遵循ISO/IEC7816 同步协议;漏极开路,需要上拉电阻;在该引脚的上升沿,系统将数据输入到每个EEPROM 器件,在下降沿输出。SDA :串行数据线。漏极开路,需要上拉电阻;双向串行数据线,漏极开路,可与其他开路器件“线或”。A0,A1,A2 :器件/页面寻址地址输入端。在AT24C01/02 中,引脚被硬连接。其他AT24Cxx均可接寻址地址线。WP :读/写保护。接低电平时可对整片空间进行读/写;接高电平时不能对受保护区进行读/ 写。VCC/GND :5V 的工作电压。2) I2C 总线的读/写控制逻辑 开始条件(START_C),

12、当SCL 为高电平时,SDA 由高转低,即为开始。 停止条件(STOP_C),当SCL 为高电平时,SDA 由低转为高,即为停止。 确认信号(ACK),在接受方应答下,每收到一个字节后便将SDA 电平拉低,表示确认。 数据传送(Read/Write),I2C 总线启动或应答后,在SCL 高电平期间,数据串行传送;在SCL 低电平期间,数据准备,并允许SDA 线上数据电平变换。总线以字节(8位)位单位传送数据,且高有效位(MSB)在前。I2C 数据传送时序如图1-2 所示。图1-2 I2C 总线信号的时序3) S3C44B0X 处理器I2C 接口A. S3C44B0X I2C 接口简介S3C44

13、B0X 处理器为用户进行应用设计提供了支持多主总线的I2C 接口,处理器提供符合I2C 协议的设备连接的双向数据线IICSDA 和IICSCL。在IICSCL 高电平期间,IICSDA 的下降沿启动,上升沿停止。S3C44B0X 处理器可以支持主发送,主接受,从发送,从接受4 种工作模式。在主发送模式下,处理器通过I2C 接口与外部串行器件进行数据传送,需要用到如下寄存器。(1) I2C 总线控制寄存器IICCONACK Enable 0: 禁止产生ACK 信号;1:允许产生ACK 信号。Tx CLK Select 0: IICCLK=fMCLK/16; 1:IICCLK= fMCLK/512

14、.Tx/Rx Interrupt 0: 禁止Tx/Rx 中断; 1:允许Tx/Rx 中断。INT_PND 写0:清除中断标志并重新启动I2C 总线写操作;读1:中断标志置位。Tx Clock Value I2C发送加载初始数据,决定发送频率。(2) I2C 总线状态寄存器IICSTATMode_s 00: 从接受; 10:主接受;01:从发送;11:主发送。Cond_s 写0:产生STOP_C 信号;读1:I2C 总线空闲。SOE 0:禁止Tx/Rx 信号传输;1:允许Tx/Rx 信号传输。ASF 0:I2C 总线仲裁成功;1:仲裁不成功,I2C 总线不能工作。ASS 作为从设备时,为0:检测

15、到START_C 或STOP_C 信号;为1:接受地址。AZS 作为从设备时,为0:收到START_C 或STOP_C 信号;为1:I2C 总线地址为0。LRB 接收到的最低数据位。为0:接受到ACK 信号;为1:未接受到ACK 信号。(3) I2C 总线地址寄存器IICADDSlvADDR 位【7:1】是从设备的设备地址和页面地址;位0 是读/写控制(0 为写;1 为读)。当SOE=0 时,可对SlvADDR 进行读|写。(4) I2C 总线发送/接受移位寄存器IICDSShitDATA 位【7:1】存放I2C 总线要移位传输或接受的数据。当SOE=1 时,可对ShitDATA 进行读/写。

16、I2C 控制器内部控制逻辑框图如图1-7 所示图1-7 I2C 控制器逻辑框图B. 使用S3C44B0X I2C 总线读/写方法单字节写操作(R/W=0) Addr:设备,页面及访问地址同一页面的多字节写操作(R/W) OPADDR:设备及页面地址(高7 位)单字节读串行存储器件(R/W=1) Addr:设备,页面及访问地址同一页面的多字节读操作(R/W=1) Addr:设备,页面及访问地址注:P&R=OPADDRR_R=1010xxx(字节高7 位)R,重新启动读操作。4.2 程序流程图:4.3 主程序代码:#include option.h#include def.h#include 44

17、b.h#include 44blib.h#define WRDATA (1)#define POLLACK (2)#define RDDATA (3)#define SETRDADDR (4)#define IICBUFSIZE 0x20void disnum(U32 data);void Isr_Init(void);void HaltUndef(void);void HaltSwi(void);void HaltPabort(void); void HaltDabort(void);void Rd24C080(U32 slvAddr,U32 addr,U8 *data);void Wr24

18、C080(U32 slvAddr,U32 addr,U8 data);U8 _iicDataIICBUFSIZE;volatile int _iicDataCount;volatile int _iicStatus;volatile int _iicMode;volatile U16 * LedDBuffer = (volatile U16 *)(0x2000000);volatile U16 * LedSBuffer = (volatile U16 *)(0x2000000);static U8 SHOWDATA16=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x

19、07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71;数码管上的字模0Fint _iicPt;void _irq IicInt(void);void Main(void) unsigned int i,j,y,m; static U8 data256; unsigned char *src, *dst; unsigned int memSum; rSYSCFG=SYSCFG_8KB;#if (PLLON=1) ChangePllValue(PLL_M,PLL_P,PLL_S);#endif Isr_Init(); Port_Init(); Uart_Init(0

20、,115200);波特率 Uart_Select(0); Delay(0); /calibrate Delay() Led_Display(7); Delay(1000); /calibrate Delay() Led_Display(0); Delay(5000); /calibrate Delay() Led_Display(7); Uart_Printf(IIC Test using KS24C02n); pISR_IIC=(unsigned)IicInt; rINTMSK=(BIT_GLOBAL|BIT_IIC); rIICCON=(17)|(06)|(15)|(0xf); /Enab

21、le interrupt, IICCLK=MCLK/16, Enable ACK /40Mhz/16/(15+1) = 257Khz rIICADD=0x10; / S3C44B0X slave address rIICSTAT=0x10; Uart_Printf(陈哲n);在终端上显示祁恒 Uart_Printf(电信0801n);在终端上显示电信0801 for(y=0;y100;y+) *LedDBuffer=(10)8)+SHOWDATA0; 在数码管上显示0 Delay(50); *LedDBuffer=(11)8)+SHOWDATA8; 在数码管上显示8 Delay(50); *L

22、edDBuffer=(12)8)+SHOWDATA0; 在数码管上显示0 Delay(50); *LedDBuffer=(13)8)+SHOWDATA1; 在数码管上显示1 Delay(50); 在数码管上显示0801 Uart_Printf(2008n); for (m=0;m100;m+) *LedDBuffer=(10)8)+SHOWDATA2; 在数码管上显示2 Delay(50); *LedDBuffer=(11)8)+SHOWDATA0; 在数码管上显示0 Delay(50); *LedDBuffer=(12)8)+SHOWDATA0; 在数码管上显示0 Delay(50); *L

23、edDBuffer=(13)8)+SHOWDATA8; 在数码管上显示8 Delay(50); Uart_Printf(1186n); for (m=0;m100;m+) *LedDBuffer=(10)8)+SHOWDATA1; 在数码管上显示1 Delay(50); *LedDBuffer=(11)8)+SHOWDATA1; 在数码管上显示1 Delay(50); *LedDBuffer=(12)8)+SHOWDATA8; 在数码管上显示8 Delay(50); *LedDBuffer=(13)8)+SHOWDATA6; 在数码管上显示6 Delay(50); Uart_Printf(03

24、2n); for (m=0;m100;m+) *LedDBuffer=(10)8)+SHOWDATA0;在数码管上显示0 Delay(50); *LedDBuffer=(11)8)+SHOWDATA3; 在数码管上显示3 Delay(50); *LedDBuffer=(12)8)+SHOWDATA2; 在数码管上显示2 Delay(50); Uart_Printf(Write test data into KS24C080n);写数据 for(i=0;i256;i+)Wr24C080(0xa0,(U8)i,i);调用写数据 for(i=0;i256;i+)datai=0; Uart_Print

25、f(Read test data from KS24C080n);读数据 for(i=0;i256;i+)Rd24C080(0xa0,(U8)i,&(datai); 调用读函数 for(i=0;i256;i+) Uart_Printf(%2x ,datai); disnum(datai); Uart_Printf(n); void disnum (U32 data) U8 num2=0; int j,m; num0=data/16; /十位 num1=data%16; /个位 for(m=0;m100;m+) for(j=0;j2;j+) *LedDBuffer=(1j)8)+SHOWDATA

26、numj;/点亮第j个数码管,显示numj的值 Delay(50); void Wr24C080(U32 slvAddr,U32 addr,U8 data) _iicMode=WRDATA; _iicPt=0; _iicData0=(U8)addr; _iicData1=data; _iicDataCount=2; rIICDS=slvAddr;/0xa0 rIICSTAT=0xf0; /MasTx,Start /Clearing the pending bit isnt needed because the pending bit has been cleared. while(_iicDa

27、taCount!=-1); _iicMode=POLLACK; while(1) rIICDS=slvAddr;_iicStatus=0x100;rIICSTAT=0xf0; /MasTx,StartrIICCON=0xaf; /resumes IIC operation. while(_iicStatus=0x100);if(!(_iicStatus&0x1) break; / when ACK is received rIICSTAT=0xd0; /stop MasTx condition rIICCON=0xaf; /resumes IIC operation. Delay(1); /w

28、ait until stop condtion is in effect. /write is completed.void Rd24C080(U32 slvAddr,U32 addr,U8 *data) _iicMode=SETRDADDR; _iicPt=0; _iicData0=(U8)addr; _iicDataCount=1; rIICDS=slvAddr; rIICSTAT=0xf0; /MasTx,Start /Clearing the pending bit isnt needed because the pending bit has been cleared. while(

29、_iicDataCount!=-1); _iicMode=RDDATA; _iicPt=0; _iicDataCount=1; rIICDS=slvAddr; rIICSTAT=0xb0; /MasRx,Start rIICCON=0xaf; /resumes IIC operation. while(_iicDataCount!=-1); *data=_iicData1;void _irq IicInt(void) U32 iicSt,i; rI_ISPC=BIT_IIC; iicSt=rIICSTAT; if(iicSt&0x8) / when bus arbitration is fai

30、led. if(iicSt&0x4) / when a slave address is matched with IICADD if(iicSt&0x2) / when a slave address is 0000000b if(iicSt&0x1) / when ACK isnt received switch(_iicMode) case POLLACK: _iicStatus=iicSt; break;case RDDATA: if(_iicDataCount-)=0) _iicData_iicPt+=rIICDS; rIICSTAT=0x90; /stop MasRx condit

31、ion rIICCON=0xaf; /resumes IIC operation.Delay(1);/wait until stop condtion is in effect./too long time. /The pending bit will not be set after issuing stop condition.break; _iicData_iicPt+=rIICDS;/The last data has to be read with no ack. if(_iicDataCount)=0)rIICCON=0x2f;/resumes IIC operation with

32、 NOACK. else rIICCON=0xaf;/resumes IIC operation with ACK break;case WRDATA: if(_iicDataCount-)=0) rIICSTAT=0xd0;/stop MasTx condition rIICCON=0xaf;/resumes IIC operation.Delay(1);/wait until stop condtion is in effect./The pending bit will not be set after issuing stop condition.break; rIICDS=_iicD

33、ata_iicPt+; /_iicData0 has dummy. for(i=0;i10;i+); /for setup time until rising edge of IICSCL rIICCON=0xaf; /resumes IIC operation. break;case SETRDADDR: /Uart_Printf(S%d,_iicDataCount); if(_iicDataCount-)=0) break; /IIC operation is stopped because of IICCON4 rIICDS=_iicData_iicPt+; for(i=0;i10;i+

34、); /for setup time until rising edge of IICSCL rIICCON=0xaf; /resumes IIC operation. break;default: break; /*/void Isr_Init(void) U32 i; pISR_UNDEF=(unsigned)HaltUndef; pISR_SWI =(unsigned)HaltSwi; pISR_PABORT=(unsigned)HaltPabort; pISR_DABORT=(unsigned)HaltDabort; for(i=_RAM_STARTADDRESS;i(_RAM_STA

35、RTADDRESS+0x20);i+=4) *(volatile unsigned *)i)=0xEA000000+0x1FFE; rINTCON=0x5; / Non-vectored,IRQ enable,FIQ disable rINTMOD=0x0; / All=IRQ mode rINTMSK|=BIT_GLOBAL|BIT_EINT3; / All interrupt is masked.void HaltUndef(void) Uart_Printf(Undefined instruction exception!n); while(1);void HaltSwi(void) U

36、art_Printf(SWI exception!n); while(1);void HaltPabort(void) Uart_Printf(Pabort exception!n); while(1);void HaltDabort(void) Uart_Printf(Dabort exception!n); while(1);235. 调试过程及总结这次试验涉及到了嵌入式的很多知识,比较困难。实验的前几天因为去外地找工作,所以没有去,以为应该蛮简单的,但是事与愿违,在最后几天里毫无头绪的我只能在同学的帮助下才调试出了试验结果。惭愧的说,到现在软件程序还是没有完全理解,但是会继续自己研究外加请教同学,相信很快就能完全弄懂。虽然这次课程设计没有很好的完成,有些遗憾,但是从中还是学到了不少知识,最后谢谢老师细心辅导。6. 参考文献1 三恒星科技编著, ARM7易学通, 人民邮电出版社2 刘彦文等,嵌入式系统原理及接口技术, 清华大学出版社3 实验讲义和课设讲义课程设计成绩评定表成绩评定项 目比例得 分平时成绩(百分制记分)30%业务考核成绩(百分制记分)70%总评成绩(百分制记分)100%评定等级优 良 中 及格 不及格指导教师(签名):20 年 月 日25

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

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1