这款芯片用的人好少哈,只能自己慢慢瞎琢磨了,为了以后同仁不会犯同样的错误,下面将我自己解决的方法和代码贴出,希望对大家有用!!
改变如下:
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 编辑过」