详解FSL kinetis Flexbus 读SRAM

分享到:


我依据的:

手册是:K60P144M100SF2RM;

开发板是:超核K60-K64开发板;

程序是:CH-K-Lib\Project\超核K60-K64开发板-基础例程\13-Flxbus-1驱动SRAM。

超核K60-K64开发板的SRAM用的是256Kx16bit,共512K字节;

芯片上地址线18根,数据线16根;
1
下面针对几个热点进行阐述:

热点一:字节对齐的真正涵义

SRAM的数据宽度可以是8位、16位、32位,如果MCU对SRAM进行16位无符号数据的访问,对于8位宽度的SRAM需要访问两次,对于16位宽度的SRAM访问一次即可,对于32位宽度的SRAM也是访问一次即可;

对于MCU的flexbus端口而言,有32个数据线,那么如果要是读16位或者8位数据端口的SRAM,究竟是哪部分数据线起了作用了呢?如何将Flexbus总线的数据线与SRAM的数据线相连接?

MCU的Flexbus共有32个数据线,在MCU芯片上面就是FB_AD[0..31]。

SRAM数据线个数可能是8、16、32根;在SRAM芯片上面:

• 8位数据宽度的SRAM的数据线就是I/O[0..7]

• 16位数据宽度的SRAM的数据线就是I/O[0..15]

• 32位数据宽度的SRAM的数据线就是I/O[0..31]

如下图,当CSCRn[BLS]为0时,MCU的Flexbus读写数据时:

• 对于32位数据宽度的SRAM,FB_AD[0..31] 与 I/O[0..31]逐个顺次相连,数据在FB_AD[0..31]读写,高字节受nFB_BE_31_24(前面带n 代表是后边字符上边有上划线)控制,低字节受nFB_BE_7_0控制。

• 对于16位数据宽度的SRAM,FB_AD[16..31]与I/O[0..15]逐个顺次相连,数据在FB_AD[16..31]读写,高字节受nFB_BE_31_24控制,低字节受nFB_BE_23_16控制。

• 对于8位数据宽度的SRAM,FB_AD[24..31]与I/O[0..7]逐个顺次相连,数据在FB_AD[24..31]读写,字节就一个,不分高低,这个字节受nFB_BE_31_24控制。
2
如下图,当CSCRn[BLS]为1时,MCU的Flexbus读写数据时:

• 对于32位数据宽度的SRAM,FB_AD[0..31]与I/O[0..31]逐个顺次相连,数据在FB_AD[0..31]读写,高字节受nFB_BE_7_0控制,低字节受nFB_BE_31_24控制。

• 对于16位数据宽度的SRAM,FB_AD[0..15]与I/O[0..15]逐个顺次相连,数据在FB_AD[0..15]读写,高字节受nFB_BE_23_16控制,低字节受nFB_BE_31_24控制。

• 对于8位数据宽度的SRAM,FB_AD[0..7]与I/O[0..7]逐个顺次相连,数据在FB_AD[0..7]读写,字节就一个,不分高低,这个字节受nFB_BE_31_24控制。
3
究竟上面的CSCRn[BLS]为0为1时是什么意思,请看下图:其实BLS就是左右对齐的意思。
4
当CSCRn[BLS]为0时,就是左对齐,需要的一次读写的整个数据单元靠FB_AD[0..31]的左边(FB_AD[24..31]的一边)放。例如:宽度为16时,byte 1对齐与FB_AD[31..24], byte 0对齐与FB_AD[23..16],byte 1受nFB_BE_31_24的控制,byte 0受nFB_BE_23_16控制。

当CSCRn[BLS]为1时,就是右对齐,需要的一次读写的整个数据单元靠FB_AD[0..31]的右边(FB_AD[0..7]的一边)放。例如:宽度为16时,byte 1对齐与FB_AD[15..8],byte 0对齐与FB_AD[0..7],byte 1受nFB_BE_23_16的控制,byte 0受nFB_BE_31_24控制。

热点二:地址线和高低字节线的连接涵义(16位宽度为例)
5
如上图,MCU的flexbus的AD0并没有连接SRAM的A0,而是MCU的flexbus的AD1连接到SRAM的A0。这样,当MCU的AD0-AD31发出32位的地址时,只有AD1-AD18在SRAM端收到信号。所以MCU发出地址第0位在SRAM端总是被屏蔽掉的,也就是偶地址对齐原理。

例如:如果MCU发出0x6000_0000,其实在SRAM收到的就是0x6000_0000;如果MCU发出0x6000_0001,其实在SRAM收到的还是0x6000_0000。

因为SRAM是16位数据端口,来一个偶地址便可以写进去2个字节的数据,所以依旧是SRAM1个字节对于MCU的一个地址。

那么MCU在flexbus 16位数据线读写SRAM的数据,是如何区别高低字节的?其实他是通过字节使能线来识别的。

对于MCU,如下图,这四根线控制了四个字节数据是否被读取锁存或者加载到数据线上;对于左对齐(CSCRn[BLS]为0),当nFB_BE_31_24拉低时,FB_AD[24..31]上面的数据就可以读写通信;
6
对SRAM,如下图真值表,nLB和nUB控制了高低字节的读写。

当nLB=0,nUB=1,读写的是I/O0-I/O7;

当nLB=1,nUB=0,读写的是I/O8-I/O15;
7
所以MCU的FLEXBUS的数据字节使能线与SRAM数据字节使能线连接如下:

对于左对齐(CSCRn[BLS]为0),nFB_BE_31_24连接nUB,nFB_BE_23_16连接nLB。

对于右对齐(CSCRn[BLS]为1),nFB_BE_31_24连接nLB,nFB_BE_23_16连接nUB。

热点三:Transfer Acknowledge(nFB_TA)这个线的用法

nFB_TA是输入线,当外部数据发送完之后,被外部设备拉低,表示接收完成;当MCU读周期收到这个信号之后,就锁存数据或者结束时钟;当MCU写周期收到这个信号之后,就结束时钟;

接下来就牵扯到一个寄存器的位FB_CSCRn[AA],这个位置1之后,MCU在等待几个周期之后就自动锁存数据或者结束时钟,不需要外部nFB_TA来指示了;
8
大家可以了解到上文中的SRAM就没有连接nFB_TA这个线,所以AA 一定要置位;

值得一提的是:如果AA置一了,nFB_TA也连接了,那么当AA的等待周期没有来时,nFB_TA信号到了,MCU会直接听从nFB_TA的信号,不在等待;

热点四:CH-K-Lib\Project\超核K60-K64开发板-基础例程\13-Flxbus-1 驱动SRAM的例程分析

1、Main函数
9
26行是初始化,28行是自测;

2、SRAM_Init函数
10
27行是打开flexbus所有的IO管脚的时钟使能;29行PTC3选成flexbus 的时钟输出管脚并且强输出;
11
30-71行是信号线,地址线,数据线初始化,主要是将IO管脚设成对应功能;
12
73-82行,是初始化FLEXBUS,

74行,SRAM的存储总量是512K字节,

75行,CSCRn[AA]使能,MCU会等待几个周期后自动锁存数据或者停止时钟,

76行,用CS1片选信号,

77行,数据是左对齐,

78行,SRAM的位宽为16,

79行,基地址设为0x6000_0000,

80行,字节使能信号使能,

81行,FlexBus clock的2分频用于FB_CLK,

96-98行,flexbus在同一管脚放在几个功能,CSPMCR寄存器用于选择使用哪个功能;

3、SRAM_SelfTest函数
13
131-134行,就是给SRAM的512K字节的空间赋值,

136行,将SRAM的基地址重新付给p_unit8_t,

137-145行,将SRAM的值读出来比较是否有错;

至此已经写完,本文主要是对几个易错点深入剖析,意在掌握其要领,如有不对之处,多多交流!

继续阅读
IMEC发布全球最小的SRAM芯片,在5nm技术节点上引入STT-MRAM作为最后一级缓存成为可能

2018年5月29日,IMEC宣布制造了全球最小的SRAM芯片,面积缩小了24%,可适用于未来的5nm工艺。这是今年以来在5nm节点上缓存的最先进技术。 需要指出的是,本设计设计虽然适用于5-nm SRAM,但不适合逻辑单元,因为该SRAM需要3个晶体管,才能提供单个FinFET的性能,显然面积比较大且能耗较高。

详解FSL kinetis Flexbus 读SRAM

我依据的: 手册是:K60P144M100SF2RM; 开发板是:超核K60-K64开发板; 程序是:CH-K-Lib\Project\超核K60-K64开发板-基础例程\13-Flxbus-1驱动SRAM。