这款芯片用的人好少哈,只能自己慢慢瞎琢磨了,为了以后同仁不会犯同样的错误,下面将我自己解决的方法和代码贴出,希望对大家有用!!
改变如下:
1、采用IRQ1中断控制SPORT DMA连续性传输;
2、采用SW1控制IRQ1中断,LED1显示IRQ1中断的状态;
3、双通道变成单通道,采用standard serial标准传输,一次传2个数据,这里定义8个数据,传4次;
用法如下:
1、通过VDSP++ 5.0编译通过,打开View->Debug Windows->Plot,观察所需观察的数据rx_buf3a,设置相关参数;
2、运行,按Sw1,产生IRQ1中断,Led1变暗,暂停,然后就会发现Plot中数据变为1,2,0,0,0,0,0,0,如此循环,观察;
结果如下:
1、可实现外部中断IRQ1控制SPORT DMA传输;
2、数据可循环连续性传输;
3、实验数据证明了代码的正确性;
代码注意如下:
1、initPLL_SDRAM();这个子函数因为example示例代码中有相关代码,就不一一贴出,自己整合一下;
2、因个人水平有限,代码肯定会有有误的情况,希望大家能指出,希望对大家有用;
#include <Cdef21369.h>
#include <def21369.h>
#include <sru.h>
#include <signal.h>
#include <stdio.h>
#include <sysreg.h>
#define bufsize 8
//全局变量,,发送、接收
int tx_buf2a[bufsize]= {1,2,3,4,5,6,7,8};   
int rx_buf3a[bufsize];
int SP2I_counter = 0;//程序测试用,,,
int SP3I_counter = 0;
//函数原型
void initPLL_SDRAM(void);
void Setup_Leds(void);
void TRIG_Init(void);
void IRQ1_Cnt(int sig_int);
void init_SPORT(void);
void Count_SPORT2_TX_IRQs(int);
void Count_SPORT3_RX_IRQs(int);
int main( void )
{	
	initPLL_SDRAM();//设置时钟和SDRAM
		
	init_SPORT();//初始化SPORT设置
	Setup_Leds();
	
	TRIG_Init();
	
	for(;;)
	{}
}
void init_SPORT(void)
{
	//初始化SPORT控制寄存器
	*pSPCTL2 = 0;
	*pSPCTL3 = 0;
	*pSPMCTL2 = 0;
	*pSPMCTL3 = 0;
    
	//设置SPORT2和SPORT3的Internal Loopback,,,只是用来测试用,为的是模拟FPGA与DSP相连
	*pSPMCTL2 |= SPL;
	*pSPMCTL3 |= SPL;
	
	//帧同步和时钟分频操作
        *pDIV2 = 0x001F0000;//0保留,1~15位为CLKDIV时钟分频位,16~31位为帧信号分频位,,,level sensitive,,I2S为edge detection			
	*pDIV3 = 0x001F0000;//外部产生时钟和帧同步信号
	
 	 	//类似于SIMD中的DM、PM的Ix、Bx、Mx、Lx的操作,,采用A-B双通道数据传输
	*pIISP2A = (int) tx_buf2a;    //内部DMA存储地址
        *pIMSP2A = 1;  //内部DMA访问地址修改
        *pCSP2A = 2;    //DMA传输数据所包含的数据大小
    
        *pIISP3A = (int) rx_buf3a; 
        *pIMSP3A = 1; 
        *pCSP3A = 2;    
}
void Count_SPORT2_TX_IRQs(int sig_int) //发送中断
{	
	SP2I_counter++;	
	
}
void Count_SPORT3_RX_IRQs(int sig_int)//接收中断
{ 	
	SP3I_counter++;
	
	//初始化SPORT控制寄存器
	*pSPCTL2 = 0;
	*pSPCTL3 = 0;
	
	if(SP3I_counter == 4)//循环传输
	{
		*pIISP2A = (int) tx_buf2a; 
		*pIISP3A = (int) rx_buf3a; 
		SP3I_counter = 0;
	}
	else 
	{
		*pIISP2A = (int) (tx_buf2a + SP3I_counter*2) ;    //内部DMA存储地址
		*pIISP3A = (int) (rx_buf3a + SP3I_counter*2); 
	}
        *pIMSP2A = 1;  //内部DMA访问地址修改
        *pCSP2A = 2;    //DMA传输数据所包含的数据大小
    
        *pIMSP3A = 1; 
        *pCSP3A = 2;  
    
        interrupt(SIG_SP3,SIG_IGN); //则中断屏蔽寄存器IMASK中SPORT3中断对应的位会被清零,即SPORT3 DMA被屏蔽掉了。
}
void Setup_Leds(void)
{
    SRU(FLAG4_O,DPI_PB06_I);    // Connect Flag4 output to DPI_PB06 input (LED1)
	
    SRU(HIGH,DPI_PBEN06_I);     //enable
    
    sysreg_bit_set(sysreg_FLAGS, (FLG4O));//设置FLAG4和FLAG5为输出
    sysreg_bit_set(sysreg_FLAGS, (FLG4));//对FLAG4和FLAG5置1,,即开始的所有的灯都默认为亮
}
//////////////////////////////////////////////////////////////////////////////
// void TRIG_Ints(void)
//
//////////////////////////////////////////////////////////////////////////////
void TRIG_Init(void)
{
	(*pSYSCTL) |= (IRQ1EN);	//IRQ0 & IRQ1 are allocated to interrupt request
	sysreg_bit_set(sysreg_MODE2, (IRQ1E) );	// edge sens
	sysreg_bit_clr(sysreg_IRPTL, (IRQ1I) );
	sysreg_bit_set(sysreg_IMASK, (IRQ1I) ); //enable IRQ interrupts
	sysreg_bit_set(sysreg_MODE1, IRPTEN ); 		  //enable global interrupts
	interrupt(SIG_IRQ1,IRQ1_Cnt);	// set the ISR for IRQ1
}
void IRQ1_Cnt(int sig_int)
{
	int i;
	sysreg_bit_tgl(sysreg_FLAGS, FLG4);//按键sw1点亮或者熄灭第一个led灯
	
	interrupt(SIG_SP3,Count_SPORT3_RX_IRQs);
	
    	//SPORT DMA设置
   	*pSPCTL2 = (SPEN_A|SLEN32|ICLK|FSR|IFS|SPTRAN|SDEN_A);//设置SPORT2为发送,自生时钟信号(ICLK),自生帧同步信号(IFS)
   	*pSPCTL3 = (SPEN_A|SLEN32|FSR|SDEN_A);//设置SPORT3为接收
		
   	for(i = 0; i < 8; i++)
   	{
        	printf("i=%d,%d\n",i,rx_buf3a[i]);
        }
	
}
「该帖子被 btbt208 在 2013-08-21 09:12:49 编辑过」