您的位置: OpenADSP社区论坛 -> SHARC/TigerSHARC专区 -> 新手上路 -> 在CCES环境下如何使用21489的IIR加速器
本帖共有949个阅读者
发表帖子 发表投票 回复主题
在CCES环境下如何使用21489的IIR加速器
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
在CCES环境下如何使用21489的IIR加速器

在VDSP++的环境下程序已经实现,但是到了CCES下,把中断初始化函数修改了,还是无法正确配置中断,直接返回IIR的中断初始化失败,请问CCES下怎么使用IIR加速器?

代码如下:


/* This code has the TCBS, initialization routines, and the DMA completion ISR for the IIR accelerator */  

    

#include <services\int\adi_int.h>  

#include "ADDS_21489_EzKit.h"  

#include "IIR_Accelerator.h"  

  

void Init_IIR(void);  

void ACC_ISR();  

  

float input_left[NUM_SAMPLES];  

float input_right[NUM_SAMPLES];  

float output_left[NUM_SAMPLES];  

float output_right[NUM_SAMPLES];  

float coeffs_low_pass[7*NUM_SECTIONS+1] = {  

                                                                                                                                                      #include "lowpass_200Hz.dat"  

                                                                                                       } ;  

  

float coeffs_high_pass[];  

  

volatile int acc_over;  

ad1939_float_data fBlockA;  

  

// TCB Initialization  

int IIR_TCB_RIGHT[13]={  

                                        0,                                                  // CP                     = Chain pointer register  

                                        21,                                                  // CC/CL           = Coefficient buffer length register  

                                        1,                                                  // CM                      = Coefficient modifier register  

                                        (int)coeffs_low_pass,          // CI              = Cofficient index refister  

                                        (int)fBlockA.Tx_R1,                    // OB              = Ouput data base register  

                                        NUM_SAMPLES,                                        // OL/OC            = Output buffer length register  

                                        1,                                                  // OM                     = Output modifier register  

                                        (int)fBlockA.Tx_R1,                    // OI                      = Output data index register  

                                        (int)fBlockA.Rx_R1,                    // IB                     = Input data base register  

                                        NUM_SAMPLES,                                        // IL/IC             = Input buffer length register  

                                        1,                                                  // IM                     = Input buffer modifier register  

                                        (int)fBlockA.Rx_R1,                    // II                     = Input data index register  

                                        2|(383<<14)                              // IIRCTL2           = Channel control register, no of biquads = 3, WINDOW SIZE=512  

                              };  

    

int IIR_TCB_LEFT[13]={  

                                        (int)IIR_TCB_RIGHT+12,          // CP                     = Chain pointer register  

                                        21,                                                  // CC/CL           = Coefficient buffer length register  

                                        1,                                                  // CM                      = Coefficient modifier register  

                                        (int)coeffs_low_pass,          // CI              = Cofficient index refister  

                                        (int)fBlockA.Tx_L1,                    // OB              = Ouput data base register  

                                        NUM_SAMPLES,                                        // OL/OC            = Output buffer length register  

                                        1,                                                  // OM                     = Output modifier register  

                                        (int)fBlockA.Tx_L1,                    // OI                      = Output data index register  

                                        (int)fBlockA.Rx_L1,                              // IB                     = Input data base register  

                                        NUM_SAMPLES,                                        // IL/IC             = Input buffer length register  

                                        1,                                                  // IM                     = Input buffer modifier register  

                                        (int)fBlockA.Rx_L1,                              // II                     = Input data index register  

                                        2|(383<<14)                              // IIRCTL2           = Channel control register, no of biquads = 3, WINDOW SIZE=512  

                              };  


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:09:38
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
/* Adding the Initialization Code for IIR Accelerator Now */  
    
