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.

[参考译文] TIDM-TMDSPLCKIT-V3:TIDM-TMDSPLCKIT-V3

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/630739/tidm-tmdsplckit-v3-tidm-tmdsplckit-v3

部件号:TIDM-TMDSPLCKIT-V3

嗨,我买了一台TMDSPLCKIT-V3。

在套件中,我找到了PRIME DDK_PackageV7910。

在测试示例中,我使用了ti_prim_phy示例,似乎工作正常。

我尝试修改它,添加一个串行端口。 通过这种方式,我想将套件作为电力线调制解调器从一台PC发送数据到另一台PC的工作实现到一个系统。

代码为:

/************************************************************************
*文件用途:Tx+Rx的测试驱动程序
*****************
*
*文件名:test_tx_rx.c
*
*说明:此文件包含用于TX+Rx的测试驱动程序
*       
*
*历史记录:
* 2009年25月02日         S.Yim  初始修订版。
*
*功能列表:
*
*版权所有(c) 2008 Texas Instruments Inc. 保留所有权利。
***************** /
#include "DSP28x_Project.h"
#include "phy_tx.h"
#include "prim_phy.h"
#include "hal_afe.h"
包括"F2.8335万.h"
#include <phy.h>
#include <phy_rx.h>
#include <sci.h>

/* Test Sweep all ppdu payload len */
#define PHY_TX_test_sweep_PPDU_LEN  0                    

/*默认phy cfg */
#define PHY_TX_TEST_DEFAULT_PPDU_LEN 40.
#define PHY_TX_TEST_DEFAULT_LEVEL    3                  // max -6 dB
#define PHY_TX_TEST_DEFAULT_MOD      PRY_PRCL_DBPSK_F // BPSK + FEC
#define PHY_TX_TEST_DEFAULT_TIME     0                  //立即启动

/*定义*/
#define PHY_TX_TEST_PPDU_LENGTH 2268
#define PHY_TX_TEST_BUF_SIZE   100
#define PHY_TX_TEST_HDR_SIZE     4//16*4=64位 为MAC_H (54)

void Reset_buf (Int16 *,Int16);

/*********************************************************************** /
/*数据                                                               */
/*********************************************************************** /
/*定义数据缓冲区*/
Int16 hdrBuf[PHY_TX_TEST_HDR_SIZE];
Int16 ppduBuf[PHY_TX_test_BUF_size];
PHY_TX_ppdu_t PHY_TX_ppdu_s;
PHY_rxPpdu_t PHY_RX_ppdu_s;
Int16 Rx_ppduBuf [PHY_TX_test_BUF_size];

UINT16 idx,i;//maxLen;
UINT16 * buf_p;
UINT16 RETURE_STATUS = 1;
UINT16 SciaReceivedChar =0,SciaRxCount =0,SciaRxFlag =0;
UINT16 SciaTxLSBFlag =0,SciaTxCount =0,SciaTxFlaga =0,SciaTxDato =0;
UINT16 SciaRxBuffer[PHY_TX_TEST_BUF_Size],SciaTxBuffer[PHY_TX_TEST_BUF_Size];

volatile UINT16 txSymbDone;           // TX SYMBOL Done标志
易失性UINT16 afeReadyFlag;

中断无效PHY_TX_cpuTimer0_ISR(void);
中断无效PHY_TX_dintch2_ISR(void);
中断无效PHY_Rx_dintch1_ISR(void);
中断void sciarx_isr (void);

#ifdef闪存
/*********************************************************************** /
/*设置闪存                                                   */
/*********************************************************************** /
/*以下符号应引用链接器文件*/
extern UINT16 secureRamFuncs_loadstart, secureRamFuncs_loadend, secureRamFuncs_runstart;
extern UINT16 isrRamFuncs_loadstart, isrRamFuncs_loadend, isrRamFuncs_runstart;
extern UINT16 phyRamFuncs_loadstart, phyRamFuncs_loadend, phyRamFuncs_runstart;  

