【有关TI C6000的DSP的EMIF接口的两个问题:地址总线不从零开始问题及寻址范围问题】

C66x EMIF16使用手册

示例芯片:TMS320C6657
EMIF,即ExternalMemoryInterFace ,中文译为外部存储器接口。EMIF16 模块旨在为各种异步存储器设备(如 SRAM、 NOR 和 NAND 存储器)提供接口。 在任何给定时间可以通过四个片选访问这些存储器中的总共 256M 字节,每个片选可以访问 64M 字节。 NOR Flash 可用于启动目的。也可用于数据记录目的。
不支持 DDR1 SDRAM、 SDR SDRAM 和 Mobile SDR 等同步存储器。 下面为手册翻译片段,如果已经阅读请点击目录跳转EMIF16地址总线寻址问题。

EMIF简介及特性

EMIF16模块支持以下特性:
• EMIF16模块支持以下特性高达256MB的异步地址范围超过4个片选
• 8 位和 16 位数据宽度
• 每个片选的可编程周期时序
• Extended wait support (if available model supports)扩展等待支持
• Select Strobe mode support (if available model supports)选择 Strobe 模式支持
• 支持对NOR Flash 的页/突发模式读取
• 8 位和 16 位 NAND Flash 的 1 位 ECC(不支持纠错)
• 8位和16位NAND Flash的4位ECC(不支持纠错)
• 支持大端和小端操作
EMIF16 模块不支持以下功能:
• 同步设备,如 SDRDRAM、 DDR1 SDRAM 和 Mobile SDR
32位模式操作
• OneNAND 和 PCMCIA 接口
• NAND Flash 需要片选在读取 tR 期间保持低电平

注意—每个片选 64MB 的限制仅适用于使用 EMIF16 地址总线进行寻址的异步存储器 - 通常是 ASRAM 和 NORflash。 NAND flash 使用数据总线作为复用数据/地址总线,不使用 EMIF16 地址引脚进行寻址(只有CLE 和 ALE 信号使用地址总线。更多详细信息请参阅‘‘NAND Flash Mode’’ )。所以 NAND Flash > 一个片选可支持 64MB。

EMIF16 信号说明

EMIF16 异步接口的基本框图如图 Figure 2-1所示。 Table 2-1 下面列出了 EMIF16 模块
的异步信号。
在这里插入图片描述
在这里插入图片描述

异步访问配置 EMIF16

EMIF16 支持以下模式:
• WE 选通脉冲模式
• Select Strobe Mode

EMIF16时钟为CPU/6频率。因此,对于运行在1GHz的设备, EMIF16锁定在166.67 MHz。所有对时钟/时钟周期的引用都是用emif16时钟周期表示的。

在WE 选通模式下,字节使能 #EMIFBE[1:0]可用于激活当前芯片选择空间的写选通。#EMIFCEx(x=0,1,2,3) 片选信号将在整个异步访问期间保持激活状态。 这种模式的主要优点是它允许两个 8 位设备连接到同一个片选。 在这种模式下,字节使能连接到两个 8 位器件的写选通。 WE 选通模式是 CE3 支持的默认模式。 CE0-2 不支持 WE 选通模式。

Select Strobe (SS) 模式通过设置异步配置寄存器中的“ss”位来激活所考虑的芯片选择。 每个芯片选择有一个异步配置寄存器。 有关异步配置寄存器的更多详细信息,请参阅 Section 4.4. 在SS模式下,片选作为选通信号。 因此片选 #EMIFCEx将跟随 #EMIFOE 进行读取, #EMIFWE 进行写入,并且仅在选通期间有效。EMIFBE[1:0] 作为字节使能。 所有 4 个片选均支持 SS 模式。WE strobe 模式不能与Select Strobe 模式一起使用。 Select Strobe模式会覆盖 WEstrobe 模式。(“#”在此文档表示控制信号低有效)

EMIF16 还支持扩展等待模式,允许器件在异步访问期间将选通周期延长到选通周期之外。

16 位和 8 位 SRAM/NOR Flash 连接到片选 0 的 EMIF16 连接图分别如图 Figure 2-2 & Figure 2-3。
在这里插入图片描述
在这里插入图片描述
Note—EMIFA[23:22] 表现为地址选择。 对于 16 位接口, EMIFA23 连接到 ASRAM/NOR Flash 的地址引脚 A0。 对于 8 位接口, EMIFA[23:22]连接到 ASRAM/NORFlash 的地址引脚 A[1:0]。(这里为何这样接呢?这也是我们后边要解决的问题)
在这里插入图片描述
#EMIFCE, #EMIFWE, #EMIFOE, #EMIFBE[1:0] 是决定读/写周期开始和结束的控制信号。