void Init_IIR(void)  
{  
          int temp;  
  
          IIR_TCB_RIGHT[0]=(int)IIR_TCB_LEFT+12;  
  
          //Mapping the IIR DMA interrupt  
          temp=*pPICR0;  
          temp&=~(P0I0|P0I1|P0I2|P0I3|P0I4);  
          temp|=P0I0|P0I1|P0I3|P0I4;  
          *pPICR0=temp;  
  
          adi_int_InstallHandler(ADI_CID_P0I,(ADI_INT_HANDLER_PTR)ACC_ISR, _NULL ,true);  
  
          //Selecting the IIR Accelerator  
          temp=*pPMCTL1;  
          temp&=~(BIT_17|BIT_18);  
          temp|=IIRACCSEL;  
          *pPMCTL1=temp;  
  
          asm("nop;nop;nop;nop;");  
  
          //Initializing the chain pointer register  
          *pCPIIR=(int)IIR_TCB_LEFT+12-0x80000;  
  
         //Now Enabling the IIR Accelerator  
          *pIIRCTL1=IIR_EN|IIR_DMAEN|IIR_CH2|IIR_RND0;  
  
}  
  
  
  
  
void Process_block(float* input_left,float* input_right, float* output_left, float* output_right, bool first_flag)  
{  
          int i;  
  
          //Start the accelerator for first time  
          if(first_flag)  
          {  
                    Init_IIR();  
          }  
  
          /*Move the accelerator from IDLE state to the Data Load state by resetting and clearing  
          the IIR_DMAEN bit*/  
          else  
          {  
                    *pIIRCTL1&=~IIR_DMAEN;  
                    *pIIRCTL1|=IIR_DMAEN;  
          }  
  
          /* Wait till IIR accelerator finishes the processing */  
          while(acc_over==0);  
          acc_over=0;  
  
          /*Multiply the output with filter gain */  
          for (i =0; i < NUM_SAMPLES; ++i)  
          {  
                    output_left[i]=output_left[i]*coeffs_low_pass[21];  
                    output_right[i]=output_right[i]*coeffs_low_pass[21];  
  
          }  
}  
  
void ACC_ISR()  
{  
          acc_over=1;  
}  

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:09:54
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:


在你的代码里面,你通过

adi_int_InstallHandler(ADI_CID_P0I,(ADI_INT_HANDLER_PTR)ACC_ISR, _NULL ,true);  

把Programmable Interrupt 0 和中断处理函数关联起来了,但是你还需要通过PICRx这个寄存器把Accelerator DMA 的中端映射到Programmable Interrupt 0


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:10:09
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问:谢谢你的答复,代码里面第64行到68行不是在对PICR0进行设置了吗?
  1. //Mapping the IIR DMA interrupt  
  2. temp=*pPICR0;  
  3. temp&=~(P0I0|P0I1|P0I2|P0I3|P0I4);  
  4. temp|=P0I0|P0I1|P0I3|P0I4;  
  5. *pPICR0=temp;  

这里应该是吧IIR DMA Interrupt映射到Programmable Interrupt 0上吧?


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:10:37
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:你需要debug一下,看看PICR0 的最低5位是不是0x1B,如果是的,哪可能是系统其他的问题让IIR没有正常工作,所以没有中断产生

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:11:47
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问:确实改过来了,但是我按一步一步执行代码,看中断初始化函数返回的状态量,返回了初始化失败的值

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:12:02
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:你说的“中断初始化函数返回的状态量”是指那个函数调用?

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:12:16
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问:在CCES里面有个adi_int.c的源文件,调用adi_int_InstallHandler的时候,进入这个函数,函数原型如下:
  1. ADI_INT_STATUS  adi_int_InstallHandler (uint32_t iid,    ADI_INT_HANDLER_PTR pfHandler,    void* pCBParam,    bool bEnable) {     ADI_INT_STATUS eStatus;  
  2.       if (ADI_OSAL_SUCCESS == adi_osal_InstallHandler(iid, pfHandler, pCBParam))  
  3.      {  
  4.          if(bEnable)  
  5.         {  
  6.              adi_osal_ActivateHandler(iid);  
  7.          }  
  8.          eStatus = ADI_INT_SUCCESS;  
  9.      }  
  10.      else  
  11.      {  
  12.          eStatus = ADI_INT_FAILURE;  
  13.      }  
  14.           return eStatus;  
  15. }  

eStatus返回的值为ADI_INT_FAILURE,初始化失败,寄存器PICR_0返回的值为PICR_0:     00001010 01000001 10001000 00111011,至此无法初始化中断,进入不了中断函数void ACC_ISR();


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:12:31
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:从你的代码上面看起来是没有什么问题的,或者你把这个简单的工程作为附件发给我,我仔细帮你检查一下

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:12:55
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
答:
https://ezchina.analog.com/servlet/JiveServlet/download/11906-1-2378/PGC_192kHz_384per.rar.zip    这个是你得代码。

在你的代码中,我看到

adi_int_InstallHandler(ADI_CID_P0I,(ADI_INT_HANDLER_PTR)ACC_ISR, _NULL ,false);

最后一个参数如果是flase,表示disable interrupt。应该改为true。

但是我发现你在论坛描述这个问题的时候,引用的代码是

  adi_int_InstallHandler(ADI_CID_P0I,(ADI_INT_HANDLER_PTR)ACC_ISR, _NULL ,true);  


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2018/4/9 16:13:17
12
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154071 Call, 1 Queries, Processed in 0.031250 second(s),