void config_flash(void)

 /*将时间关键代码和闪存设置代码复制到RAM */
 memcpy(&secureRamFuncs_runstart,
        secureRamFuncs_loadstart (&S),
        &secureRamFuncs_loadend -&secureRamFuncs_loadstart);

 memcpy(&isrRamFuncs_runstart,
        &isrRamFuncs_loadstart,
        &isrRamFuncs_loadend -&isrRamFuncs_loadstart);

 memcpy(&phyRamFuncs_runstart,
        &phyRamFuncs_loadstart,
        &phyRamFuncs_loadend -&phyRamFuncs_loadstart);
 
 //呼叫闪存初始化以设置闪存等待
 //此功能必须驻留在RAM中
 // CSL.lib中的InitFlash代码
 InitFlash();// 调用闪存包装程序init函数
}
#endif

void CB_TX(PHY_EV_t eventID, PHY_cbData_t *DATA_p);
void cb_sync(PHY_EV_t eventID, PHY_cbData_t *DATA_p);
void cb_ppdu(PHY_EV_t EV, PHY_cbData_t *DATA_p);


/*********************************************************************** /
/* PHY TX回调                                                    */
/*********************************************************************** /
UINT16 CB_EV=0;
int txppdu_cnt = 0;

void CB_TX(PHY_EV_t eventID, PHY_cbData_t *DATA_p)

   CB_EV = eventID;
   txppdu_cnt+;
   GpioDataRegs.GPBTOGLE.bit.GPIO34 = 1;             //闪存指示每个pkt以进行测试
}

/*********************************************************************** /
/*对PHY_rxPpduStart                                      */的回叫
/*********************************************************************** /
int rxppdu_cnt = 0,rxppdu_done = 0,valsnr = 0,j = 0;
void cb_ppdu(PHY_EV_t EV, PHY_cbData_t *DATA_p)

   如果(data_p->status == PHY_STAT_SUCCESS){

      rxppdu_cnt++;                               //确定读取数据

      PHY_rxGetData_t rxget;                         //验证信噪比
      PHY_rxGet (PHY_RX_GET_SNR,&rxget);
      valsnr = rxget.SNR;

      buf_p =(UINT16 *) rx_ppduBuf;                      //透射缓冲液
      对于(j = 0;j < PHY_TX_TEST_BUF_SIZE;j++){
         SciaTxBuffer[j]=*buf_p++;
      }
      reset_buf (rx_ppduBuf,PHY_TX_test_BUF_size);

      PHY_rxPpduRelease((PHY_rxPpdu_t *)(data_p->cbParms.rxPpdu.ppduInfoAddr);

      GpioDataRegs.GPATOGLE.bit.GPIO31 = 1;         //闪存指示每个pkt以进行测试*
      rxppdu_done = 1;

   }
}

/*********************************************************************** /
/*对PHY_rxStart                                          */的回叫
/*********************************************************************** /
void cb_sync(PHY_EV_t eventID, PHY_cbData_t *DATA_p)

   如果(data_p->status == PHY_STAT_SUCCESS){
      PHY_rxPpduStart (CB_ppdu);                   /*启动PPDU,然后*/
   }
}

void Reset_buf (Int16 * ppdu,内部16长度)

   UINT16 IND;

   buf_p =(UINT16 *) ppdu;
   用于(ind = 0;ind < lenght;ind++){
      *buf_p++= 0;
   }

}

/*********************************************************************** /
/*主要                                                               */
/*********************************************************************** /
uINT32 txstart_cnT=0;
const char *ver_p;
Void主(void)

   //PHY_txGetData_t phyGetData;
   hal_afe_prfParms_t afePrfParms;

   afeReadyFlag = 0;

   /* F2.8335万初始化*/
   F2.8335万_init();

#ifdef闪存
   /*配置闪存*/
   config_flash();
#endif

   /* ISR功能*/
   /*对于PHY TX,使用CPU timer0和DMA通道2中断*/
   EALLOW;
   PieVectorTable.TINT0 =&PHY_TX_cpuTimer0_ISR;
#ifndef F2806X
   PieVectorTable.DINTCH2 =&PHY_TX_dintch2_ISR;
   PieVectorTable.DINTCH1 =&PHY_Rx_dintch1_ISR;
#否则
   PieVectorTable.DINT_CH2 =&PHY_TX_dintch2_ISR;
   PieVectorTable.DINT_CH1 =&PHY_Rx_dintch1_ISR;
