您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 求助:ADSP_BF518外部EBIU总线扩展的问题(... 
本帖共有2328个阅读者
发表帖子 发表投票 回复主题
求助:ADSP_BF518外部EBIU总线扩展的问题(68013与ADSP_BF518的EBIU连接)
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求助:ADSP_BF518外部EBIU总线扩展的问题(68013与ADSP_BF518的EBIU连接)

不知道论坛的大侠,做过类似的工程实验没?我用Cypress的USB芯片68013和ADSP_BF518做个上下位机数据传输的实验,目前上位机PC往下位机发数据已经能够接收到了。但是由下位机ADSP_BF518往上位机PC发存在很多的问题,给*EP6赋值总是赋值不进去,一直为0,以至于上位机接收下位机数据一直都是0。

描述问题:

1、  对*Ep6的读出访问错误,数据总是写入不到地址0x20200008中去。但是,用了printf打印*EP6的值是正确的,是已经被读出了的,可是在BLACKFIN Memory查看又全都是0。

2、  怎么样才能实现对*Ep6数据的写入呢?我这样才做有误吗?

for(k=0;k<256;k)                //512字节时,EP6 AUTOIN自动提交

          
{    

          
//   Delay(5000);

          
      *EP6=k;  

//   printf("\nb[k] receite Data is %x\n",b[k]);

//    printf ("\n*EP6 receite Data is %x\n",*EP6);

       k++;

}

这怎么解释呢?详细见图片:


上传的图片
  201441116143461.png [ 29.45 KB 525×209 ] (缩略时请点击查看原图)

 


上传的图片
  201441116144561.png [ 66.90 KB 769×270 ] (缩略时请点击查看原图)

 


上传的图片
  201441116155861.png [ 45.97 KB 710×468 ] (缩略时请点击查看原图)

 

以下是我主要的程序:

#define EP2  
(volatile unsigned int *)0x20200000           //定义一个指针,地址指向 BANK2

#define EP6  
(volatile unsigned int *)0x20200008           //定义一个指针,地址指向 BANK2

void
Init_EBIU(void)

{

     *pEBIU_AMBCTL0      = 0x7bb07bb0;

     *pEBIU_AMBCTL1      = 0xffc0ffc0;

     *pEBIU_AMGCTL       = 0x0006;

}

void
Init_SDRAM(void)

{

     *pEBIU_SDRRC = 0x00000817;  

     *pEBIU_SDBCTL =0x00000025;

     *pEBIU_SDGCTL =0x0091998d;      

     ssync();

}

void
InitPorts(void)

{

       *pPORTH_FER      |=PH4;                //复用为AOE

      *pPORTH_MUX   =1<<2;

       *pPORTH_FER      |=PH5;                //复用为ARDY

      *pPORTH_MUX   =1<<2;

        *pPORTG_FER |=PG11;                  //复用AMS[2]

        *pPORTG_MUX |=1<<0x0C;

        sync();

}

主程序如下:

int main( void )

{

       unsigned int k,i,j;

       Set_PLL(16,4);

  
      Init_EBIU();  

  
     Init_SDRAM();

  
     InitPorts();

     i=0;

      k=0;

       while(1)

       {

                   DataBuf[i] =*EP2;

//    
            printf("\n*EP2 receite Data is %x\n",*EP2);

//    
            printf("\nDataBuf receite Data is %x\n",DataBuf[i]);

            i++;

                  if(i==5)

                  {

                          i=0;

                         for(k=0;k<256;k)                 //512字节时,EP6 AUTOIN自动提交

                         {    

//                              Delay(5000);

                                *EP6=k;  

//                              printf("\nb[k] receite Data is %x\n",b[k]);

//                              printf("\n*EP6 receite Data is %x\n",*EP6);

                                 k++;

                
                         }

                   }

       }





}



「该帖子被 懒得取名 在 2014-04-11 16:25:47 编辑过」

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/11 16:19:37
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
没有人知道吗?

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/15 8:46:02
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我自己给自己顶。


我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/15 8:46:23
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
地址0x20280000 位于bank2,这个地址是映射的USB设备寄存器地址。建议不要直接用memory查看他的值,用printf打印出,或者将这个值读取一个数组再查看。
直接通过memory查看这个地址,可能这个地址不会实时更新。只有对SDRAM或者L1的区域的数据,可以这么查看。对于外设地址,可能看不到正确的数据。

这个芯片没调过,所以一些具体的细节无法回答你。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/15 9:55:16
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
andy哥,现在就是对这个外部映射的USB设备存储器无法写入数据,不知道为什么赋值是赋值不了的?
然后我按照你说的,用一个数组读取,在数组里我看到的是正确存储的值,或者Printf打印输出也是正确的值。
还有一点是如果我用Visual DSP下的Memory下的Fill Memory填充外设的USB存储器,那么在上位机接收处是正确的填充值?我在想是不是不能直接对这个外设直接赋值呢,要通过生成bin文件或者是其他的数据文件,加载才可以对这个外设写入?如果是这样,要怎么操作?

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/15 15:27:06
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
异步BANK 不能通过fill方式给外设USB器件赋值。只能通过代码,你先用文件系统把文件填充到数组里,再用代码把数据写进USB设备。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/15 19:16:06
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
文件系统需要系统支持吗?不会搞系统呢。文件系统也没有做过。困难重重

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/16 8:37:54
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
参考我们网站上的的TFT代码。
用fopen 函数打开工程下指定文件,然后用fread读取即可。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/4/17 1:13:43
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
8信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
andy哥,我在考虑用 MDMA直接把SDRAM的数据传到EBIU映射的USB的地址(0x20200020)。程序:
void Init_MDMA(unsigned short *pSrc,unsigned short *pDest)
{
*pMDMA_S0_START_ADDR = pSrc; //设置源地址
*pMDMA_S0_X_COUNT = 256; //传输次数 8次
*pMDMA_S0_X_MODIFY = 2; //地址修改增量2,16bit模式一次读2个byte
*pMDMA_D0_START_ADDR = pDest;
*pMDMA_D0_X_COUNT = 256;
*pMDMA_D0_X_MODIFY = 2;

// *pMDMA_S0_PERIPHERAL_MAP = 0x0040; //配置使用的DMA通道    BF51X系列的不需要,寄存器上不见有
// *pMDMA_D0_PERIPHERAL_MAP = 0x0040;
*pMDMA_S0_CONFIG = 0x0024; //配置源DMA工作模式
*pMDMA_D0_CONFIG = 0x00a6; //配置目的DMA工作模式
}

void MDMA_Enable(void) //使能MDMA
{
*pMDMA_S0_CONFIG |= 0x0001;
*pMDMA_D0_CONFIG |= 0x0001;
}

我在今天实验了一下,如andy说的差不多,外部映射的寄存器,没能实时的更新。但是在上位机接收到的数据很奇怪的,成了比较有序的等差数列了。我的原意是想发0x00到0xff的,结果成了01,05,09,0d。。。。(成了一个公差为4的等差数列)。这是不是USB异步存储器造成的延迟问题呢?

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/17 16:37:16
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
9信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如果SDRAM里面的数据是一个单一数据,比如是0xaa,那发送到上位机的也全部是0xaa。如果是变化的数据DataTest,就会出现上诉的情况了,成了一个等差数列。
for(k=0;k<256;k++) //512字节时,EP6 AUTOIN自动提交
DataTest[k]= k;
}

该怎么解决啊?

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/4/17 16:42:42
12
1
1/2
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159173 Call, 1 Queries, Processed in 0.033203 second(s),