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.

[参考译文] TMS320F28388D:如何限制 EMIF1(32位)地区的16位总线访问?

Guru**** 2604225 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1087813/tms320f28388d-how-to-restrict-16-bit-bus-access-on-emif1-32-bit-region

部件号:TMS320F28388D

各位专家:

我们应用了 EMIF1 (32位模式,异步模式)来读取和写入 FPGA。

我们将以下功能实施到一个位,以在 FPGA 上启用一个功能。

typedef struct{
....
	union{	/* FSCOM0_CONTROL_UN */
		UINT32 Word_u32;	/* UINT32 Access */
		struct{	/* Bit Access */
			UINT32 COM_EN : 1;	/* BIT0 */
			UINT32 ERROUT_EN : 1;	/* BIT1 */
			UINT32 Reserved : 7;
			UINT32 ERROR_EXTERNAL : 1;	/* BIT9 */
			UINT32 ERROR_HSCOM : 1;		/* BIT10 */
			UINT32 ERROR_INTERNAL : 1;	/* BIT11 */
			UINT32 Reserved2 : 20;
		}BIT_ST;
	}FSCOM0_CONTROL_UN;
.....	
}AX7_FSCOM0_ST;

volatile AX7_FSCOM0_ST AX7_fscom0_stg;

void AX7_Com0SetUnitEnable( void ){

	AX7_fscom0_stg.FSCOM0_CONTROL_UN.BIT_ST.COM_EN = 1UL;
}

void AX7_Com0SetUnitEnable2( void ){

	AX7_fscom0_stg.FSCOM0_CONTROL_UN.Word_u32 = 0x1UL;
}

但是 AX7_Com0SetUnitEnable()无法正常工作。

(AX7_Com0SetUnitEnable2()工作正常)。

我们将这些功能分解并置于下面。

TEXT Section .text:AX7_Com0SetUnitEnable (Little Endian), 0x6 words at 0x00000000 
00000000        AX7_Com0SetUnitEnable:
00000000   0201   MOVB         ACC, #1
00000001   761f   MOVW         DP, #0x1e
00000002   001e
00000003   9802   OR           @0x2, AL
00000004   9903   OR           @0x3, AH
00000005   0006   LRETR        

TEXT Section .text:AX7_Com0SetUnitEnable2 (Little Endian), 0x5 words at 0x00000000 
00000000        AX7_Com0SetUnitEnable2:
00000000   0201   MOVB         ACC, #1
00000001   761f   MOVW         DP, #0x1e
00000002   001e
00000003   1e02   MOVL         @0x2, ACC
00000004   0006   LRETR        

AX7_Com0SetUnitEnable()以16位两次(偶数和奇数地址)访问

和 AX7_Com0SetUnitEnable2()以 32位(偶数地址)访问。

CGT=TI-CGT-C2000_21.6.0.LTS

我们找不到 一个编译器选项来限制 EMIF1地区使用32位的 r/w 访问。

在这种情况下,我不知道为什么 CGT 生成16位访问代码。

请告诉我们如何处理此案?

此致,

Hidehiko

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    各位专家:

    我补充了我们的编译说明。  

    优化= 02+速度4

    -v28 -ml -mt --CLA_support=cla2 --float_support=fpu32 --idev_support=idiv0 --tMU_support=tmu0 --VCU_support=vcrc -O2 --opt_for _speed=4 --fp_mode=elleed\
    -g --abi=eabi

    此致,

    Hidehiko

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hidehiko-san,

    即使16位存取,它也能正常工作吗? 或者您没有将 EMIF 的字节启用连接到外部 FPGA? 将32位访问划分为16位取决于编译器,我不确定如何完成。 我必须将此事提交给编译器团队。

    此致,

    维耶克·辛格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    编译器不支持任何方法来保证16位宽内存读写永远不会被使用。  最好的解决方案是在装配体中写入这些函数。

    谢谢,此致,

    乔治