说说K60的FlexBus外扩SRAM接口电路.docx

上传人:b****3 文档编号:4404436 上传时间:2023-05-07 格式:DOCX 页数:16 大小:432.29KB
下载 相关 举报
说说K60的FlexBus外扩SRAM接口电路.docx_第1页
第1页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第2页
第2页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第3页
第3页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第4页
第4页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第5页
第5页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第6页
第6页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第7页
第7页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第8页
第8页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第9页
第9页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第10页
第10页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第11页
第11页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第12页
第12页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第13页
第13页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第14页
第14页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第15页
第15页 / 共16页
说说K60的FlexBus外扩SRAM接口电路.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

说说K60的FlexBus外扩SRAM接口电路.docx

《说说K60的FlexBus外扩SRAM接口电路.docx》由会员分享,可在线阅读,更多相关《说说K60的FlexBus外扩SRAM接口电路.docx(16页珍藏版)》请在冰点文库上搜索。

说说K60的FlexBus外扩SRAM接口电路.docx

说说K60的FlexBus外扩SRAM接口电路

 最近一直在画Kinetis和FPGA的板子(所以真是忙得都没时间更新博客了,呵呵),对Kinetis的硬件电路设计上有点心得,所以为了怕自己以后忘记了同时也为了继续俺的开源计划,所以这里就开始先挑出一个来说说,当然没想过能做出多大贡献,只是希望能给准备开始着手设计电路的网友一点借鉴,进而能少走一些弯路(自己在摸索设计的时候就走了很多弯路),所以前车之鉴这里就晒给大家了,覆辙之路还是不走为好,哈哈~

  本篇就先说说Kinetis的SRAM接口电路(放心,以后还有其他的,敬请期待,呵呵),可能会有人提出来128k还不够吗,嵌个操作系统都足以了,其中原因一是自己可能会用到,二是即使用不到,咱玩玩不好吗,哈哈,飞思卡尔都给出接口了,咱不用白不用,俺就是这个原则,只是可惜手里的这个K60没有DRAM接口(K60有些系列还是有的,还有NANDFlash控制器的),有的话也会加上玩一玩的,哈哈,不要扔砖啊。

下面进入正题:

  首先还是先介绍下FlexBus的特点,至于什么是FlexBus,其实就是飞思卡尔家的一种灵活的外部总线接口,可以用来扩展例如像外部ROM,SRAM,可编程逻辑器件或者一些从设备之类的,下面是一些特点:

(1)六个独立的可编程片选端口,nFB_CS[5:

0](加n是因为打不出来横杠,呵呵,只能用n表示低电平片选了);

(2)8位,16位,32位可配置端口,包括数据和地址;

(3)数据传送可编程为8位,16位,32位,根据相应的外部设备数据端口的位数决定(8,16or32);

(4)内部软件可编程的总线冲突机制;

......

  特点列出来的不是很全,知道部分即可,因为等真正软件编程的时候自然会用到。

当然想要设计SRAM接口,光知道特点可不行,还需要它的操作模式,因为这涉及到地址总线和数据总线的复用的问题,有些系列pin多的话可以不用考虑复用问题,当然如果为了布线简单化还是建议复用的好,不过遇到复用就会问题多多,这也是我想要分享的一个经验,在复用问题上要多加注意,因为其地址总线一般为固定的32位地址,而其数据总线根据外部设备可配置为8bit,16bit或者32bit,而且在复用的情况下数据的对齐方式也可以配置,例如左对齐data[8:

0]则对应FB_AD[31:

24],右对齐则对应为FB[7:

0],这里建议用默认的左对齐方式,因为这就可以不用考虑地址锁存的问题,这个问题曾经困扰了我很长时间,这里几句话解释不清楚,等下次准备从零入手系列的FlexBus模块软件篇里会详细的说一下,下面就上图了,哈哈~

  下图1为飞思卡尔Tower系统的SRAM接口图,用的是飞思卡尔自家的256k*16bit的异步SRAM,即MR2A16A。

