F28377S_EMIF_异步读写FPGA

这篇具有很好参考价值的文章主要介绍了F28377S_EMIF_异步读写FPGA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DSP芯片:TMS320F28377SPTPS

基于已有的FPGA程序与板子,操作DSP读取FPGA内的数据。如果写入、读取成功,则点亮LED。文章来源地址https://www.toymoban.com/news/detail-836284.html



//
// Included Files
//
#include "F28x_Project.h"




#define TEST_PASS            0xABCDABCD
#define TEST_FAIL            0xDEADDEAD
#define ASRAM_CS2_START_ADDR 0x100000
#define ASRAM_CS2_SIZE       0x8000
#define EMIF1                0
#define EMIF2                1
#define MEM_D_WIDTH          1            // 16Bit Memory Interface
#define TURN_AROUND_TIME     0            // Turn Around time of 2 Emif Clock
#define RD_SETUP_TIME        0            // Read Setup time of 1 Emif Clock
#define RD_STROBE_TIME       3            // Read Strobe time of 4 Emif Clock
#define RD_HOLD_TIME         0            // Read Hold time of 1 Emif Clock
#define WR_SETUP_TIME        0            // Write Hold time of 1 Emif Clock
#define WR_STROBE_TIME       0            // Write Setup time of 1 Emif Clock
#define WR_HOLD_TIME         0            // Write Hold time of 1 Emif Clock
#define EXTEND_WAIT          0            // Disable Extended Wait
#define STROBE_SEL           0            // Disable Strobe Mode.
#define WAIT_POLAR_INV       0
#define WAIT_COUNT           0

//#define cpu_sel           0
//
// Globals

Uint16  ErrCount = 0;
Uint32  TEST_STATUS;
int i;

//
// EMIF引脚设置
//
extern void setup_emif1_pinmux_async_16bit(Uint16 cpu_sel)
{
	GPIO_SetupPinMux(31,0,2);//第31个引脚,第1个CPU,第3个功能;写入使能
	//GPIO_SetupPinMux(33,0,2);//DF_EMIF_RNW,未使用,外部存储器接口 1 读/不写
	GPIO_SetupPinMux(35,0,2);//DF_EMIF_CSn片选信号
	GPIO_SetupPinMux(37,0,2);//	DF_EMIF_RDn读取使能

	GPIO_SetupPinMux(91,0,0);//BA0,以普通IO作为BA0*
	GPIO_SetupPinMux(92,0,3);//BA1,*

	GPIO_SetupPinMux(93,0,0);//外部中断输出到DSP  32.5us一次
	GPIO_SetupPinMux(62,0,0);//外部中断输出到DSP  32.5us一次

    for (i=38; i<=52; i++)//a0 -a12
    {
        if ((i != 42) && (i != 43))
        {
            GPIO_SetupPinMux(i,cpu_sel,2);
        }
    }
    GPIO_SetupPinMux(86,cpu_sel,2);//A13-A15
    GPIO_SetupPinMux(87,cpu_sel,2);
    GPIO_SetupPinMux(88,cpu_sel,2);

    for (i=69; i<=85; i++)//D0 -D15
    {
        if (i != 84)
        {
            GPIO_SetupPinMux(i,cpu_sel,2);
        }
    }

    for (i=69; i<=85; i++)
    {
        if (i != 84)
        {
            GPIO_SetupPinOptions(i,0,0x31); // GPIO_ASYNC||GPIO_PULLUP
        }
    }

}


//读取值
Uint16 Read_FPGA(long Read_ADD){

	unsigned int Read_data = *((volatile unsigned int *)Read_ADD);

return(Read_data);
}

//写入值
void Write_FPGA(long Write_ADD,long Write_DATA)
{
	*((volatile unsigned int *)Write_ADD)= Write_DATA;
}


