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.

[参考译文] Starterware/AM3352:如何访问 AM3352至 DSP TMS320VC5502的 GPMC 寻址空间

Guru**** 2614265 points
Other Parts Discussed in Thread: AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/574273/starterware-am3352-how-to-access-gpmc-addressing-space-for-am3352-to-dsp-tms320vc5502

器件型号:AM3352

工具/软件:Starterware

大家好、

-请查看此代码和指南,了解 CS 配置是否正确。

-我的任务是从提供一个连接到 AM3352到 GPMC 的接口、并检查 DSP 的 CRO、CS 引脚中的信号。

- StarterWare_AM335X_02_00_01_01  

///----------------------------------------------------------

//@包括
///----------------------------------

#include "hw_control_am335x.h"
#include "consoleUtils.h"
#include "hw_cm_wkup.h"
#include "hw_cm_per.h"
#include "evmAM335x.h"
#include "SoC_AM335x.h"
#include "interrupt.h"
#include "hw_gpmc.h"
#include "hw_types.h"
#include "gpmc.h"
#include "cache.h"
#include "MM4.h"
#include "delay.h"
#include "hw_types.h"
#include "GPIO_v2.h"

#define GPIO_Instance_PIN_NUMBER (27)

#define __raW_writel (v、a)(*(volatile unsigned int *)(a)=(v))

#define __raW_readl (a)(*(volatile unsigned int *)(a))


#define DSP_HPI_BASE 0x11000000 // CS = CS2


#define DSP_HPIC_LOW (DSP_HPI_BASE + 0x0000)// HPIC 高字节
#define DSP_HPIC_HIGH (DSP_HPI_BASE + 0x0004)// HPIC 低字节
#define DSP_HPID_LOW (DSP_HPI_BASE + 0x0001)// HPID 高字节(自动递增)
#define DSP_HPID_HIGH (DSP_HPI_BASE + 0x0005)// HPID 低字节(自动递增)
#define DSP_HPIA_LOW (DSP_HPI_BASE + 0x0002)// HPIA 高字节
#define DSP_HPIA_HIGH (DSP_HPI_BASE + 0x0006)

///----------------------------------
//@函数
///----------------------------------

void GPMCPinMuxSetup (void);
void GPMCCSTimingConfigure();
void DspReset();

/**
*******------------------------------------------------------------------------------------------------------
*@name:main
*@参数:无
*@参数:无
*@返回:0
*@简介:此应用程序的主要功能
*******------------------------------------------------------------------------------------------------------
*

int main (空)

unsigned int data = 0;
// unsigned int *ptr;

控制台 UtilsPrintf ("\n********* AM3352至 GPMC 接口应用*********** \n");

//在 ARM 处理器的 CPSR 中启用 IRQ
IntMasterIRQEnable();

//初始化 ARM 中断控制器
IntAINTCInit();

//配置 DMTimer 实例
DelayTimerSetup();

// GPMC 引脚复用设置
GPMCPinMuxSetup();

// GPMC 时钟设置
GPMCClkConfig();

// GPMC 复位
GPMCModuleSoftReset (SOC_GPMC_0_regs);

//等待 GPMC 复位状态获取
while ((GPMCModuleResetStatusGet (SOC_GPMC_0_regs))=0);

// GPMC CS 配置
GPMCCSTimingConfigure();

// DSP 复位
DspReset();


while (1)

控制台 UtilsPrintf ("GPMC 模式被选择读取\n");
数据=__raW_readl (DSP_HPI_BASE);

控制台 UtilsPrintf ("数据为:%x\n",data);
//数据= 0;
延迟(1000);

控制台 UtilsPrintf ("GPMC 模式选择写入\n");

_raW_writel (0x1234、DSP_HPI_BASE);

延迟(1000);

控制台 UtilsPrintf ("GPMC 模式被选择读取\n");

数据=__raW_readl (DSP_HPI_BASE);

控制台 UtilsPrintf ("数据为:%x\n",data);
//数据= 0;
延迟(1000);

ConsoleUtilsPrintf ("程序成功执行\n"\n);
}/* main 的末尾*/

空 GPMCCSTimingConfigure()

//禁用芯片 SELECT2
GPMCCSConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、GPMC_CS_DISABLE);

// CS2配置时序
GPMCCSConfig1 (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x00001000);

//配置芯片选择信号的时序参数
GPMCCSTimingConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x00101001);

//此函数为 ADV#信号配置时序参数
GPMCADVTimingConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x22060514);

//此函数为 W#和 OE#信号配置时序参数
GPMCWEAndOETimingConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x10057016);

//此函数用于配置 RdAccessTime 和 CycleTime 时序参数
GPMCRdAccessAndCycleTimeTimingConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x010f1111);

//此函数配置 Cycl2Cycle 和 BusTurnAround 计时参数
GPMCycle2CyclAndTurnArndTimeTimingConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x8f070000);

//启用芯片 SELECT2
GPMCCSConfig (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、GPMC_CS_ENABLE);

//设置芯片 SELECT2的基址
GPMCBaseAddrSet (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、0x10);

//设置芯片选择屏蔽地址或大小
GPMCMaskAddrSet (SOC_GPMC_0_regs、GPMC_CHIP_SELECT_2、GPMC_CS_SIZE _16MB);