EMIF16 Truth Table

在这里插入图片描述在这里插入图片描述
各模式下异步读时序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

各模式下异步写时序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
EMIF16用户指南后续内容主要为接NANDflash等配置这个下一篇进行分享;本文接下来着重讲一下遇到的寻址问题;
参考文档: sprugz3a.pdf.

问题引入

在做外部存储测试时,发现66xEMIF16接入16位ASRAM进行Fill Memory test、Bit Walking test、All Address test时发现前两个测试均能通过,第三个测试报错一直以为是自己的代码写错,采用指针方式进行对应指针地址写入存储相应地址,发现写入0x74000000地址时总是伴随其他地址随动,并且写入值会截断保留高16位,起始地址写入值读回值不同;采用单字节写的方式进行检查时发现存储写入总是双字节写入并自动填写下一字节地址;
这里有两个问题困扰着我:
(1)在“KeyStone Architecture External Memory Interface (EMIF16) User Guide”中,提到“EMIFA[23:22] behave as address selects”,是不是EMIFA[23:22] 相当于BA[1:0]?
16位宽时,A23接FLASH的A0,那A22呢?A22还是当地址位吗?这时EMIF16还是支持32MB吗?

(2)为什么EMIF的地址总线是从A0到A23共24位,按理来说DSP总线发出的地址是32位的,24位明显不足,这到底是怎么回事?

(3)C6657EMIF为每个CE空间分配了64MB的访问空间,CE0-CE3对应起始地址分别为70000000-74000000-78000000-7C000000,在16位数据宽度模式下,访问空间为(2^24*2)/1024/1024=32MB,
8位数据宽度为(2^24 * 1)/1024/1024=16MB寻址地址小于访问空间64MB(如下表),f访问空间又可以连接4Gb大小的NAND FLASH 这又是为什么?

KeyStone Architecture Literature Number: SPRUGZ3A May 2011 External Memory Interface (EMIF16)》这篇手册里面说的是对应这A0 ,为什么说逻辑字节地址A0不存在,EMIFA23->A0不是EMIFA23->A1啊???我算了一下,按照16bit接法访问的大小为2^24*16=268435456 bit=256 Mbit=32 MByte;手册上不是说一个CE可以访问64MByte吗?是哪理解错了呢?
在这里插入图片描述

问题解决

先来看第一个问题:
(1)从User Guide上看,EMIF是支持32MB NORFlash的: “A total of 256M bytes of any of these memories can be accessed at any given time via four chip selects with 64M byte access per chip select.”

(2)是不是EMIFA[23:22] 相当于BA[1:0]?

    在16bit接口时,EMIFA的[22:0]连到Flash的A[N:0],EMIFA[23]是“connected to address pin A0 of the ASRAM/NOR Flash”作为“address selects”。

    在8bit接口时,EMIFA的[21:0]连到Flash的A[N:0],EMIFA[23:22] connected to address pins A[1:0]。

(3)16位宽时,A23接FLASH的A0,A22还是当地址位吗?这时EMIF16还是支持32MB吗?

   A22此时还是作地址位,这时EMIF16还是支持32MB的。我的理解是,EMIFA[23:0]这24位虽然在Flash这一侧功能有不同,但是从EIMIF上看,这24位都是外部地址接口,每个CE所支持的Flash容量为2^24*16bit=2^28bit=32M byte.

第二个问题:
EMIF16有A0-A23共24根地址线和D0-D15共16根数据线,也就是说数据总线是“半字”的,再注意一下表6-63中有关寻址范围的单位是BYTES,一个半字等于2个字节,而如果寻址2个字节则需要1位地址线。嗯,这就对了,EMIF16的地址总线无低0位,其实是因为它的数据总线是16位的缘故,即数据总线对数据的操作是以2个字节为单位的,所以根本没必要再包含最低位的地址线了……

当然,EMIF有16位数据线,我们可以只选择使用它的低八位;以EMIF使用16位数据总线为例,我们要在DSP中使用EMIF时,访问的地址是偶数,比如0,2,4等等,再具体点说吧,使用EMIF的CE1片选的地址范围,我们可以这样在CCS中编程使用EMIF接口:

*(short int *)(0x74000000)= 0x11;

(short int *)(0x74000000)是将0x74000000强制类型转换成short int型的指针类型,即得到指向地址0x74000000的指针,而地址0x74000000中存是一个16bit的数据(其实是和0x74000001合在一起了吧);

*(short int *)(0x74000000)则是取出地址0x74000000中存储的值;

