实验目的是要通过SPORT0的接收部分利用AC23的ADC采集音频,然后通过SPORT1发送部分发送,再通过SPORT1的接收部分接收后,利用SPORT0的发送部分发给AC23的DAC转换成音频信号,目前SPORT1的发送部分和接收部分用导线直连,程序使用了两个中断,但目前现象是能够检测到SPORT1发送部分确实发送出了信号,但是AC23的DAC输出无信号,不确定问题到底是出在SPORT1接受部分还是SPORT0发送部分,程序代码如下,是利用光盘中的AUDIO的代码改写的,请各位高手多多指教!
#include <cdefBF533.h>
#include <ccblkfn.h>
#include <sysreg.h>
#include "audio_talkthrough.h"
#include "audio_regdef.h"
#include "fract.h"
#define POLC 0x00004000
#define PORT_CFG_2_3_EXT_FS 0x00000020
#define XFR_TYPE_NON_ITU656 0x0000000C
#define SLEN_32 0x001f
/****************************************************************************
* 名称 :Init_Timers
* 功能 :初始化TIMER0 为PWM模式。
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Init_Timers(void)
{
*pTIMER0_CONFIG = 0x0019;
*pTIMER0_PERIOD = 0x00800000;
*pTIMER0_WIDTH = 0x00400000;
*pTIMER_ENABLE = 0x0001;
}
/*void Init_Sport0(void)
{
*pSPORT0_RCR1 = RSFSE | RFSR | RCKFE;
*pSPORT0_RCR2 = SLEN_32;
*pSPORT0_TCR1 = TSFSE | TFSR | LATFS | TCKFE;
*pSPORT0_TCR2 = SLEN_32;
}*/
void Init_Sport0(void)
{
*pSPORT0_RCLKDIV = 19;
*pSPORT0_RFSDIV = 63;
*pSPORT0_RCR1 = RSFSE | IRFS | IRCLK;
*pSPORT0_RCR2 = SLEN_32;
*pSPORT0_TCLKDIV = 19;
*pSPORT0_TFSDIV = 63;
*pSPORT0_TCR1 = TSFSE | ITFS | LATFS | TCKFE;
*pSPORT0_TCR2 = SLEN_32;
}
void Init_Sport1(void)
{
*pSPORT1_RCLKDIV = 19;
*pSPORT1_RFSDIV = 63;
*pSPORT1_RCR1 = RSFSE | RFSR | RCKFE;
*pSPORT1_RCR2 = SLEN_32;
*pSPORT1_TCLKDIV = 19;
*pSPORT1_TFSDIV = 63;
*pSPORT1_TCR1 = TSFSE | ITFS | LATFS | ITCLK;
*pSPORT1_TCR2 = SLEN_32;
}
void Init_DMA(void)
{
*pDMA1_PERIPHERAL_MAP = 0x1000;
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;
*pDMA1_START_ADDR = (void *)iRxBuffer1;
*pDMA1_X_COUNT = 4;
*pDMA1_X_MODIFY = 4;
*pDMA2_PERIPHERAL_MAP = 0x2000;
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1;
*pDMA2_START_ADDR = (void *)iTxBuffer1;
*pDMA2_X_COUNT = 4;
*pDMA2_X_MODIFY = 4;
*pDMA3_PERIPHERAL_MAP = 0x3000;
*pDMA3_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;
*pDMA3_START_ADDR = (void *)iRxBuffer2;
*pDMA3_X_COUNT = 4;
*pDMA3_X_MODIFY = 4;
*pDMA4_PERIPHERAL_MAP = 0x4000;
*pDMA4_CONFIG = WDSIZE_32 | FLOW_1;
*pDMA4_START_ADDR = (void *)iTxBuffer2;
*pDMA4_X_COUNT = 4;
*pDMA4_X_MODIFY = 4;
}
void Enable_DMA_Sport(void)
{
*pDMA4_CONFIG = (*pDMA4_CONFIG | DMAEN);
*pDMA3_CONFIG = (*pDMA3_CONFIG | DMAEN);
*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN);
*pDMA1_CONFIG = (*pDMA1_CONFIG | DMAEN);
*pSPORT0_TCR1 = (*pSPORT0_TCR1 | TSPEN);
*pSPORT0_RCR1 = (*pSPORT0_RCR1 | RSPEN);
*pSPORT1_RCR1 = (*pSPORT1_RCR1 | RSPEN);
*pSPORT1_TCR1 = (*pSPORT1_TCR1 | TSPEN);
}
void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = (0xffffff2f & 0xfff32fff);
*pSIC_IAR2 = 0xffffffff;
register_handler(ik_ivg9, Sport0_RX_ISR);
register_handler(ik_ivg10, Sport1_RX_ISR);
*pSIC_IMASK = (0x00000200 | 0x00001800);
}
/*void Process_Data(void)
{
iChannel0LeftOut = iChannel0LeftIn;
iChannel0RightOut = iChannel0RightIn;
iChannel1LeftOut = iChannel1LeftIn;
iChannel1RightOut = iChannel1RightIn;
}*/
EX_INTERRUPT_HANDLER(Sport0_RX_ISR)
{
*pDMA1_IRQ_STATUS = 0x0001;
iTxBuffer2[1] = iRxBuffer1[1];
iTxBuffer2[2] = iRxBuffer1[2];
iTxBuffer2[3] = iRxBuffer1[3];
iTxBuffer2[4] = iRxBuffer1[4];
//iTxBuffer1[1] = iRxBuffer2[1];
//iTxBuffer1[2] = iRxBuffer2[2];
//iTxBuffer1[3] = iRxBuffer2[3];
//iTxBuffer1[4] = iRxBuffer2[4];
}
EX_INTERRUPT_HANDLER(Sport1_RX_ISR)
{
*pDMA3_IRQ_STATUS = 0x0001;
iTxBuffer1[1] = iRxBuffer2[1];
iTxBuffer1[2] = iRxBuffer2[2];
iTxBuffer1[3] = iRxBuffer2[3];
iTxBuffer1[4] = iRxBuffer2[4];
}
如果去掉Sport1的中断,把EX_INTERRUPT_HANDLER(Sport0_RX_ISR)中屏蔽掉的语句都添加上,那么能实现实验目的中阐述的功能,但是因为实际使用中SPORT1的接收部分和发送部分不是直连关系,而是有一定的延迟,所以为了避免不同步才设想启用两个中断。
「该帖子被 Ancients 在 2011-10-19 23:29:13 编辑过」