硬件准备
ADSP-EDU-BF533:BF533开发板
 AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接

接口功能介绍
ADSP-BF533上有两个 SPORT 口,SPORT(synchronous serial ports)接口是 ADSP-BF53x 上速度最快的串口,其速度可以达到系统时钟的 1/2, 每一个 SPORT 口有两根接收数据线和两根传输数据线,支持全双工模式传输。
SPORT 接口通常用做一些高速的数据传输,它支持 I2S 模式,通常将 SPORT 接口连接音频的编解码器芯片,作为音频数据输出接口。
SPORT 时钟频率配置:
 SPORTx_TCLK frequency = (SCLK frequency)/(2 x (SPORTx_TCLKDIV + 1))
 SPORTx_RCLK frequency = (SCLK frequency)/(2 x (SPORTx_RCLKDIV + 1))
SPORT 同步信号频率配置:
 SPORTxTFS frequency = (TSCLKx frequency)/(SPORTx_TFSDIV + 1)
 SPORTxRFS frequency = (RSCLKx frequency)/(SPORTx_RFSDIV + 1)
不同模式下,寄存器配置值:

接口寄存器说明

核心代码分析
*pSPORT1_TCLKDIV = TCLKDIV; //配置 SPORT 传输接口的时钟频率
 *pSPORT1_TFSDIV = TFSDIV; //配置 SPORT 传输接口的同步频率
 *pSPORT1_TCR1 = ITFS|TFSR|ITCLK; //配置 SPORT 传输工作模式
 *pSPORT1_TCR2 = 31; //配置 SPORT 以 32Bit 数据传输
 *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 每次地址增量变化
 *pDMA4_CONFIG = (*pDMA4_CONFIG | DMAEN); //使能传输 DMA
 *pSPORT1_TCR1 = (*pSPORT1_TCR1 | TSPEN); //使能传输 SPORT
 *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_TX_ISR) //传输 DMA 中断函数
 {
 *pDMA4_IRQ_STATUS = 0x0001; //清除中断标志位
 printf(“SPORT TX DMA Done!\n”); //打印信息
 *pSIC_IMASK &= ~0x00001000; //屏蔽接收中断
 }
代码实现功能
代码实现了通过 SPORT1 接口利用 SPORT1 DMA 传输数据和接收数据,SPORT1 接口时钟和同步信号采用内部由系统时钟配置分频获取。
代码描述了 SPORT1 接口使用 DMA 传输时常用的配置,由于没有和其他设备做通讯,所以看不到接收的实际数据。
也可以将扩展接口上 SPORT1 的 DT1PRI 和 DR1PRI 两个接口短接,实现环路测试功能,通过接收数据Buffer 查看收到的数据。

程序源码
#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);
}

