#endif
   PieVectorTable.SCIRXINTA =&sciarx_isr;
   EDIS;

   // SCI-A设置
   InitSciaGpio();
   scia_init();

   // LED设置
   EALLOW;//下面的寄存器是"受保护的",允许访问。
   
   //GPIO 34 - PIN函数= LED3 (用于版本1.1 和更新的F2833x controlCARD)
   gpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // 0= GPIO, 1=ECAP1, 2=Resv, 3=Resv
   gpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;         // 1=输出, 0=输入

   // GPIO 31 - PIN函数= LED2 (用于版本1.1 和更新的F2833x controlCARD)
   GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0; // 0= GPIO, 1=CANTX-A, 2=XA17, 3=Resv
   gpioCtrlRegs.GPADIR.bit.GPIO31 = 1;         // 1=输出, 0=输入
 
   EDIS;//禁用注册访问

   ver_p = PHY_getLibVersion();

   /*初始化AFE HAL驱动程序*/
   /* HAL配置文件(TX/Rx采样和PWM频率*/)
   afePrfParms.Rx_FS_kHz = HAL_AFE_KHz_250;
   afePrfParms.TX_FS_kHz = HAL_AFE_KHz_500;
   afePrfParms.TX_PWM_kHz = HAL_AFE_KHz_1000;

   HAL_afeInit (&afePrfParms);

   /* init_PHY */
   PHY_txInit();
   PHY_rxInit();

   //   Abilito l'IRQ della SCI
     IER || M_INT9;                      //启用CPU INT1

   //在IER中启用INT1以启用PIE组
     PieCtrlRegs.PIEIER9.bit.INTx1 = 1;    // PIE组9,INT1 SCIRXINTA_ISR

   EnableInterrupts();

   /*初始化TX PPDU数据缓冲区*/
   PHY_TX_ppdu_s.length = PHY_TX_TEST_DEFAULT_PPDU_LEN;
   PHY_TX_ppdu_s.level = PHY_TX_test_default_level;
   PHY_TX_ppdu_s.mcs   = PHY_TX_test_default_MOD;
   PHY_TX_ppdu_s.txTime = PHY_TX_test_default_time;

   PHY_TX_ppdu_s.ppduHdr_p =(UINT16 *)&hdrBuf[0];
   PHY_TX_ppdu_s.ppduPld_p =(UINT16 *)&ppdubf[0];

   /*初始化RX PPDU数据缓冲区*/
   PHY_Rx_ppdu_s.data_p=(UINT16 *)&Rx_ppduBuf[0];

   /*用零*/填充ppdubf
   reset_buf (ppduBuf,PHY_TX_test_BUF_size);
   reset_buf (rx_ppduBuf,PHY_TX_test_BUF_size);
 
   /*启动PHY Rx */
   PHY_rxStart (0xFFFF,CB_SYNC);
 
   /*首次启动TX */
   PHY_txPpdu (&PHY_TX_ppdu_s,CB_TX);
 
   /*运行状态机*/
   而(1){

      PHY_TX_STAT_t txstats;
      Phy_txGetStats (&txstats);

      如果(CB_EV == PHY_EV_TX_PPDU_done){
         如果(SciaRxFlag ==1){
            SciaRxFlag =0;                            //重置il flag di ricezione sci
            buf_p =(UINT16 *) ppduBuf;                //透射缓冲液
            对于(j = 0;j < PHY_TX_TEST_BUF_SIZE;j++){
               *buf_p++= SciaRxBuffer[j];
            }
            txstart_cnt++;
            CB_EV = 0;
            PHY_txPpdu (&PHY_TX_ppdu_s,CB_TX);             //通过PLC传输I dati ricevuti
         }

      }

      如果(afeReadyFlag == 1){
         afeReadyFlag = 0;                            // Resetto il flag AFE ready
         PHY_rxSmRun();                               //运行PHY Rx */
         如果(rppdu_done ==1){                         // Verifico se RX PPDU è stato fatto
            rxppdu_done = 0;                         // Resetto il Flag
            SciaTxFlaga = 1;                         // Abilito la trasissuone dei dati su seriale.
         }
      }
   
      如果(SciaTxFlaga == 1){                            // Verifico se la trasmission seriale è abilitata
         //通过序列化的Trasmetto i dati
         如果(SciaRegs.SCICTL2.bit.TXRDY != 0){             // Verifico se la seriale è Libera
            SciaTxDato = SciaTxBuffer[SciaTxCount];         // Carico il Dato da inviare
            //IF (SciaTxLSBFlag == 1){SciaTxDato >=8;}      // Se il Dato è MSB lo shift a destra di 8.
            SciaRegs.SCITXBUF = SciaTxDato;                // Sposto il Dato regimnel della SCI
            //IF (SciaTxLSBFlag == 1){SciaTxCount+;}
            //IF (SciaTxLSBFlag ==1){                   // Verifico se ho mandato un Dato MSB
            //   SciaTxLSBFlag =0;                      //反转il Flag Dato MSB/LSB
            SciaTxCount++;                            //汇总计数器
            //}其他{
            //   SciaTxLSBFlag =1;                      //反转il Flag Dato MSB/LSB
            //}
            IF (SciaTxCount == PHY_TX_TEST_BUF_SIZE){      // Se il contatore = 38
               SciaTxCount = 0;                      // Azzero il Contatore
               SciaTxLSBFlag =0;                      // Resetto il flag LSB/MSB
               SciaTxFlaga =0;                      // Azzero il标志di Tx
            }
         }
      }

      如果(txSymbDone == 1){
         txSymbDone =0;                               // Resetto il flag
         Phy_txSmRun();                               //状态转换*/
         //IF (CB_EV == PHY_EV_TX_PPDU_Done){
         //   CB_EV = 0;
         //}
      }
   }
}

