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.

TMS320C6655: 几个问题

Part Number: TMS320C6655


  • 一、SPI nor flash上电启动问题:
    现象:掉电后启动不成功。连接仿真器,显示指针地址(0x20B0EAEC)在内部ROM里,说明启动不成功。
    已处理的过程:
    第一步,烧写EEPROM引导程序:
    1.拨码设置为no boot模式;2.连接仿真器;3.加载gel文件;4.向I2C EEPROM内load EEPROMWriter.out;5. 通过Load Memory将执行程序eeprom.bin文件固化到EEPROM的0x0C000000地址中,bus_addr = 81,运行显示successful;掉电
    第二步,固化nor flash应用程序:
    1.拨码设置为no boot模式;2.连接仿真器;3.加载gel文件;4.load:NorFlashWriter.out,4、通过Load Memory将执行程序app.bin文件固化到nor flash的0x80000000地址中,运行显示successful,下电。
    将boot mode的拨码开关设置为[12:0] 0_0010_0001_0110,上电程序没有正常执行。
    整个过程的不确定点:
    1.烧写EEPROM的ibl文件不确定是否正确。
    2.boot mode的拨码不确定完全正确。
    二. DSP主站与FPGA的SRIO通讯问题:
    1、通讯模式选择SWRITE流写模式,SRIO总线为2x模式
    出现的问题:
    1、DSP发送数据长度为512时,会分为两包发送,但是中间会有1us左右的发送间隔;
    2、程序会一直停留在uiCompletionCode读状态中,FPGA回数后会正常跳出,但是SWRITE模式是不要应答的。
  • 一、SPI nor flash上电启动问题:

    请问是自己的板子吗?C6655可以直接从SPI启动,不需要EEPROM。可以参考下面文档里的例程C6657 EVM SPI boot example with DDR initialization。
    https://www.ti.com/lit/an/spracn2/spracn2.pdf

    二. DSP主站与FPGA的SRIO通讯问题:

    请先各自做一下DSP和FPGA的自环,看是否能正常收发。



  • 是自己的板子。

    自环DSP我看不出来数据是否有间隔,FPGA自环没问题,DSP与FPGA间已经可以收数据,只是两个连续数据包之间有间隔。问题就是这个间隔一搬什么情况会有,如何定位这个问题在哪?

    SRIO的SWERIE模式,一包数据只能发送256个字节,我给的长度时1024个,需要分4包连续发送,正常情况下,每包的间隔延时几个clk,但是我们这个已经间隔了1us左右了

  • 能否发一下您的SRIO代码,我需要转给e2e工程师看一下。

  • /****************************************************************************/
    /*      Copyright (C) 2019 - 2029   xx                                     */
    /*                           ALL RIGHTS RESERVED                            */
    /* Product: Valve Control DSP Software Platform                             */
    /* Filename:    srio_fpga.c                                                 */
    /* Description:                                                             */
    /* Author:      niu                                                         */
    /* Date:        2023-01-01                                                  */
    /****************************************************************************/
    /****************************************************************************/
    /* File include                                                             */
    /****************************************************************************/
    #include "srio_fpga.h"
    #include "app.h"
    #include <Tronlong/Support/Drivers/Include/hw/soc_C66x.h>
    
    #include <Tronlong/Support/Drivers/Include/psc.h>
    #include <Tronlong/Support/Drivers/Include/srio.h>
    
    /****************************************************************************/
    /* Parameter definition                                                     */
    /****************************************************************************/
    
    //Configure
    /*
    #pragma DATA_SECTION(MCCfg, ".Buffer");
    #pragma DATA_ALIGN(MCCfg, 8)
    //MCCfgTyp MCCfg;
    
    #pragma DATA_SECTION(MCCfgFbk, ".Buffer");
    #pragma DATA_ALIGN(MCCfgFbk, 8)
    //MCCfgTyp MCCfgFbk;
    
    //Command
    #pragma DATA_SECTION(MCCmd, ".Buffer");
    #pragma DATA_ALIGN(MCCmd, 8)
    //MCCmdTyp MCCmd;
    
    #pragma DATA_SECTION(MCFbk, ".Buffer");
    #pragma DATA_ALIGN(MCFbk, 8)
    //MCFbkTyp MCFbk;
    */
    
    
    SrioDnComStsTyp	SrioDnComSts;
    
    UINT64  SRIOTrans_cycles;
    UINT64  SRIOTrans_speed;
    /****************************************************************************/
    /* Function name: ��FPGA��SRIOͨ�ų�ʼ��                                                                                                               */
    /* Description:                                                             */
    /* Input:                                                                   */
    /* Output:                                                                  */
    /* Author:      niu                                                         */
    /* Date:        2023-01-01                                                  */
    /****************************************************************************/
    void SRIOInit(void)
    {
    	INT32 i;
    
    //1.ʹ�������Դ˯�߿���
    	PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_SRIO, PSC_MDCTL_NEXT_ENABLE, PSC_POWERDOMAIN_SRIO, PSC_PDCTL_NEXT_ON);
    
    //2.���� SRIO �� SRIO Block
        SRIOGlobalDisable();
       	for(i = 0; i <= 9; i++)
       	{
       		SRIOBlockDisable(i);
       	}
    
    //3.ʹ��SRIOд���ʼ������
       	SRIOBootCompleteSet(SRIO_Disable);
    
    //4.ʹ�� SRIO �� SRIO Block
        SRIOGlobalEnable();
    
       	for(i = 0; i <= 9; i++)
       	{
       		SRIOBlockEnable(i);
       	}
    
    //5.���� SRIO Lane ����ģʽ
    	SRIOModeSet(0, SRIO_Normal);
    	SRIOModeSet(1, SRIO_Normal);
    
    //6.�����ؼ��Ĵ���
    	KickUnlock();
    
    //7.���� SRIO SerDes ʱ�ӣ�250Mhz x 10 = 2.5GHz��
    //	SRIOSerDesPLLSet(0x51);
    //7.���� SRIO SerDes ʱ�ӣ�156.25Mhz x 20 = 3.125GHz��
    	SRIOSerDesPLLSet(0xA1);
    //7.���� SRIO SerDes ʱ�ӣ�250Mhz x 25 / 2 = 3.125GHz��
    	//SRIOSerDesPLLSet(0x193);
    //7.���� SRIO SerDes ʱ�ӣ�312.5Mhz x 5 * 2 = 3.125GHz��
    	//SRIOSerDesPLLSet(0x51);
    
    
    //8.���� SRIO SerDes ���� / ����
    	SRIOSerDesRxSet(0, SRIO_SERDES_CFGRX_VALUE);
    	SRIOSerDesTxSet(0, SRIO_SERDES_CFGTX_VALUE);
    	SRIOSerDesRxSet(1, SRIO_SERDES_CFGRX_VALUE);
    	SRIOSerDesTxSet(1, SRIO_SERDES_CFGTX_VALUE);
    
    //9.�ȴ� SRIO SerDes ����
        while(!(SRIOSerDesPLLStatus() & 0x1));
    
    //10.�����ؼ��Ĵ���
    	KickLock();//Block1 Enable Status
    
    //11.PE��������
    	SRIOProcessingElementFeaturesSet(0x20000199);// ����Ԫ����������
    
    //12.����Դ��Ŀ�������ʹ��֧�ֶ�д����������ԭ�Ӳ�����
    	//����Դ����SRC_OP
    //niu    SRIOSourceOperationsSet(0x0004FDF4);
        //����Ŀ��˲���CAR(DEST_OP)
    //niu    SRIODestinationOperationsSet(0x0000FC04);
    
        SRIOSourceOperationsSet(0x0004FDF4);
        SRIODestinationOperationsSet(0x0000FC04);
    
    //13.����SRIO�豸��ʶ��(Base DeviceID)��DSP������ַ����Ҫȷ���Ƿ�����Ŀ���豸Լ���õĵ�ַ������������
        SRIODeviceIDSet(DSP_DEVICE_ID_8BIT, DSP_DEVICE_ID_16BIT);
    
    //14.дĿ���豸ID , ��FPGA������ID
        if((UINT32)ID_SMALL_LARGE)
        {
        	SRIOPortWriteTargetDeviceID((UINT8)(FPGA_DEVICE_ID_16BIT>>8), \
    			(UINT8)FPGA_DEVICE_ID_16BIT, SRIO_ID_16Bit);
        }
        else
        {
        	SRIOPortWriteTargetDeviceID(0x00, \
    			(UINT8)FPGA_DEVICE_ID_8BIT, SRIO_ID_8Bit);
        }
    
    //	SRIOPortWriteTargetDeviceID(0x00, \
    //		(UINT8)DSP_DEVICE_ID_8BIT, SRIO_ID_8Bit);
    
    //15.ʹ�ܶ˿��շ�
        SRIOInputPortEnable(SRIO_Port0);
    	SRIOOutputPortEnable(SRIO_Port0);
    	SRIOInputPortEnable(SRIO_Port1);
    	SRIOOutputPortEnable(SRIO_Port1);
    
    //16.���ö˿����ӳ�ʱ
    	SRIOPortLinkTimeoutSet(0x000FFF);//0x000FFF
    
    //17. �˿� Master ʹ��
    	SRIOPortGeneralSet(SRIO_Enable, SRIO_Enable, SRIO_Disable);
    
    //18.������·ģʽ
    	SRIOPLMPathModeControl(SRIO_Port0, SRIO_Mode1_2_1x_1_2x);//���¼Ĵ����˶�ģʽ
    	SRIOPLMPathModeControl(SRIO_Port1, SRIO_Mode1_2_1x_1_2x);
    //	SRIOPLMPathModeControl(SRIO_Port2, SRIO_Mode1_2_1x_1_2x);
    //	SRIOPLMPathModeControl(SRIO_Port3, SRIO_Mode1_2_1x_1_2x);
    
    //19.ʹ������
    	SRIOPeripheralEnable();
    
    //20.��DSP SRIO����ʹ�ô��ģʽ����FPGAƥ��
    	SRIOBytesSWAPSet(0xF0053800);//�������
    
    //21.�������
       	SRIOBootCompleteSet(SRIO_Enable);
    
    //22.���˿��Ƿ����
    //	while(SRIOPortOKCheck(SRIO_Port0) != TRUE);
    //	while(SRIOPortOKCheck(SRIO_Port1) != TRUE);
    
    	memset(&MCCfg, 		0, sizeof(MCCfg));
    	memset(&MCCfgFbk, 	0, sizeof(MCCfgFbk));
    	memset(&MCCmd, 		0, sizeof(MCCmd));
    	memset(&MCFbk, 		0, sizeof(MCFbk));
    
    	SrioDnComSts.all = FALSE;
    	SRIOTrans_cycles = 0;
    	SRIOTrans_speed  = 0;
    }
    
    /****************************************************************************/
    /* Function name: RapidIO���͵�FPGAͨ��                                                                                                               */
    /* Description:   DSPд�뷢��FPGA������                                                                                                                  */
    /* Input:                                                                   */
    /* Output:                                                                  */
    /* Author:      niu                                                         */
    /* Date:        2023-01-28                                                  */
    /****************************************************************************/
    void SRIO_SWRITE_DSPtoFPGA(UArg DSPAddr,UArg FPGAAddr,UINT16 u16ByteCount)
    {
        SRIOLSUConfig cfg;
    //    UINT32  fpga_memaddr;
    //    UINT32  dsp_memaddr;
    //    UINT8   packet_type;
        UINT32  test_byte_count;
        SRIOLSUTransactionStatus uiCompletionCode = Completed_NoErrors;
    //    UINT8   LSU = 0;
        UINT32  LSU_TEST;
        UINT32  ReadyFaultCnt;
        UINT32  CCFaultCnt;
        static UINT64  SRIOTrans_start, SRIOTrans_stop;
        UINT64  SRIOTrans_overhead;
    //    static UINT16 FirCnt = 0;
    
        TSCL = 0;
        TSCH = 0;
        SRIOTrans_start = _itoll(TSCH, TSCL);
        SRIOTrans_stop  = _itoll(TSCH, TSCL);
        SRIOTrans_overhead = SRIOTrans_stop - SRIOTrans_start;
    
        ReadyFaultCnt = 0;
        CCFaultCnt = 0;
        memset(&cfg, 0, sizeof(SRIOLSUConfig));
    
        do
        {
            do
            {
                LSU_TEST = SRIOLSUFullCheck(LSU);
                if ((LSU_TEST != 0) || (uiCompletionCode != Completed_NoErrors))
                {
                    uiCompletionCode = Completed_NoErrors;
                }
    
                // �ȴ� LSU ����
                ReadyFaultCnt ++;
    
            }while((LSU_TEST != 0) & (ReadyFaultCnt < 5));
    
            if (ReadyFaultCnt >= 5)
            {
                SrioDnComSts.bit.SRIOFPGADnSts = FALSE;
                //break;      //���ڴ˴��������������ѭ��
            }
            else
            {
                SrioDnComSts.bit.SRIOFPGADnSts = TRUE;
            }
    
            //LSU_Reg1����ַ��32bit
            cfg.Address.RapidIOAddress.LSB = FPGAAddr;
    
            //LSU_Reg2��DSP��ַ32bit
            cfg.Address.DSPAddress = DSPAddr;
    
            //LSU_Reg3��Byte_Count���ݴ����д�����ֽ��������1MB
            //test_byte_count = sizeof(MCCfgTyp);//sizeof(MCCmdTyp);
            cfg.ByteCount = u16ByteCount;//sizeof(MCCfgTyp);//sizeof(MCCmdTyp);;    //niu����ʵ��Ԥ��ͨѶ���ݵ���󳤶Ȳ���
    
            if((UINT32)ID_SMALL_LARGE)          //ʹ��8λ������ַ
            {
            //LSU_Reg4��Ŀ���豸ID��ID�Ĵ�С�Լ�����˿�
                cfg.ID.Dest = DSP_DEVICE_ID_16BIT;
                cfg.ID.Size = SRIO_ID_16Bit;
            }
            else
            {
                cfg.ID.Dest = FPGA_DEVICE_ID_8BIT;
                cfg.ID.Size = SRIO_ID_8Bit;
            }
    
            /* SRIO1 SRIO2���Ϊ2xģʽ:port0, SRIO3:port2, SRIO4:port3. */
            cfg.ID.Port = 0;
    
            //LSU_Reg5�������͵�����
            cfg.PacketType = SRIO_StreamWrite;
    
            SRIOTrans_start = _itoll(TSCH, TSCL);//ƴ��64λ
    
        // ��������
            SRIODirectIOTransfer(LSU, &cfg);
        // �ȴ�������ɣ���ȡ��ɱ���
            uiCompletionCode = SRIOLSUStatusGet(LSU, &cfg);
    
            SRIOTrans_stop = _itoll(TSCH, TSCL);
            SRIOTrans_cycles = (SRIOTrans_stop - SRIOTrans_start) - SRIOTrans_overhead;//���Ȱ���64λ����
            CCFaultCnt ++;
        }
        while((uiCompletionCode != Completed_NoErrors) & (CCFaultCnt < 5));
    
        if (CCFaultCnt >= 5)
        {
            SrioDnComSts.bit.SRIOFPGADnSts = FALSE;
        }
    
    //  7629 = (UINT64)(8*1000000000/1024/1024))
        SRIOTrans_speed = (UINT64)test_byte_count * 7629 / SRIOTrans_cycles;
    
    
    }