//
// Main
//
void main(void)
{
	//memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
	 InitGpio();
	 GPIO_SetupPinMux(34, GPIO_MUX_CPU1, 0);
	 GPIO_SetupPinOptions(34, GPIO_OUTPUT, GPIO_PUSHPULL);
	 GPIO_WritePin(34, 0);//D8L

	//以上LED需要,D8=GPIO34,低电平亮



//
// Initialize system control
//
    InitSysCtrl();

    DINT;

//
//  Initialize the PIE control registers to their default state.
//  The default state is all PIE interrupts disabled and flags
//  are cleared.
    //将PIE控制寄存器初始化为其默认状态。
    //默认状态是禁用所有PIE中断并清除标志。
    //  This function is found in the F2837xS_PieCtrl.c file.
//
    InitPieCtrl();

//
// Disable CPU interrupts and clear all CPU interrupt flags:
//
    EALLOW;
    IER = 0x0000;
    IFR = 0x0000;
    EDIS;

//
// Initialize the PIE vector table with pointers to the shell Interrupt
// GService Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in F2837xS_DefaultIsr.c.
// This function is found in F2837xS_PieVect.c.
//
   InitPieVectTable();

//
//Configure to run EMIF1 on full Rate (EMIF1CLK = CPU1SYSCLK)
//配置为以全速率运行EMIF1(EMIF1CLK=CPU1SYSCLK)
//
  EALLOW;
  ClkCfgRegs.PERCLKDIVSEL.bit.EMIF1CLKDIV = 0x1;//EMIF时钟配置,设置EM1模块运行速度
  EDIS;


//
//Disable Access Protection (CPU_FETCH/CPU_WR/DMA_WR)
 禁止EMIF1模块读写保护
  EALLOW;
  Emif1ConfigRegs.EMIF1ACCPROT0.all = 0x0;
  if(Emif1ConfigRegs.EMIF1ACCPROT0.all != 0x0)
  {
      ErrCount++;
  }

//
// Commit the configuration related to protection. Till this bit remains set
// content of EMIF1ACCPROT0 register can't be changed.
提交与保护相关的配置。在该位保留之前,EMIF1ACCPROT0寄存器的设置内容不能更改????
  // 锁定寄存器配置
  Emif1ConfigRegs.EMIF1COMMIT.all = 0x1;
  if(Emif1ConfigRegs.EMIF1COMMIT.all != 0x1)
  {
     ErrCount++;
  }

//
// Lock the configuration so that EMIF1COMMIT register can't be
// changed any more.
  // 锁定寄存器配置
//
  Emif1ConfigRegs.EMIF1LOCK.all = 0x1;
  if(Emif1ConfigRegs.EMIF1LOCK.all != 1)
  {
      ErrCount++;
  }

  EDIS;

//
//配置cpu 0 的EMIF模块引脚
//
  setup_emif1_pinmux_async_16bit(0);

//
//Configure the access timing for CS2 space配置CS2空间的访问定时
//根据实际引脚配置CS,这里是CS3
//
  Emif1Regs.ASYNC_CS3_CR.all =  (EMIF_ASYNC_ASIZE_16    | // 16Bit Memory
                                                          // Interface
                                 EMIF_ASYNC_TA_2        | // Turn Around time
                                                          // of 2 Emif Clock
                                 EMIF_ASYNC_RHOLD_1     | // Read Hold time
                                                          // of 1 Emif Clock
                                 EMIF_ASYNC_RSTROBE_4   | // Read Strobe time
                                                          // of 4 Emif Clock
                                 EMIF_ASYNC_RSETUP_1    | // Read Setup time
                                                          // of 1 Emif Clock
                                 EMIF_ASYNC_WHOLD_1     | // Write Hold time
                                                          // of 1 Emif Clock
                                 EMIF_ASYNC_WSTROBE_3   | // Write Strobe time
                                                          // of 1 Emif Clock
                                 EMIF_ASYNC_WSETUP_1    | // Write Setup time
                                                          // of 1 Emif Clock
                                 EMIF_ASYNC_EW_DISABLE  | // Extended Wait
                                                          // Disable.
                                 EMIF_ASYNC_SS_DISABLE    // Strobe Select Mode
                                                          // Disable.
                                );

  //地址===值,读写状态
  //0x30_0106===0x5555,r
  //0x30_0107===0xaaaa,r
  //0x30_0115===0x0000,r&w

  Write_FPGA(0x300115,4567);
  Uint16 TEMP =Read_FPGA(0x300115);

  if(TEMP==4567 && Read_FPGA(0x300106)==0x5555 && Read_FPGA(0x300107)==0xaaaa)
      {
    	  GPIO_WritePin(34, 0);//读写正常则led亮
      }
      else
      {
    	  GPIO_WritePin(34, 1);
      }




  while (1);
}

//
// End of file
//

