基于mega16和M45PE16的SPI存储扩展与Proteus仿真.docVIP

基于mega16和M45PE16的SPI存储扩展与Proteus仿真.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于mega16和M45PE16的SPI存储扩展与Proteus仿真 对mega16进行外部存储扩展,用M45PE16作为flash存储的扩展,两设备通过SPI接口进行通信。 用proteus进行仿真,结果如图: 在SPI Debug-Monitor mode窗口我们看到这个程序执行的过程。大概分为3部分: 1,激活 M45PE16 2,把数据写入M45PE16 3,从M45PE16中读出上步写入的数据 源代码如下,M45PE16简称为M了: /*m45pe16.h 头文件,定义了一些常用的东西,在datasheet里都有。前面一堆是对M进行操作的指令,后面的DL,driven low,把ss拉低。DH,driven high,把ss拉高。WAIT,等,等SPI口的传输完毕(每传一个byte就要加个WAIT)。*/ #ifndef M45PE16_H_ #define M45PE16_H_ #define WREN 0X06 #define WRDI 0X04 #define RDID 0X9F #define RDSR 0X05 #define READ 0X03 #define FAST_READ 0X0B #define PW 0X0A #define PP 0X02 #define PE 0XDB #define SE 0XD8 #define DP 0XB9 #define RDP 0XAB #define DH PORTB|=(14) #define DL PORTB=~(14) #define WAIT while(!(SPSR(1SPIF))) #endif /* M45PE16_H_ */ /*memoryspi.c 主程序文件。具体的操作的含义注释里有。*/ #include avr/io.h #include avr/interrupt.h #include avr/delay.h #include m45pe16.h #define byte unsigned char #define word unsigned int byte i; byte init_m45pe16(void){//上电后的初始化M,这个是必须的,在datasheet里有一句话,在开始任何操作之前要有一个falling edge。 DL; DH; return 0; } void init_spimaster(void){//初始化SPI接口的master设备 DDRB|=(14)|(15)|(17);//除了MISO都设为输出 SPCR|=(1SPE)|(1MSTR)|(1SPR0);//使能spi,作为master,分频 SPSR=0x00; } byte spi_mtxd(byte data){//在一个操作周期里传一个byte。一个操作周期,意思是spi接口的ss从拉低,传输,到拉高的一个过程。我们知道在ss为低时是可以传很多byte的 DL;//拉低,可以传数据了 SPDR=data;//对SPDR赋值,自动启动传输 WAIT;//等待传输完成 DH;//拉高,不能再传了 return data; } void spi_wait(void){WAIT;}//这个没啥用了,调用这个函数和写个WAIT在功能上一样。 byte flash_pw(byte *data,byte n){//page write ,写入一页。过程就是:1,write enable,注意这个小过程,是要拉低,wren,拉高,最后必须要拉高才行;2,拉低,page write,3byte的地址,数据,拉高。那个数据只要多于0个字节就行。 byte i; // DL;SPDR=RDSR;WAIT;SPDR=0x00;WAIT;PORTA=SPDR;DH;return 1; spi_mtxd(WREN);//write enable _delay_ms(10); DL; SPDR=PW;WAIT;//page write SPDR=0x1f;WAIT;//address 是由下面的3个byte连起来构成的。直接传就是,M可以理解,虽然mega16不知道它自己在说些什么。 SPDR=0x00;WAIT; SPDR=0x00;WAIT; for(i=0;in;i++){//这就是那堆数据了。连着传就是了,就是,ss一直为低 SPDR=data[i]; WAIT; } DH;//传输完毕,把ss拉高以示结束。必须要的这个。 return 0; } byte flash_read(byte *data,byte n){//读取。这个还好说些。先拉低,1,给M一个读指令。2,3byte的地址,3,读数据

文档评论(0)

***** + 关注
实名认证
文档贡献者

本账号下所有文档分享可拿50%收益 欢迎分享

1亿VIP精品文档

相关文档