打印

C6701程序发生问题,貌似定时器和MCBSP冲突

[复制链接]
1297|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
油漆洗铁路|  楼主 | 2014-11-17 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近刚刚接触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工作,定时器不工作

很不解- -

相关帖子

沙发
油漆洗铁路|  楼主 | 2014-11-17 19:51 | 只看该作者

使用特权

评论回复
板凳
油漆洗铁路|  楼主 | 2014-11-17 22:54 | 只看该作者
是因为太老了= =没人理我了么= =

使用特权

评论回复
地板
zhangmangui| | 2014-11-17 23:43 | 只看该作者
TMS320C6701提供了2个高速多通道缓存串行口。McBSP提供了双缓存的发送寄存器和三缓存的接收寄存器,具有全双工的同步或异步通信功能,允许连续的数据流传输;数据发送和接收有独立可编程的帧同步信号;能够与工业标准的解码器、模拟接口芯片或其他串行A/D与D/A设备、SPI设备等直接相连;支持外部时钟输入或内部可编程时钟;每个串行口最多可支持128个通道的发送和接收;支持传输的数据字长可以是8bit、12bit、16bit、20bit、24bit或32bit。
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分别在相应时钟的上升沿和下降沿进行数据检测。


冲突应该是可以避免的    请你在找找具体影响的原因

使用特权

评论回复
5
油漆洗铁路|  楼主 | 2014-11-18 09:06 | 只看该作者
zhangmangui 发表于 2014-11-17 23:43
TMS320C6701提供了2个高速多通道缓存串行口。McBSP提供了双缓存的发送寄存器和三缓存的接收寄存器,具有全 ...

我现在主要没搞明白,产生冲突的原因- -。。。我看了一下6701的硬件结构,发现这两个模块公用一个数据总线,我就怀疑是不是数据在总线冲突了,然后我就在每一次定时器结束的时候把定时器关了,发完数据在打开。但是发现数据还是出不来,然后定时器还在那里开心的计数

使用特权

评论回复
6
油漆洗铁路|  楼主 | 2014-11-18 10:39 | 只看该作者

使用特权

评论回复
7
小木欧尼| | 2014-11-18 18:01 | 只看该作者
油漆洗铁路 发表于 2014-11-17 22:54
是因为太老了= =没人理我了么= = ...

有多老 请上图

使用特权

评论回复
8
油漆洗铁路|  楼主 | 2014-11-19 11:15 | 只看该作者
小木欧尼 发表于 2014-11-18 18:01
有多老 请上图

是什么图?是6701么?还是程序?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

1

粉丝