部件号: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始终为空。
有人可以帮助我吗?