⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsk_app.c

📁 TI DSP tms320c6713软件无线电设计方案
💻 C
📖 第 1 页 / 共 2 页
字号:

/* ------------------------函数代码 ----------------------------- */ 

/*
 *               initMcbsp() 
 *   使用前面定义的McBSP结构配置初始化McBSP  
 */
void initMcbsp()
{
    /* 打开McBSP1*/
     hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET);
    
    /* 配置McBSP1 */
    MCBSP_config(hMcbsp1, &mcbspCfg1);
   
     /* 启动McBSP */
    MCBSP_start(hMcbsp1, MCBSP_XMIT_START | MCBSP_RCV_START |
        MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 220);
    MCBSP_start(hMcbsp0, MCBSP_XMIT_START | MCBSP_RCV_START |
        MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 220);
}


/*
 *             initIrq() 
 *  使用芯片支持库初始化、使能DMA接收中断    
 *        该中断的中断服务例程是edmaHwi().
 */
void initIrq(void)
{
    /* CPU使能 EDMA 中断  */
    IRQ_clear(IRQ_EVT_EDMAINT);    // 清除挂起的 EDMA 中断
    IRQ_enable(IRQ_EVT_EDMAINT);   // 使能EDMA中断
}


/*
 *                     initEdma()  
 *                   初始化EDMA控制器  
 *  使用连接地址传输,自动在PING、PONG缓冲区间交互传输
 */
void initEdma(void)
{
    /* 配置接收通道 */
    hEdmaRcv = EDMA_open(EDMA_CHA_REVT1, EDMA_OPEN_RESET);  // 获得 hEdmaRcv 句柄、复位通道 
    hEdmaReloadRcvPing = EDMA_allocTable(-1);               // 获得 hEdmaReloadRcvPing 句柄
    hEdmaReloadRcvPong = EDMA_allocTable(-1);               // 获得 hEdmaReloadRcvPong 句柄
    
    gEdmaConfigRcv.src = MCBSP_getRcvAddr(hMcbsp1);         // 设置EDMA传输的源地址是 McBSP1 数据接收寄存器
        
    gRcvChan = EDMA_intAlloc(-1);                           // 获得一个传输结束代码
    gEdmaConfigRcv.opt |= EDMA_FMK(OPT,TCC,gRcvChan);       // 设置传输结束代码给 gRcvChan

    EDMA_config(hEdmaRcv, &gEdmaConfigRcv);                 // 配置寄存器
    EDMA_config(hEdmaReloadRcvPing, &gEdmaConfigRcv);       // Ping重新加载
    
    gEdmaConfigRcv.dst = EDMA_DST_OF(gBufferRcvPong);       //改变EDMA配置的目的地址为Pong
    EDMA_config(hEdmaReloadRcvPong, &gEdmaConfigRcv);       // 重新加载Pong
    
    EDMA_link(hEdmaRcv,hEdmaReloadRcvPong);                 // 连接寄存器 Pong
    EDMA_link(hEdmaReloadRcvPong,hEdmaReloadRcvPing);       // 连接地址 Pong 到 Ping
    EDMA_link(hEdmaReloadRcvPing,hEdmaReloadRcvPong);       // 连接地址 Ping 到 Pong
        
    /* EDMA 控制器使能中断  */
  
    EDMA_intClear(gRcvChan);                                // 清除任何可能的伪中断

   
    EDMA_intEnable(gRcvChan);                               // 使能EDMA 中断 (CIER)

    EDMA_enableChannel(hEdmaRcv);                           // 使能 EDMA 通道
    
    /* 通过Mcbsp写的伪操作产生第一个  McBSP 传输事件 */
    MCBSP_write(hMcbsp1, 0);

}



/* ---------------------- 中断服务例程 ----------------------- */

/*
 *                   edmaHwi() 
 *             EDMA 传输中断服务例程
 *      当一个完整的EDMA接收帧传输结束时触发 
  *               通过在DSP/BIOS中配置
 *             Scheduling --> HWI --> HWI_INT8.   
 *     在编译时edmaHwi()中断服务例程 插入中断向量表
 *        edmaHwi() 使用 DSP/BIOS Dispatcher发报机 
 *  保存寄存器状态、确定中断服务例程和其它DSP/BIOS 函数并存
 */