空 DspReset()

GPIO1ModuleClkConfig ();

GPIO1Pin27PinMuxSetup ();

GPIOModuleEnable (SOC_GPIO_1_regs);

GPIOModuleReset (SOC_GPIO_1_regs);

GPIODirModeSet (SOC_GPIO_1_regs、GPIO_instance_PIN_number、GPIO_DIR_output);

GPIOPinWrite (SOC_GPIO_1_regs、GPIO_instance_PIN_number、GPIO_PIN_low);

/**
*******------------------------------------------------------------------------------------------------------
*@name:GPMCPinMuxSetup
*@参数:无
*@返回:无
*@简介:初始化 GPMC 至 DSP 引脚多路复用。
*******------------------------------------------------------------------------------------------------------
*

空 GPMCPinMuxSetup (空)

/* GPMC_AD0 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (0))=
(0 << CONTRAL_CONF_GPMC_AD0_CONF_GPMC_AD0_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD0_CONF_GPMC_AD0_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD0_CONF_GPMC_AD0_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD0_CONF_GPMC_AD0_RXACTIVE_SHIFT);

/* GPMC_AD1 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (1))=
(0 << CONTRAL_CONF_GPMC_AD1_CONF_GPMC_AD1_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD1_CONF_GPMC_AD1_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD1_CONF_GPMC_AD1_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD1_CONF_GPMC_AD1_RXACTIVE_SHIFT);

/* GPMC_AD2 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (2))=
(0 << CONTRAL_CONF_GPMC_AD2_CONF_GPMC_AD2_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD2_CONF_GPMC_AD2_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD2_CONF_GPMC_AD2_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD2_CONF_GPMC_AD2_RXACTIVE_SHIFT);

/* GPMC_AD3 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (3))=
(0 << CONTRAL_CONF_GPMC_AD3_CONF_GPMC_AD3_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD3_CONF_GPMC_AD3_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD3_CONF_GPMC_AD3_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD3_CONF_GPMC_AD3_RXACTIVE_SHIFT);

/* GPMC_AD4 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (4))=
(0 << CONTRAL_CONF_GPMC_AD4_CONF_GPMC_AD4_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD4_CONF_GPMC_AD4_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD4_CONF_GPMC_AD4_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD4_CONF_GPMC_AD4_RXACTIVE_SHIFT);

/* GPMC_AD5 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (5))=
(0 << CONTRAL_CONF_GPMC_AD5_CONF_GPMC_AD5_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD5_CONF_GPMC_AD5_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD5_CONF_GPMC_AD5_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD5_CONF_GPMC_AD5_RXACTIVE_SHIFT);

/* GPMC_AD6 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (6))=
(0 << CONTRAL_CONF_GPMC_AD6_CONF_GPMC_AD6_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD6_CONF_GPMC_AD6_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD6_CONF_GPMC_AD6_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD6_CONF_GPMC_AD6_RXACTIVE_SHIFT);

/* GPMC_AD7 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_AD (7))=
(0 << CONTRAL_CONF_GPMC_AD7_CONF_GPMC_AD7_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD7_CONF_GPMC_AD7_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_AD7_CONF_GPMC_AD7_PUTYPESEL_SHIFT)|
(1 << CONTRAL_CONF_GPMC_AD7_CONF_GPMC_AD7_RXACTIVE_SHIFT);

/* GPMC_CS2 */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_CSn (2))=
(0 << CONTRAL_CONF_GPMC_CSN2_CONF_GPMC_CSN2_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_CSN2_CONF_GPMC_CSN2_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_CSN2_CONF_GPMC_CSN2_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_CSN2_CONF_GPMC_CSN2_RXACTIVE_SHIFT);

/* GPMC_oen_REN */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_OE_REN)=
(0 << CONTRAL_CONF_GPMC_oen_REN_CONF_GPMC_oen_REN_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_oen_REN_CONF_GPMC_oen_REN_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_oen_REN_CONF_GPMC_oen_REN_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_oen_REN_CONF_GPMC_oen_REN_RXACTIVE_SHIFT);

/* GPMC_WEN */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_WEn)=
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_RXACTIVE_SHIFT);

// GPMC AA0
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_A (0))=
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_RXACTIVE_SHIFT);

// GPMC AA1
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_A (1))=
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_RXACTIVE_SHIFT);

// GPMC Aa2
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_A (2))=
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_RXACTIVE_SHIFT);

// GPMC Aa3
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_GPMC_A (3))=
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_MMode_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUDEN_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_PUTYPESEL_SHIFT)|
(0 << CONTRAL_CONF_GPMC_Wen_CONF_GPMC_Wen_RXACTIVE_SHIFT);

-我根据我的原理图配置了代码。

在这里,CS 的代码读取和写入时间不会变为低电平。

问题:1 GPMC 访问是否缺少任何配置?

问题:2 请确认我、CS 配置是否正确。 我在这里设置的基地址(0x11000000)是正确的、是正确的还是不正确的?

- DSP 大小为16 MB。

此致、

Vamsi。

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

    -当读取和写入时间时、CS 不会变为低电平(在 CRO 上检查)。

    请告诉我哪里出错了

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


    此致、
    Vamsi。