/*********************************************************************** /
/* CPU计时器0的ISR                                                */
/*********************************************************************** /
#ifdef闪存
#pragma code_section(PHY_TX_cpuTimer0_ISR,"isrRamFuncs";
#endif
中断无效PHY_TX_cpuTimer0_ISR(void)

 txSymbDone = 1;
 HAL_cpuTint0Func();
}

/*********************************************************************** /
/*用于DMA通道2的ISR                                              */
/*********************************************************************** /
#ifdef闪存
#pragma code_section(PHY_TX_dintch2_ISR,"isrRamFuncs";
#endif
中断无效PHY_TX_dintch2_ISR(void)

 txSymbDone = 1;
 HAL_afeTxDmaCh2IntFunc();
}

/*********************************************************************** /
/* Rx AFE ISR                                                         */
/*********************************************************************** /
#ifdef闪存
#pragma code_section (PHY_Rx_dintch1_ISR,"isrRamFuncs");
#endif

中断无效PHY_Rx_dintch1_ISR(void)

 /*设置就绪标志*/
 afeReadyFlag = 1;

 /*调用用于DMA处理的HAL AFE函数*/
 HAL_afeRxDmaCh1IntFunc();
}

中断无效sciarx_isr (void)                   // 0x000DC0 SCIRXINTA (SCI-A)

   //TimeoutScia = 0;                         //重置/超时扫描
   SciaReceivedChar = SciaRegs.SCIRXBUF.ALL;      // Prevro il Dato
   SciaRxBuffer[SciaRxCount]= SciaReceivedChar;   // Aggiorno i dati nel Buffer della seriale.
   SciaRxCount++;                            //增量
   IF (SciaRxBuffer[SciaRxCount-2]== 255){//      Verifico se ho ricevuto 255.
      IF (SciaRxBuffer[SciaRxCount-1]== 255){//   Verifico se ho ricevuto 254.
         SciaRxCount =0;                   //在联系人中重新列设
         SciaRxFlag =1;                      //设置一个旗帜达图里切托
      }
   }

   SciaRegs.SCIRXST.Bit.RXRDY = 0;               //清除中断标志
   PIECtrlRegs.PIEACK/ALL = PIEACK_group9;         //必须确认PIE组
}

对于我的实际情况来说,sci的效果很好。

问题出在PHY_rxPpduStart的回调过程中。

回调过程正常工作,但缓冲区Rx_ppduBuf始终为空。

 有人可以帮助我吗?   

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

    您好,Emilio,

    我将在离线状态下跟进您。


    谢谢!
    Brett