void edmaHwi(void)
{
    static Int16 rcvdone = 0;//定义局部变量rcvdone
    static Uint32 pingOrPong = PING;  // 定义局部变量pingOrPong,指示PING、PONG缓冲区
    
        
    if (EDMA_intTest(gRcvChan))//通道gRcvChan接收传输完成中断
    {
        EDMA_intClear(gRcvChan);//清楚通道gRcvChan传输完成标志
        rcvdone = 1;//传输完成标志变量置1
    }
        
    /* 如果传输结束, 将处理软件中断 processBufferSwi  */
    if (rcvdone)//传输完成
    {
        if (pingOrPong==PING)//当前是PING缓冲区
        {
            SWI_or(&processBufferSwi, PING);//启动软件中断processBufferSwi
                                            //向mailbox 发送PING=0
            pingOrPong = PONG;//缓冲区状态赋值PONG
        } else
        {
            SWI_or(&processBufferSwi, PONG);//启动软件中断processBufferSwi
                                            //向mailbox 发送PONG=1
            pingOrPong = PING;//缓冲区状态赋值PING
        }
        rcvdone = 0;//传输完成标志变量清零
    }
}


/* ------------------------------- 线程 ------------------------------ */
/*
 *            demodulateAM() 
 *            AM信号解调程序
 * 将一个缓冲区(inBuf)中的数据(I、Q信号)解调算法处理
 *            处理后数据存(outBuf)
 */

/*  
 * AM解调程序
 * 程序中调用了函数库fastrts67x.lib中 
 * 乘方汇编函数powsp(),开方汇编函数sqrtsp()
*/
/* inBuf存取I、Q信号缓冲区,16位,缓冲区大小1024 */
/*outBuf存取解调后数据缓冲区,32位,缓冲区大小512*/
void demodulateAM(INT16 *inBuf,Uint32 *outBuf,INT16 Length)
{
	INT16 i;
	Uint32 TempBuf;
	for(i=0;i<=Length;i+2)
	{
		TempBuf=powsp(inBuf[i],2);
		TempBuf=+powsp(inBuf[i+1],2);
		*outBuf[i/2]=sqrtsp(TempBuf);
	}
}


/*
 *              processBuffer() 
 *       软件中断processBufferSwi的线程  
 *  处理接收缓冲区gBufferRcvPing、gBufferRcvPong数据          
 */
void processBuffer(void)
{
    Uint32 pingPong;
    
    /* 读取mailbox中由edmaHwi()中断发送的内容 */
    pingPong =  SWI_getmbox();

    /*处理接收缓冲区gBufferRcvPing、gBufferRcvPong数据  */
    if (pingPong == PING) //处理PING缓冲区中数据
    	{ /* 指示灯LED #3 闪烁 */
        DSK6713_LED_toggle(3);
        
        /* 处理PING 缓冲区数据 */
        demodulateAM(gBufferRcvPing, gBufferXmtPing, BUFFSIZE);
    	} 
    else {//处理PONG缓冲区中数据
        /* 指示灯LED #2 闪烁 */
        DSK6713_LED_toggle(2);
        
        /* 处理POING 缓冲区数据 */
        demodulateAM(gBufferRcvPong, gBufferXmtPong, BUFFSIZE);
    }
}

/*
 *                     周期性线程blinkLED() 
 *   当DIP 开关 #0 按下时 ,指示灯LED #0每500毫秒闪亮一次
 *                    该线程在DSP/BIOS中配置  
 *               Scheduling -->PRD --> PRD_blinkLed.
 */
void blinkLED(void)
{
    /* 如果DIP 开关 #0 按下,指示灯 LED #0闪亮 */
    if (!DSK6713_DIP_get(0))
        DSK6713_LED_toggle(0);
}


/*
 *                      周期性线程load()
 *   当DIP开关switch #1按下时,该线程仿真给225MHz 6713 20-25%虚负荷
 *                    该线程在DSP/BIOS中配置 
 *                 Scheduling --> PRD-->PRD_load. 
 *                      该线程1毫秒执行一次
 */
void load(void)
{
    volatile Uint32 i;  

    /* 如果DIP 开关 #1 按下,CPU执行一个for循环 */
    if (!DSK6713_DIP_get(1))
        for (i = 0; i < 30000; i++);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -