因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。
1.GPMC介绍
gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。
注意:在这种模式下gpmc_a[0]引脚是没法使用的
1.1GPMC信号线介绍
GPMC分别有下面所示这些信号线。
A【27:0】:gpmc的地址总线
A【16:1】 :gpmc的地址线和数据线复用
nCS【7:0】:gpmc的片寻信号线(低电平有效)
CLK :gpmc的外部时钟信号线
nADV/ALE:gpmc的地址和数据信号使能引脚 (低电平地址有效)
nOE/nRE:读取信号线(低电平有效)
nWE : 写信号线(低电平有效)
GPMC片选
gpmc总共有8个片选 CS0 ~CS7,每个片选都有一组寄存器用来配置对应片寻的模式,时序,地址空间等。8个片选的外部地址线,数据线公用。通过使用信号线0cs~7cs区别要访问的外设。比如有二个外设,A外设是接0cs信号线,B外设接1cs信号线。当你访问A外设时0cs信号线电平就会拉低使能外设。这样就可以访问A外设。而1cs信号量得等你访问B外设时才会使能。当然能正确的访问外设也要建立在配置gpmc配置寄存器正确的基础下。
配置片寻GPMC模式
下面是对config1寄存器主要用于配置片寻的模式,比如数据突发模式,同步或者异步模式,地址和数据是16位还是8位模式等
下面是burst设置位,同时也跟同步通信有关系。而burst跟同个寻址读取数据不同的是burst一次寻址多次数据传输。这里我们配置为0
下面这一位是用于选择单一访问或者复用访问,这里配置成0选择单一访问就行。
下面是选择读操作是同步或者异步通信,这里我们配置成0 异步通信就行
下面是写操作的跟上面的读操作差不多也是选择单一访问和异步通信。所有28bit配置为0, 27bit配置为0
这个默认模式就行
12~13bit位要配置成8位或者16位,因为我们采用的是16位复用要选择0x1
其他位默认模式就可以了
配置时序
config2~config6 是配置时序的配置寄存器
config2寄存器用于配置CS信号的时序
config3寄存器用于配置nADV信号的时序
config4寄存器用于配置WE和OE的信号的时序
config5寄存器要来配置读写周期的时序
config6寄存器好像没什么好配置的可以默认就好
单一读写数据按照下面的这二个图进行配置时序就行
配置访问地址
config7用于配置片选的地址空间
其中8~11bit用于配置片寻的地址空间大小,最小配置16M,最大能配置256M空间大小。0~5bit位用于启动这个片寻。0~5bit用于选择片寻的基地址。比如我8~11bit配置成16M 0~5bit选择0x08对应基地址就是0x800000,这个片寻对应的地址空间就是0x08000000~0x09000000
GPMC的总线机制
上面config1~config7寄存器配置好了,就可以对gpmc总线进行操作了,比如你在config7寄存器配置的地址是0x08000000~0x09000000那我们只要向系统的地址总线0x08000000~0x09000000范围的某个地址写入数据,或者读取数据,芯片就会在gpmc的地址并行接口输出地址,然后在数据并行接口读取或者写入地址。这样接线GPMC的外设就可以根据gpmc的并行接口地址线和数据线跟芯片建立通信了。