到了这里,关于F28377S_EMIF_异步读写FPGA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DSP_基于TMS320F28377D双核芯片和CCS7.40的编程入门

    开始之前明确一个东西裸机程序和RTOS程序的差别:参考下面三个连接瞅瞅   ​​​​​​理解实时操作系统与裸机的区别-----Free RTOS 简介_书中倦客的博客-CSDN博客_裸机操作系统 裸机与RTOS的理解和并发带来的问题-电子发烧友网 (elecfans.com) ​​​​​​类似于STM32之类的单片

    2024年02月13日
    浏览(29)
  • 【Quartus FPGA】EMIF DDR3 读写带宽测试

    在通信原理中,通信系统的有效性用带宽来衡量,带宽定义为每秒传输的比特数,单位 b/s,或 bps。在 DDR3 接口的产品设计中,DDR3 读/写带宽是设计者必须考虑的指标。本文主要介绍了 Quartus FPGA 平台 EMIF 参数配置,以及测试 DDR3 读写带宽的过程,FPGA 器件型号是 Cyclone 10 GX

    2024年02月13日
    浏览(33)
  • FPGA通过读写突发对DS1302时钟的配置&驱动

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 4、实时时钟模块:DS1302 要求: 使用 EP4CE6F17C8开发板驱动 实时时钟模块(DS1302 ),并将配置完后的时钟传回到上位机。我们上电后直接对实时时钟进行配置,在按键按下后,向上位机发送我们的时钟数据。 这里我们会先对

    2024年02月04日
    浏览(32)
  • DSP_TMS320F28377D_算法加速方法2_添加浮点运算快速补充库rts2800_fpu32_fast_supplement.lib

    继上一篇博客DSP_TMS320F28377D_算法加速方法1_拷贝程序到RAM运行_江湖上都叫我秋博的博客-CSDN博客之后,本文讲第二种DSP算法加速的方法,该方法的加速效果很明显,但是加速范围仅限于32位浮点数下面这几种函数: 下面稍微解释一下一些可能有疑问的点 1 电机控制中经常对同一

    2024年02月10日
    浏览(25)
  • 【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

      下图的clk是clock(时钟)的缩写,下面的波形可以理解为脉冲信号或者方波。简单来说,时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。 时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要!   下图是F1系列的时钟树,从左侧竖线开始,

    2024年02月14日
    浏览(31)
  • 【FPGA异步时钟域约束方法】——Vivado时钟组约束

    【FPGA异步时钟域约束方法】——Vivado时钟组约束 在 FPGA 设计过程中,由于存在多时钟域的情况,需要采取一定的策略来处理时序约束问题。其中,异步时钟域是一种常见的设计需求,为了保证设计时序的正确性和稳定性,我们需要使用 Vivado 提供的时钟组约束方法来对异步时

    2024年02月04日
    浏览(37)
  • 读写BKP&实时时钟

    思路: 使能PWR和BKP时钟, 通过PWR函数void PWR_BackupAccessCmd(FunctionalState NewState); 使能BKP RTC的访问, 调用BKP的读写函数void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);对BKP进行读写。 没有备用电源,主电源断开后BKP中的数据是维持不了的。读

    2024年02月15日
    浏览(22)
  • 跨时钟域设计方法-握手协议、异步FIFO

    当由快时钟跨到慢时钟时,为了避免采不到信号这种情况,通常运用电平展宽、脉冲同步器、或者是握手处理。 图中所示,发送端时钟是clk1,接收端时钟是clk2,当发送端接收到外部传过的数据时,准备就绪时拉高t_req,向接收端发送该信号表示我准备好传输了你准备好接收了

    2024年02月12日
    浏览(33)
  • 时钟芯片DS1302时序分析、读写代码解析

    引脚名称 功能 X1、X2 外接32.768kHz 晶振,用于内部计时 SCLK 和主控通信的时钟线 I/O 数据输入输出引脚 CE 使能引脚 VCC1 接电池供电,保证主板掉电时间能继续走 VCC2 主板的电源供电 (1)DS1302芯片的通信接口是SPI协议接口,只有一根数据线,所以是半双工通信; (2)SPI协议可参考博

    2024年02月06日
    浏览(39)
  • 尝试使用CubeMX做stm32开发之十三:Clock Configuration(时钟树配置)

            参考《STM32中文参考手册_V10》,研究CubeMX中有关时钟树配置。 三种不同的时钟源可被用于驱动系统时钟(SYSCLK): HSI振荡器时钟 HSE振荡器时钟 PLL时钟 时钟源选择对应时钟配置寄存器(RCC_CFGR)中的SW[1:0]位。 三种不同的时钟源可被用于驱动系统时钟​​​​ M

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包