注意其中FB_AD0_B为FB_AD0的倒相,其实可以用常见的6倒相器逻辑门芯片74LS04即可,不过因为只用到一个倒相,有些浪费资源了,官方给出的是单倒相74LVC1G04,这样即省体积又省成本,不过我为了简化还有就是省钱了(俗了点,哈哈)就只用了个三极管简单搭了一个倒相器,见图2.

  下图2为自己画的SRAM接口电路,这里我没用飞思卡尔的RAM,而是换了常见的三星的1M*16bitRAM,即IS61WV102416,毕竟这个市场上比较容易买得到,而且工程应用的较多,出货比较稳定,所以价格较便宜,哎,真是逼的,穷学生没有钱啊,呵呵~

本来想随便说说,结果还是说了这么多,估计大多数人会直接看图了,哈哈,不过还是建议看一下正题内容部分(前两段就当自己唠家常了,呵呵),有些东西还是需要注意的。

还有就是本篇只是说说硬件接口电路部分,软件篇还会写在从零入手系列里的,到时候会仔细说说寄存器的使用方法和一些重要的注意事项,希望能有所帮助,好了,老话,未完待续~

呼......终于腾出时间更新下博客了,真是好些日子没写了,终于又回归了。

期间几个网友都在问我什么时候更新,哎,有点惭愧,直到今天才更新出来,这几天爆发一下,补补更,嘿嘿(小说体的感觉又来了,有木有)。

这些天感觉还没到盛夏,天气就热的发闷,别的地儿不知道,济南是热成火炉似的了,所以冬暖夏凉的实验室是个好去处,所以说主观上我是不想宅的,但是客观因素让我不得不宅在实验室了,呵呵,那就捋胳膊抹袖子开始整吧(咳咳,喝口水先)~

  从零系列的第十一篇(呵呵,不经意间已经写了十篇了)——FlexBus应用,在上一系列就已经预报了,结果拖到现在,让一些等着的博友等了这么久,惭愧惭愧,以后应承下来的就尽量早点搞完,越拖越写不动,真的体会到这种感觉。

其实前一周一边在准备众星捧月的比赛,一边在写Kinetis的USB底层驱动,一直到前天才开始准备写该篇了,本来是想着趁热打铁的把USB模块介绍出来的,不过还是决定先把这篇补上再说,后续篇章会写出来Kinetis的USB模块(由于USB内容较庞大,我整整搞了一周,所以打算分成几篇写出来,有用到的敬请期待,呵呵,这次不会太久),希望不会让大家失望才好,哈哈。

  FlexBus模块,我早在今年年前就写好了并作为开发框架代码的一部分一块上传到了飞思卡尔创意嘉年华小组里了,后来又写了篇FlexBus外扩SRAM的硬件篇,本来作为核心的软件篇早就该写出来了,结果难产到现在,呵呵,有些东西都忘记了,所以又花费了两天时间熟悉了下,又发现了一些包括软件和硬件上的小Bug,总算今天让它新鲜出炉了,enjoyit......好了,说了这么多,下面进入正题了:

   FlexBus,以前有博友问过我是什么bus,呵呵,其实就是飞思卡尔自己的一种外部总线接口,可以用来扩展诸如外部ROM、SRAM、可编程逻辑器件或者一些从设备之类的,很灵活方便。

我个人觉着感觉挺好用的,自己也实际应用了,扩展了一片ISSI的SRAM,用起来还是比较爽的,不过最开始我的硬件设计上有点问题(建议看本篇的时候结合我写的关于FlexBus的硬件篇《说说K60的FlexBus外扩SRAM接口》,有些东西上篇提了我这里就不重点说了),现在给出改进后的硬件反相电路,以前的FB_AD0的频率达到500kbps以上的时候,FB_AD0_B就会跟不上,波形严重失真,严重的时候三极管不能关断,结果造成反相失败,经过如下改进之后加了一个加速电容,减小集电极电阻,又在基极加了泄流电阻,提高了三极管开关导通速率(这些是硬件设计的一些经验,这里需要提一下,咱们这些搞嵌入式开发的,不能老是盯着单片机软件编程这一块,硬件设计很重要,有时候硬件上的一点点改进有可能会提高你的工程质量一个档次),经过测试FB_AD0达到1M以上还是可以正常工作的,不过如果条件允许的话还是建议用非门反相吧,我当初是为了节省板子面积才折衷了三极管的方式,结果造成了很大的困扰,现在在FlexBusClock20M以下还可以正常使用,再往上就不敢保证了。

