ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:54.98KB ,
资源ID:5362654      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5362654.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(FPGAi2c实验.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

FPGAi2c实验.docx

1、FPGAi2c实验简介 这一节,我们来讲一讲有关IIC总线的实验,在硬件中,我们实用了24LC04,一个512字节的EEPROM。在NIOS II中,没有集成IIC接口,为了实现这一功能,我们有两种途径,一种就是自己写IP核或者移植别人的IP核,另一种方法就是通过IO口模拟IIC总线协议。我们这一节采用的方法是后者,通过IO口模拟IIC总线协议,以达到对24LC04控制读写的目的。 首先,我简单介绍一下IIC总线的原理,大家稍微了解一下。IIC(InterIntegrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和

2、时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。它在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,则判断为受

3、控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。下图就为IIC总线的时序图。简单介绍之后,我们就要开始实践一下了,开始吧硬件开发 首先,需要在软核中添加两个IO模块,并将其命名为SCL和SDA,其中,SCL为output建ports only(仅输出),SDA为Bidirection (tristate) port(双向),建好以后,如下图所示 接下来,我们自动分配一下地址,编译。完成后,我们回到Quartus界面。然后我们来分配引脚,如下图所示 分配好管脚以后,我们运行TCL脚本文件,开始编译(Ctrl+L) 编译完成后,我们的硬件部分就结束了,接下来,就是我们

4、的软件开发部分了。软件开发 首先,我们打开NIOS II 9.0 IDE,然后进行编译(Ctrl+B)。 编译好以后,我们看一下system.h文件,看是否多出了SCL和SDA部分代码。跟我们预期的一样,system.h文件中出现了SCL和SDA部分代码,如下表所示/* * SCL configuration * */#define SCL_NAME /dev/SCL#define SCL_TYPE altera_avalon_pio#define SCL_BASE 0x00201060/* * SDA configuration * */#define SDA_NAME /dev/SDA#d

5、efine SDA_TYPE altera_avalon_pio#define SDA_BASE 0x00201070 在跟大家讨论过程中,我了解到很多人都想知道有关NIOS II自带的API的用法,所以,今天我就用这种方式来实现我们的程序。不过我还是推荐大家用我之前的方式编写程序,道理我已经说过了, 在此不再重复。下面我们在inc目录下建立一个iic.h文件,如下表所示#ifndef IIC_H_#define IIC_H_#define OUT 1#define IN 0typedef struct void (* write_byte)(unsigned short addr, unsi

6、gned char dat); unsigned char (* read_byte)(unsigned short addr);IIC;extern IIC iic;#endif /*IIC_H_*/接下来,我们需要在driver下建立iic.c文件,如下表所示#include #include #include #include system.h#include altera_avalon_pio_regs.h#include alt_types.h#include ./inc/iic.hstatic alt_u8 read_byte(alt_u16 addr);static void w

7、rite_byte(alt_u16 addr, alt_u8 dat);IIC iic = .write_byte = write_byte, .read_byte = read_byte;/* * = FUNCTION = * Name: start * Description: IIC启动 * = */static void start(void) IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SCL

8、_BASE, 1); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0); usleep(5);/* * = FUNCTION = * Name: uart_send_byte * Description: IIC停止 * = */static void stop(void) IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); u

9、sleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1); usleep(10);/* * = FUNCTION = * Name: ack * Description: IIC应答 * = */static void ack(void) alt_u8 tmp; IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN); us

10、leep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(5); tmp = IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(10); while(tmp);/* * = FUNCTION = * Name: iic_write * Description: IIC写一个字节 * = */void iic_write(alt_u8 dat) alt_u8 i, tmp; IOWR_ALT

11、ERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT); for(i=0; i8; i+) IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(5); tmp = (dat & 0x80) ? 1 : 0; dat = 1; IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, tmp); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(10); /* * = FUNCTION = * Name: read * Descriptio

12、n: IIC读一个字节 * = */static alt_u8 iic_read(void) alt_u8 i, dat = 0; IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN); for(i=0; i8; i+) IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(5); dat 7) & 0xfe; start(); iic_write(cmd); ack(); iic_write(addr)

13、; ack(); iic_write(dat); ack(); stop(); /* * = FUNCTION = * Name: read_byte * Description: 从EEPROM读一个字节 * = */static alt_u8 read_byte(alt_u16 addr) alt_u8 cmd, dat; cmd = (0xa0 | (addr 7) & 0xfe; start(); iic_write(cmd); ack(); iic_write(addr); ack(); start(); cmd |= 0x01; start(); iic_write(cmd); a

14、ck(); dat = iic_read(); stop(); return dat;最后,我们来建立main.c函数#include #include ./inc/iic.h#include #include alt_types.halt_u8 write_buffer512, read_buffer512;int main() alt_u16 i, err; alt_u8 dat; printf(nWriting data to EEPROM!n); /写入512btye的数据,前256个数字为0到255,后256个数据为1 for(i=0; i512; i+) if(i256) dat

15、= i; else dat = 1; iic.write_byte(i, dat); write_bufferi = dat; printf(0x%02x , dat); usleep(10000); printf(nReading data from EEPROM!n); /将512byte数据读出来并打印 for(i=0; i512; i+) read_bufferi = iic.read_byte(i); printf(0x%02x , read_bufferi); usleep(1000); err = 0; printf(nVerifing data!n); /对比数据是否相同,如果

16、有不同,说明读写过程有错误 for(i=0; i512; i+) if(read_bufferi != write_bufferi) err +; if(err = 0) printf(nData write and read successfully!n); else printf(nData write and read failed!-%d errorsn, err); return 0; 程序很简单,大家只要对IIC总线有一定的了解就会明白的。 好的,这节的内容就讲到这,谢谢大家对我的支持。如果有问题,可以给我留言或者直接加入我们的NIOS技术高级群:107122106,也可以加我的qq:984597569

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

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