您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> SPORT1口到DMA程序代码分析,DMA_X_COUNT设... 
本帖共有1135个阅读者
发表帖子 发表投票 回复主题
SPORT1口到DMA程序代码分析,DMA_X_COUNT设置的值和送出来的完全乱套了,实在是调不出了 请大侠帮我分析下
tommao(论坛新手)
tommao
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:167
积分:11
注册时间:2015/7/27
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPORT1口到DMA程序代码分析,DMA_X_COUNT设置的值和送出来的完全乱套了,实在是调不出了 请大侠帮我分析下

说明:芯片采用的是 BF592 ,这段代码我主要实现通过SPORT1口-DMA4口往FLASH写数据,写完成后进入中断关闭SPORT和DMA,通过 SPORT_Write()函数随便定义写时钟和写的数据长度,可是问题当我定义length小于16时,通过示波器发现SPORT口的TCLK只震荡6个脉冲就没有了,当length大于等于16时可以出来数据,但出来的数据只有6个字节,应该是16个字节的数据啊,哪出问题了?

//main主函数==============================================

void SPORT_Write(unsigned char clk,unsigned char length);

main()
{
set_PLL(16,4);//-----400M----100M
sport_init();
CoreTimer_init();
while(1)
{
  if(system_da>50)//-------500MS延时
  {
   system_da=0;
  
   SPORT_Write(10,3);
   dprintf("*pDMA4_CONFIG=[%x],*pSPORT1_TCR1=[%x],*pDMA4_X_COUNT=[%d]--%d\r\n",*pDMA4_CONFIG,*pSPORT1_TCR1,*pDMA4_X_COUNT,uart_temp);    
  
   }
}
}

//SPORT1口发送函数========================================

void SPORT_Write(unsigned char clk,unsigned char length)
{
*pSIC_IMASK &= ~(1<<12);
  
*pSPORT1_TCLKDIV = clk;
*pSPORT1_TFSDIV = 7;// SPORT TFS EVERY 8 SPORT CLK CYCLES
*pSPORT1_TCR2 = SLEN(7);  // TX WORD LENGTH 8 BIT
*pSPORT1_TCR1 = TCKFE|LATFS|LTFS|ITFS|ITCLK|TLSBIT|DITFS;//|TFSR;
*pSPORT1_STAT = 0x76;  // clear errors
*pSPORT1_TCR1 |= TSPEN;
ssync();
//*pDMA4_CONFIG =  DI_EN;
*pDMA4_START_ADDR = writeflash;
*pDMA4_X_COUNT = length;
*pDMA4_IRQ_STATUS |= DMA_DONE;
*pDMA4_CONFIG =  DI_EN;
*pDMA4_CONFIG |= DMAEN;
//*pSIC_IMASK |= (1<<12);  // DMA4 interrupt
ssync();
*pSIC_IMASK |= (1<<12);  // DMA4 interrupt
}

//SPORT1口初始化=========================================

void sport_init(void)
{
*pPORTF_FER |= (PF1|PF2|PF3|PF5|PF6|PF7);
*pPORTF_MUX &= ~(PF1|PF2|PF3|PF5|PF6|PF7);
register_handler(ik_ivg9, SportTransceiver_ISR);
ssync();
}

//发送SPORT1-DMA4中断函数=================================

EX_INTERRUPT_HANDLER(SportTransceiver_ISR)
{
if(*pDMA4_IRQ_STATUS & DMA_DONE)
{
  *pDMA4_IRQ_STATUS|= DMA_DONE;

  *pDMA4_CONFIG &= ~DMAEN;
  *pSPORT1_TCR1 &= ~TSPEN;
  
  //*pUART0_THR = 0X77;
      
}
}


hello!
等级:论坛新手 参考IP地址:*.*.*.*
2015/9/1 16:54:58
tommao(论坛新手)
tommao
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:167
积分:11
注册时间:2015/7/27
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

今天测设感觉  DMA没有发送完我规定的字节就中断了.


hello!
等级:论坛新手 参考IP地址:*.*.*.*
2015/9/2 10:39:06
tommao(论坛新手)
tommao
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:167
积分:11
注册时间:2015/7/27
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

等待中,顶!!!!!


hello!
等级:论坛新手 参考IP地址:*.*.*.*
2015/9/6 10:04:38
tommao(论坛新手)
tommao
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:167
积分:11
注册时间:2015/7/27
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

再顶!!!


hello!
等级:论坛新手 参考IP地址:*.*.*.*
2015/9/8 10:17:01
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
andy帮忙分析一下。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2015/9/8 10:30:53
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
没遇到过这种情况。你可以这样做。
先看一下配置到DMA寄存器中的数据是否为你写入的数据,避免数据没有正确配置。
另外看一下DMA寄存器的错误标志位,出现这种情况时,错误标志位是否置1。置1表示DMA出错。
连续运行看示波器的数据,不要单步,单步有时抓不到数据。中断函数中不要打断点。
记得有一些中断相关的寄存器是只写的,不能用与或操作,这个你再检查一下。




这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2015/9/9 22:23:33
tommao(论坛新手)
tommao
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:167
积分:11
注册时间:2015/7/27
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

首先 感谢版主的解答:

程序是烧录到芯片里面全速运行;

在这种情况下我把DMA的状态标志通过UART打印出来了是正常的,没有错误标志;

寄存器的配置我也担心出问题,但各个寄存器我也都打印过都是我配置的值,真是奇怪了!!!


hello!
等级:论坛新手 参考IP地址:*.*.*.*
2015/9/10 11:37:02
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你把处理器的速度降到200M,把系统时钟降到80兆以下看看。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2015/9/13 22:37:36
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.160107 Call, 1 Queries, Processed in 0.062500 second(s),