以上是对《说说K60的FlexBus外扩SRAM接口》的那篇博客的补充和更正,呵呵,如果上篇已经熟悉了,就直接跳到该段软件编程部分即可,软件编程部分,感觉还是比较简单的,思路较清晰,需要操作的寄存器较少,只要在初始化阶段设置好几个寄存器就可以任意操作FlexBus总线了,呵呵,下面就着重说说软件编程需要的几个寄存器了:

(1)FB_CSARn,即片选地址寄存器:

该寄存器即配置相应的外部片选信号FB_CSn的地址范围的(即基地址),即设定BA段为某个基地址,当MCU寻址范围处在该基地址范围的时候,相应的FB_CSn为低电平,选中相应的外设,从而进行进一步的读写操作。

当然这里需要着重强调一下,这个基地址范围不是我们随意设置的,由Kinetis的内存映射可以看出来,该基地址只在该范围下有效(以前有过博友问过我这个问题,这个地址不能随便设置的),如下:

(2)FB_CSMRn,我姑且叫它片选基地址屏蔽寄存器:

之所以叫它基地址屏蔽寄存器主要是BAM字段的作用了,由FB_CSAR寄存器可知,它只受32位总线地址的高16位影响,如果设置FB_CSARn=0x6000_0000,那么在寻址范围在0x6000_0000~0x6000_FFFF的范围内都是有效的(即FB_CSn有效),即FlexBus的最小寻址地址块为2^16=64KB大小,而如果你想要在该基地址范围下寻址更大的范围,嘿嘿,那就要用到BAM字段了,其作用我觉着用英语表达更容易理解,即 SettingaBAMbitcausesthecorresponding CSARbittobeadon’tcareinthedecode,直接这么说估计好些人不明白,那我就用例子说明一下,设置FB_CSAR[BA]=0x6000,FB_CSMR[BAM]=0x0001,则相应的FB_CS的片选范围为0x6000_0000~0x6000_FFFF和0x6001_0000~0x6001_FFFF连续的128KB的空间,即BAM相应位的作用就是屏蔽了BA相应位在寻址译码上的作用。

说完这个再说下地址连续性的概念,同样设置FB_CSAR[BA]=0x6000,而FB_CSMR[BAM]=0x0004的话,则相应的FB_CS的片选范围则是0x6000_0000~0x6000_FFFF和0x6004_0000~0x6004_FFFF这两个不连续的128KB的空间,而如果设置FB_CSMR[BAM]=0x0007的话,则寻址范围则为0x6000_0000~0x6007_FFFF这连续512KB的空间,呵呵,这个寄存器作用理解起来有点难,所以说了这么多,还没明白的还是继续啃英文datasheet吧。

最后要说说FB_CSMR[V]这个位段,即片选有效信号,这里值得一提的是,MCU复位之后只有FB_CS0有效,如果需要用到其他的片选信号,则必须先置位FB_CSMR0[V](注意是CSMR0),然后才能使用其他片选信号。

(3)FB_CSCRn,即片选控制寄存器:

该寄存器也很重要,涉及到数据端口位数,对齐方式等等,这里就挑我们接下来的软件编程需要的说说。

FB_CSCR[PS],即数据端口大小,跟FB_CSCR[BLS](对齐方式)配合,决定FlexBus数据总线的端口的分配和大小,我由于采用了8位端口(见我的FlexBus的硬件电路设计篇)所以进行了相应的设计。

(4)FB_CSPMCR,即FlexBus的引脚复用功能控制寄存器

这个寄存器涉及到一些复用的选择,根据个人实际应用来配置,所以具体内容还是根据datasheet来设置吧,这里就这么一提,琢磨深入的话还是钻进E文研究一番吧,哈哈~

  主要的寄存器都介绍完了,其实还有IO管脚的复用寄存器,不过独属于FlexBus模块,而且在以前的应用中也都用过,这里就不提了,下面废话不多说了,呵呵,直接上代码了,主要是两个函数接口——FlexBus的初始化函数和管脚复用选择函数(具体操作我都已经注释了,有中文有E文的,至于为什么老用E文注释,是因为觉着有的时候用E文注释看起来更明白些,不知道有同感没,嘿嘿):

/*****************************************************************************************

**Routine:

FlexBus_Init(tounderstandtheworkfolw,refertodatasheetpage714)

**Description:

initializetheFlexBusforexternSRAM

        FB_CS   ---chipselect(Chip_S0,Chip_S1,Chip_S2,Chip_S3,Chip_S4,Chip_S5)

        BASE_ADDRESS---thebaseaddressforthecorrespondingchipselect

        Port_Size ---dataportsize(BIT_8,BIT_16,BIT_32)

        Block_Size ---Block_64KB,Block_128KB,Block_256KB,Block_512KB,Block_1MB

*****************************************************************************************/

voidFlexBus_Init(uint8FB_CS,vuint16*BASE_ADDRESS,uint8Port_Size,uint8Block_Size)

{

 //Chipselectaddressresgister

 FB_CSAR_REG(FB_BASE_PTR,FB_CS)=(uint32)BASE_ADDRESS; /*Setbaseaddress.*/

 //Chipselectcontrolregister 

 FB_CSCR_REG(FB_BASE_PTR,FB_CS)=

          FB_CSCR_PS(Port_Size) /*Setportsize*/

          |FB_CSCR_AA_MASK

          |FB_CSCR_ASET(0x1) 

//         |FB_CSCR_BLS_MASK  /*DataisrightjustifiedonFB_AD,FB_AD[15:

0]*/

          |FB_CSCR_WS(0x1) ; 

 //Chipselectmaskregister

 /*

  *Note:

Atreset,nochip-selectotherthanFB_CS0canbeuseduntil 

  *theCSMR0[V]isset.Afterward,FB_CS[5:

0]functionsasprogrammed. 

 */

 /*Setbaseaddressmaskforcorrespondingaddressspace*/

 FB_CSMR_REG(FB_BASE_PTR,FB_CS)=

          FB_CSMR_BAM(Block_Size) 

          |FB_CSMR_V_MASK ;    /*Enablecssignal*/                

}

下面的函数我根据我的实际板子设计做了些更改,跟我当初上传的不太一样,注意下......

/*****************************************************************************************

**Routine:

FlexBus_Pins_Multiplex

**Description:

configurethepinmuliplexingfunctionaccordingtotheaboveseting

        (FlexBus_Init).

        Defaultsetting:

20MHzFlexBusclock(Besettedinmcg);

                 2M*8bitsspaceaddress

                 4chipselectsignals(cs0,cs1,cs2,cs3)

*****************************************************************************************/

voidFlexBus_Pins_Multiplex(void)