那么这时EMIF16的地址总线上是什么情况呢?访问地址0,当然24位地址总线都是0了;但若是*(short int *)(0x74000002)呢?注意,这时地址总线是1而不是2,因为地址总线是从A1开始的,而不是A0!因此地址总线congA开始;而地址线是与寻址空间对应的EMIF16一个片选最大空间为64MB,如果是32位地址线的话寻址范围为232*2Byte=8GB远大于其片选范围因此不需要32位地址线,选择24地址线是为了既满足SRAM的<=32MB寻址要求又满足SDRAM的<64MB寻址要求;

第三个问题:
首先看一个TI官方文档:《TMS320C6000 DSP External Memory Interface(EMIF) Reference Guide【SPRU266E】》,这个文档一开始就讲了很多存储器类型.

下面看表4-3
在这里插入图片描述
表中的第一列是memory type,即存储器类型,共有三种,异步静态RAM(ASRAM),可编程同步存储器,同步动态RAM(SDRAM)
注意第三列是maximum addressable bytes per CE space,即每CE片选空间最大可寻址字节数,其中对于前两种类型的存储器都是对应相同的,但对于SDRAM来说则变为了前面两者的32倍!

20根地址线,寻址范围为2^20=1M;对于EMIFA来说,他的数据总线为双字(8bytes),则它的寻址字节数为1M8bytes=8MBytes;对于EMIFB来说,它的数据总线为半字(2bytes),则它的寻址范围为1M2bytes=2MBytes。
这与表中是吻合的,但是对于64位数据总线中的256MB的寻址范转和16位数据总线中的64MB的寻址范围是怎么回事呢?

即对于EMIF16,他有24跟地址线EMIFA [23:0],其寻址范围为2^24=16M;它的数据总线为半字(2bytes),则它的寻址范围为16M*2bytes=32MBytes。
在这里以SDRAM为例来说,它是分行地址和列地址的,即对其进行访问时分行和列之分,如果行地址有10位,列地址有16位,那么相当于寻址范围为210 *216=226 =64M;
EMIF16的每个CE片选空间相对于SDRAM来说寻址范围64MB,而相对于其它类型的memory为32MB。

由总线宽度计算,寻址能力首先来学习下微机原理中有关存储器的描述:
在这里插入图片描述
本质上说,寻址能力寻的是存储单元,而不是存储内容。地址总线宽度为16根,则它可以寻找的最多数量的存储单元数量是多少(一个内存单元可以存储8bit的二进制数据)?那当然是216次方,也就是2^6K=64K个存储单元(8bit)。寻址能力的单位应该是64K个内存单元(B)。

EMIF16 地址与DSP地址总线对应关系

DSP生成的是32位地址,而EMIF只能发送其中的24位,是DSP的第1位到第24位,第0位不发送,DSP地址的第1位连接在A23引脚上,第2到第24位分别映射A0到A22。举个例子容易理解,运行以下程序:(这里直接用int16 int32代表不同数据宽度整型类型)

Uint16 data = 1;
*(Uint16*)0x74001003 = data;

抓取EMIF总线可以看到地址为800400,对应【A23:A0】,将A23拼到最低位,整理得到的地址成为801。左移一位变为1002,所以可以看到发送的是78001003的第1位到第24位,0位没发送。
在SRAM中接收到地址首先将A23拼到最低位,即【A22:A0,A23】,将拼完后的十六进制地址左移一位,便是DSP实际发送的地址。

那么第0位干嘛用的,为什么不发送呢?据我研究,这一位主要用于8位数据模式下工作,0发送低八位,1发送高八位,对于16位数据模式这一位没有任何影响。举例说明,将emif配置为16位模式,发送一个十六位的数据给8位地址线

Uint16 data = 0x1007;
*(Uint8*)0x74001000 = data;//A
*(Uint8*)0x74001001 = data;//B

A语句后总线数据为0x0007
B语句后总线数据为0x0700
所以第0位控制八位数据放在高8位还是低8位。当然,如果emif配置为8位模式,也就不存在这个问题了,直接发送0x07到data线上。

那么,可以推理出在16位emif宽度下,发送或者接收32位数据时,第1bit起到了类似的作用,所以将其放在了最高位发送。
EMIF读写总线数据和内存数据可参见
EMIF寻址空间

参考

1)《TMS320C6414, TMS320C6415, TMS320C6416 FIXED-POINT DIGITAL SIGNAL PROCESSORS(SPRS146N)》

2)《TMS320C6000 DSP External Memory Interface(EMIF) Reference Guide(SPRU266E)》
[1]: https://blog.csdn.net/xinyizhangwei/article/details/17001721
[2]: https://www.cnblogs.com/mfc1207/p/3937235.html

  • 3
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值