小弟最近刚刚接触C6000写了一个程序,一会发下来,我发现当定时器计数的时候,MCBSP就发不出来数了。
但是把定时器和中断关掉,MCBSP立刻就可以出来数据= =
附程序:
//#include <math.h>
#include <csl.h>
#include <stdio.h>
#include <std.h>
#include <csl_irq.h>
#include <csl_emif.h>
#include <csl_mcbsp.h>
#include <emif_init.h>
#include <mcbsp_init.h>
#include <time_init.h>
/************************************************/
Uint32 *Src_StartAdd;
Uint32 *Dst_StartAdd;
Uint32 TempData[4096];
Uint32 Length=0x00001000;
/**************MCBSP*************************/
static MCBSP_Handle hMcbsp0; //句柄设置
static MCBSP_Handle hMcbsp1; //句柄设置
/**************************定时器****************/
static Uint32 TimerControl;
static Uint32 TimerPeriod;
static Uint32 TimerCount;
static TIMER_Handle hTimer1;
static Uint32 TimerEventId;
#define TIMER_CNT 100
#define FALSE 0
#define TRUE 1
//static Uint32 cnt = 0;
static Uint32 y=0;
static Uint32 i=0;
static Uint32 cnt = 0;
void TimerEventHandler(void);
extern far void vectors(); //中断向量表
void startMCBSP(void); //串口打开
//void RS422_transfer();
void DINGSHIQI();
void main()
{
/**************定义****************/
volatile Uint32 x,y;
int success = 1;
DEC6701_INIT(); //EMIF初始化
DEC6701_TIMER(); //定时器初始化
CSL_init();
/**********************************/
Src_StartAdd = (Uint32 *)0x02000000;//SRAM清零
for(i=0;i<0x00400000;i++)
{
*(Src_StartAdd+i) = 0;
}
hMcbsp0 = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET); //句柄设置
hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET);
DEC6701_MCBSP_INIT(); //初始化MCBSP0.1
startMCBSP(); //启动MCBSP
for (y=0; y<0x00080000; y++)
{
while (!MCBSP_xrdy(hMcbsp0));//等待
MCBSP_write(hMcbsp0,y);
while (!MCBSP_rrdy(hMcbsp0));
x = MCBSP_read(hMcbsp0);
if (x != y)
{
success = 0;
break;
}
}
MCBSP_close(hMcbsp0);
printf("SUCCESS=%d",success);
// RS422_transfer();
/**************************************************
****************定时器发送****************/
DINGSHIQI();
TIMER_start(hTimer1);
while(cnt <= TIMER_CNT); /* waiting for interrupt*/
MCBSP_close(hMcbsp1);
}
void startMCBSP(void)
{
MCBSP_start(hMcbsp0,MCBSP_RCV_START | //start transmit(XRST)
MCBSP_XMIT_START | //start receive(RRST)
MCBSP_SRGR_START | //start sample rate generator(GRST)
MCBSP_SRGR_FRAMESYNC, //start frame sync.generation(FRST)
MCBSP_SRGR_DEFAULT_DELAY); //MCBSP_SRGR_DEFAULT_DELAY,0x00003000
MCBSP_start(hMcbsp1,MCBSP_RCV_START | //start transmit(XRST)
MCBSP_XMIT_START | //start receive(RRST)
MCBSP_SRGR_START | //start sample rate generator(GRST)
MCBSP_SRGR_FRAMESYNC, //start frame sync.generation(FRST)
MCBSP_SRGR_DEFAULT_DELAY); //MCBSP_SRGR_DEFAULT_DELAY,0x00003000
}
void DINGSHIQI(void)
{
hTimer1 = TIMER_open(TIMER_DEV1,TIMER_OPEN_RESET);//Open TIMER1 device, and reset them to power-on default state.
TimerEventId = TIMER_getEventId(hTimer1); //Obtain the event ID for the timer device.
IRQ_setVecs(vectors); /* point to the IRQ vector table */
IRQ_globalEnable(); /* Globally enable interrupts */
IRQ_nmiEnable(); /* Enable */
IRQ_map(TimerEventId,14);
IRQ_reset(TimerEventId);
IRQ_enable(TimerEventId);
}
/*void RS422_transfer()
{
for (y=0; y<0x00080000; y++)
{
while (!MCBSP_xrdy(hMcbsp1));//等待
MCBSP_write(hMcbsp1,y);
}
}
*/
void TimerEventHandler(void)
{
cnt++;
if (cnt > TIMER_CNT)
{
for (y=0; y<0x00080000; y++)
{
while (!MCBSP_xrdy(hMcbsp1));//等待
MCBSP_write(hMcbsp1,y);
}
}
}
interrupt void
c_int14(void)
{
TimerEventHandler();
return;
}
很简单
我总结了一下:
A:TIMER_START();
SENDDATA();
WHILE(1); 定时器工作,MCBSP不出数
B:TIMER_START();
WHILE(1)
{
SENDDATA();
}
MCBSP工作,定时器不工作
很不解- -
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
McBSP通过7个引脚(DX、DR、CLKX.、CLKR、FSX、f7SR和CLKS)与外设接口。DX和DR引脚完成与外部设备进行通信时数据的发送和接收,由CLKX、CLKR、FSX、FSR实现时钟和帧同步的控制。由CLKS来提供系统时钟。发送数据时,CPU和DMA控制器将要发送的数据写到DXR(数据发送寄存器),存FSX和CLKX作用下,由DX引脚输出。接收数据时,来自DR引脚的数据在FSR和CLKR作用下,从DRR(数据接收寄存器)中读取数据。接收和发送帧同步脉冲既可以由内部采样速率产生器产生,又可以由外部脉冲源驱动,McBSP分别在相应时钟的上升沿和下降沿进行数据检测。
冲突应该是可以避免的 请你在找找具体影响的原因
我现在主要没搞明白,产生冲突的原因- -。。。我看了一下6701的硬件结构,发现这两个模块公用一个数据总线,我就怀疑是不是数据在总线冲突了,然后我就在每一次定时器结束的时候把定时器关了,发完数据在打开。但是发现数据还是出不来,然后定时器还在那里开心的计数
有多老 请上图
一周热门 更多>