{

 //Chipselectportmultiplexingcontrolregister

 FB_CSPMCR=FB_CSPMCR_GROUP1

(1)   /*FB_CS1*/

       |FB_CSPMCR_GROUP2(0)  /*FB_CS4*/

       |FB_CSPMCR_GROUP3(0)  /*FB_CS5*/

       |FB_CSPMCR_GROUP4

(1)  /*FB_CS2*/

       |FB_CSPMCR_GROUP5

(1)  /*FB_CS3*/

       ;

 //SIM_CLKDIV1|=SIM_CLKDIV1_OUTDIV3(0x3);  /*Hasbeensettedinmcg.cfile*/ 

 /* 

  *ConfigurethepinsneededtoFlexBusFunction(Alt5) 

  *thisexampleuseslowdrivestrengthsettings     

 */

 //address

 PORTB_PCR9 =PORT_PCR_MUX(5);     // fb_ad[20]

 PORTB_PCR10=PORT_PCR_MUX(5);     // fb_ad[19] 

 PORTB_PCR11=PORT_PCR_MUX(5);     // fb_ad[18]

 PORTB_PCR16=PORT_PCR_MUX(5);     // fb_ad[17]

 PORTB_PCR17=PORT_PCR_MUX(5);     // fb_ad[16]

 PORTB_PCR18=PORT_PCR_MUX(5);     // fb_ad[15]

 PORTC_PCR0 =PORT_PCR_MUX(5);     // fb_ad[14]

 PORTC_PCR1 =PORT_PCR_MUX(5);     // fb_ad[13]

 PORTC_PCR2 =PORT_PCR_MUX(5);     // fb_ad[12]

 PORTC_PCR4 =PORT_PCR_MUX(5);     // fb_ad[11]

 PORTC_PCR5 =PORT_PCR_MUX(5);     // fb_ad[10]

 PORTC_PCR6 =PORT_PCR_MUX(5);     // fb_ad[9]

 PORTC_PCR7 =PORT_PCR_MUX(5);     // fb_ad[8]

 PORTC_PCR8 =PORT_PCR_MUX(5);     // fb_ad[7]

 PORTC_PCR9 =PORT_PCR_MUX(5);     // fb_ad[6]

 PORTC_PCR10=PORT_PCR_MUX(5);     // fb_ad[5]

 PORTD_PCR2 =PORT_PCR_MUX(5);     // fb_ad[4]

 PORTD_PCR3 =PORT_PCR_MUX(5);     // fb_ad[3]

 PORTD_PCR4 =PORT_PCR_MUX(5);     // fb_ad[2]

 PORTD_PCR5 =PORT_PCR_MUX(5);     // fb_ad[1]

 PORTD_PCR6 =PORT_PCR_MUX(5);     // fb_ad[0]

 //data

 PORTB_PCR20=PORT_PCR_MUX(5);     // fb_ad[31]usedasd[7]

 PORTB_PCR21=PORT_PCR_MUX(5);     // fb_ad[30]usedasd[6]

 PORTB_PCR22=PORT_PCR_MUX(5);     // fb_ad[29]usedasd[5]

 PORTB_PCR23=PORT_PCR_MUX(5);     // fb_ad[28]usedasd[4]

 PORTC_PCR12=PORT_PCR_MUX(5);     // fb_ad[27]usedasd[3]

 PORTC_PCR13=PORT_PCR_MUX(5);     // fb_ad[26]usedasd[2]

 PORTC_PCR14=PORT_PCR_MUX(5);     // fb_ad[25]usedasd[1]

 PORTC_PCR15=PORT_PCR_MUX(5);     // fb_ad[24]usedasd[0]

 //Defaultcontrolsignals(baseonnumbersofyourperipheraldevicesorfunctions)

 PORTB_PCR19=PORT_PCR_MUX(5);     //fb_oe_b

 PORTC_PCR11=PORT_PCR_MUX(5);     //fb_rw_b 

 PORTD_PCR1 =PORT_PCR_MUX(5);      //fb_cs0_b

 PORTD_PCR0 =PORT_PCR_MUX(5);      //fb_cs1_b

 PORTC_PCR18=PORT_PCR_MUX(5);     //fb_cs2_b

 PORTC_PCR19=PORT_PCR_MUX(5);     //fb_cs3_b 

}

函数接口写好了,下面就需要在app函数里调用了,我这里改写了个测试程序(由官方例程改变而成,如有巧合,实属必然,哈哈),最后是运行之后的效果,可以明显的看到,写进去的数据与读出的数据相符合,测试成功,呵呵,其实有条件的可以看看FB_CSn等几个重要操作信号的波形,那样更直观些,嘿嘿~

/****************************************************************

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

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2