This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我们在 TMS570LC4357上使用 EMIF (具有 ARMCortex
- R5F)。 根据数据表(如下所示)、EMIF 为 BE8、器件为 BE32。 数据表中提供了连接总线以执行格式转换的说明。
我们的器件包含一个32位只读寄存器、地址为0x60000024、设置为0x18101207、该器件使用数据表中给出的 BE8/BE32接线连接到 EMIF。 我们已经观察到、读取地址偏移量0x4和0x6为16位(半字)读取数据时、数据看起来是正确的、但当读取偏移量0x4处的32位字时、半字会交换。 结果如下:
读取 ADDR=0x60000024、size=16;返回值= 0x1207 <-预期值
读取 ADDR=0x60000026、size=16;返回值= 0x1810 <-预期值
读取 ADDR=0x60000024、size=32;返回值= 0x12071810 <-意外值(预期为0x18101207)
您能解释一下这种半字交换行为吗?
Coretex-R5手册表明它不支持 BE32、但是 TMS570数据表表明这个器件是 BE32。 您能解释一下这种分歧吗?
TMS570LC4357产品说明书(SPNS195C–2014年2月–2016年6月修订):
EMIF 本质上是 BE8、即字节不变的大端字节序。 该器件是 BE32、即字不变大端字节序。 连接 RAM 或使用8位宽数据总线时没有区别。 但是、当从外部 ROM 读取数据或通过16位宽数据总线连接到硬件寄存器时、会产生影响。 通过将 EMIF_DATA[7:0]连接到 ROM 或将 ASIC DATA[15:8]、将 EMIF_DATA[15:8]连接到 ROM 或 ASIC DATA[7:0]、可以将 EMIF 设置为 BE32。
或者、存储在 ROM 中的代码可以链接为-be8而不是-be32。
对于16位 EMIF 接口上的32位访问、将首先输出低16位(EMIF_BA[1]将为低电平)、然后输出高16位(EMIF_BA[1]将为高电平)。
Coretex-R5技术参考手册(ARM DDI 0460D ID092411):
处理器支持字节不变的大字节序 be-8和小字节序 LE。 处理器不支持字不变的大字节序 be-32。 C1的位[7]、控制寄存器始终为0。