emif实现dsp~cpld之间的数据传输

【前言】 本次设计要求实现dsp读取cpld信息的功能。使用芯片cpld是紫光pango系列芯片PGC2KGLPG144,对应开发环境是紫光的PDS(pango design suite);dsp是tiC200系列芯片TMS320F28374S,开发环境CCS。此前已完成gpio实现dsp~cpld之间数据传输,但由于传输速度未达预期,现改用28374emif功能实现两个芯片之间的数据传输。

1.需求

实现DSP读取CPLD数据的功能。

2.分析

  1. DSP应只做到读取数据的功能,禁止写数据引脚。
  2. CPLD向DSP发送的数据包括:CPLD版本信息;状态信息;故障信息。

3.设计

3.1 IO配置

在这里插入图片描述

  1. 输出方向:
    a. 由于DSP只作读的功能,DB[15:0]为数据输入引脚,全配置为输入。
    b. GPIO43作为故障发送使能引脚,配置为输出。
  2. 本模块所有数据引脚DB[15:0]皆配置为异步模式。
  3. 本模块所有数据引脚DB[15:0]皆内部上拉。
  4. 功能引脚(EM1WEN、EM1RNW、EM1CS2N、EM1OEN),数据引脚(DB[15:0]),地址引脚(EM1A0、EM1BA1)皆配置为EMIF功能。

3.2 信息获取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
DSP每次读取某个地址,地址引脚A[19:0]和BA[1]皆会指向该地址。由于本次设计只控制两个地址引脚A0和BA1,最大传输4种类型的数据,与CPLD程序设计吻合。DSP在每次读取周期的固定时间节点使能地址线、片选信号,随后发送数据并重置使能信号,直到下一个读取周期到来。例如:DSP想要读取地址0x100002的数据,地址线高位置1,低位置0,随后CPLD根据地址信号大小发送数据,相关逻辑如下所示:
CPLD会根据当前地址信号ADDRESS的大小选择要输出的数据DATA_OUT,包括fault_bit16、state_bit16、大版本信息、小版本信息。具体如下:
a. 地址信号低位为0高位为0,输出CPLD小版本信息;
b. 地址信号低位为1高位为0,输出CPLD大版本信息;
c. 地址信号低位为0高位为1,输出故障信息;
d. 地址信号低位为1高位为1,输出状态信息。
DSP获取CPLD信息函数详见第四节,该函数返回一个16位的二进制数据,由于CPLD主要功能是获取故障信息,在设计的时候将四种类型的数据分开读取,仅在需要的时候(例如初始化或者故障时)才读取版本信息。

3.3 流程图

在这里插入图片描述

4.编码

4.1 emif初始化

void v_bsp_emif_init(void)
{
    v_bsp_emif_gpio_init();

    // Configure to run EMIF1 on half Rate. (EMIF1CLK = PLLSYSCLK / 2)
    SysCtl_setEMIF1ClockDivider(SYSCTL_EMIF1CLK_DIV_2);

    // Disable Access Protection. (CPU_FETCH/CPU_WR/DMA_WR)
    EMIF_setAccessProtection(EMIF1CONFIG_BASE, 0x0);
    //
    // Commit the configuration related to protection. Till this bit remains set, contents of EMIF1ACCPROT0 register can't be changed.
    EMIF_commitAccessConfig(EMIF1CONFIG_BASE);

    // Lock the configuration so that EMIF1COMMIT register can't be changed any more.
    EMIF_lockAccessConfig(EMIF1CONFIG_BASE);

    // Configures Normal Asynchronous Mode of Operation.
    EMIF_setAsyncMode(EMIF1_BASE, EMIF_ASYNC_CS2_OFFSET, EMIF_ASYNC_STROBE_MODE);

    // Disables Extended Wait Mode.
    EMIF_disableAsyncExtendedWait(EMIF1_BASE, EMIF_ASYNC_CS2_OFFSET);

    // Configure EMIF1 Data Bus Width.
    EMIF_setAsyncDataBusWidth(EMIF1_BASE, EMIF_ASYNC_CS2_OFFSET, EMIF_ASYNC_DATA_WIDTH_16);

    // Configure the access timing for CS2 space.
    gx_emif_parameter.rSetup = 2;
    gx_emif_parameter.rStrobe = 3;
    gx_emif_parameter.rHold = 2;
    gx_emif_parameter.turnArnd = 0;
    gx_emif_parameter.wSetup = 0;
    gx_emif_parameter.wStrobe = 1;
    gx_emif_parameter.wHold = 0;
    EMIF_setAsyncTimingParams(EMIF1_BASE, EMIF_ASYNC_CS2_OFFSET, &gx_emif_parameter);

    return;
}

4.2 信息获取

unsigned int ui_get_cpld_data(GE_EMIF_INFO ge_emif_info)
{
    unsigned int *ui_mem_ptr;

    ui_mem_ptr = (unsigned int*)ge_emif_info;

    return *ui_mem_ptr;
}

5.测试

在freertos任务创建函数里面添加一个cpld_comm_task用来更新DSP接收到的信息。任务阻塞时间设置为100ms。信息获取函数处理时间如下所示:
CH1:低位地址引脚,CH3:高位地址引脚。
在这里插入图片描述
DSP程序读取信息顺序如下,第一个读取类型为故障信息。由图可知,当前故障信息获取时间为234ns,随后高低地址信号电平皆拉高以读取状态信息。
在这里插入图片描述
随后调出时钟模块,打断点到获取故障信息时清零计数,运行一步与四种信息皆获取后的时钟计数如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
28374系统时钟频率200Mhz,46个clock时间为230ns,与实测现象吻合。

6.总结

6.1 版本信息

初次拟定CPLD版本信息为version3.0.1

6.2 提升效率

本次测试是在CPLD时钟为50Mhz的背景下进行的。初始化里面给emif时钟2分频了。若不分频,会出现emif模块地址乱码的情况,如下图所示:
在这里插入图片描述
理论上想要提高emif模块的采样频率应保证emif时钟以最大频率输出。为做到这一点,现对CPLD的时钟输出频率做一些调整。增大CPLD的时钟频率以确保在emif模块满频率采样的时候CPLD能够及时处理得过来。在这里插入图片描述
如上图,适当的对CPLD锁相环功能做一些调整,使其输出一个200Mhz的时钟clkout0,随后在对应顶层文件完成例化。最后提升CPLD的时钟频率为200Mhz。

如上图,顶层例化。
在这里插入图片描述
读取顺序不变,读取的故障信息时间为155ns。
在这里插入图片描述
程序时钟计算时间也为155ns。

6.3 参考资料

Design and Usage Guidelines for the C2000™ External Memory Interface (EMIF)
PDS下PLL实验 - ALINX官方博客 - 博客园 (cnblogs.com)
有关TI DSP的EMIF接口的两个问题-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值