- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)