板子是ADSP-EDU-BF53x 仿真器是AD-HP-510ICE 开发环境是VDSP(update10)程序就是买板子时提供的bf53x_sport程序 没有任何改动 改程序要求将DR1PRI和DT1PRI用导线连接起来,将TFS1和RFS1连接起来
/********************************************************
*
* 北京四维卓信电子有限公司
*
* 【OpenADSP开源社区】
*
********************************************************/
#include <cdefBF533.h>
#include <sys\exception.h>
#define FLOW_1 0x1000
unsigned char iTxBuffer[4000];
unsigned char iRxBuffer[4000];
EX_INTERRUPT_HANDLER(Sport1_RX_ISR);
EX_INTERRUPT_HANDLER(Sport1_TX_ISR);
void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}
void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm("ssync;");
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm("ssync;");
asm("idle;");
}
}
void Init_Sport1_RX(int RCLKDIV,int RFSDIV)
{
*pSPORT1_RCLKDIV = RCLKDIV; //配置SPORT接收接口的时钟频率
*pSPORT1_RFSDIV = RFSDIV; //配置SPORT接收接口的同步频率
*pSPORT1_RCR1 = IRCLK|RFSR; //配置SPORT接收工作模式
*pSPORT1_RCR2 = 31; //配置SPORT以32Bit数据接收
}
void Init_Sport1_TX(int TCLKDIV,int TFSDIV)
{
*pSPORT1_TCLKDIV = TCLKDIV; //配置SPORT传输接口的时钟频率
*pSPORT1_TFSDIV = TFSDIV; //配置SPORT传输接口的同步频率
*pSPORT1_TCR1 = ITFS|TFSR|ITCLK; //配置SPORT传输工作模式
*pSPORT1_TCR2 = 31; //配置SPORT以32Bit数据传输
}
void Init_DMA(void)
{
*pDMA3_PERIPHERAL_MAP = 0x3000; //设置SPORT接收接口DMA
*pDMA3_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1; //设置DMA工作模式
*pDMA3_START_ADDR = (void *)iRxBuffer; //设置DMA 接收数据起始地址
*pDMA3_X_COUNT = 1000; //设置DMA接收次数
*pDMA3_X_MODIFY = 4; //设置DMA每次地址增量变化
*pDMA4_PERIPHERAL_MAP = 0x4000; //设置SPORT传输接口DMA
*pDMA4_CONFIG = WDSIZE_32 | DI_EN |FLOW_1; //设置DMA工作模式
*pDMA4_START_ADDR = (void *)iTxBuffer; //设置DMA 传输数据起始地址
*pDMA4_X_COUNT = 1000; //设置DMA传输次数
*pDMA4_X_MODIFY = 4; //设置DMA每次地址增量变化
}
void Enable_DMA_Sport1_RX(void)
{
*pDMA3_CONFIG = (*pDMA3_CONFIG | DMAEN); //使能接收DMA
*pSPORT1_RCR1 = (*pSPORT1_RCR1 | RSPEN); //使能接收SPORT
}
void Enable_DMA_Sport1_TX(void)
{
*pDMA4_CONFIG = (*pDMA4_CONFIG | DMAEN); //使能传输DMA
*pSPORT1_TCR1 = (*pSPORT1_TCR1 | TSPEN); //使能传输SPORT
}
void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xfff32fff; //配置SPORT DMA中断等级
*pSIC_IAR2 = 0xffffffff;
register_handler(ik_ivg9, Sport1_RX_ISR); //注册接收中断
register_handler(ik_ivg10, Sport1_TX_ISR); //注册传输中断
*pSIC_IMASK = 0x00001800; //打开SPORT传输和接收中断屏蔽
}
EX_INTERRUPT_HANDLER(Sport1_RX_ISR) //接收DMA中断函数
{
*pDMA3_IRQ_STATUS = 0x0001; //清除中断标志位
printf("SPORT RX DMA Done!\n"); //打印信息
*pSIC_IMASK &= ~0x00000800; //屏蔽接收中断
}
EX_INTERRUPT_HANDLER(Sport1_TX_ISR) //传输DMA中断函数
{
*pDMA4_IRQ_STATUS = 0x0001; //清除中断标志位
printf("SPORT TX DMA Done!\n"); //打印信息
*pSIC_IMASK &= ~0x00001000; //屏蔽接收中断
}
main()
{
int i;
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
for(i=0;i<4000;i++) //产生测试数据
iTxBuffer[i]=i;
Init_Sport1_TX(7,9); //初始化Sport1传输接口
Init_Sport1_RX(7,9); //初始化Sport1接收接口
Init_Interrupts(); //初始化中断
Init_DMA(); //初始化DMA
Enable_DMA_Sport1_TX(); //使能Sport1传输接口及DMA
Enable_DMA_Sport1_RX(); //使能Sport1接收接口及DMA
while(1);
}