您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 从51上移植一个AD的程序到ADSP_BF518上,没... 
本帖共有688个阅读者
发表帖子 发表投票 回复主题
从51上移植一个AD的程序到ADSP_BF518上,没能成功,求大神指点?
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
从51上移植一个AD的程序到ADSP_BF518上,没能成功,求大神指点?
这几天刚入手一块ADS805E的AD转换模块,用51单片机成功的控制ADS805E实现了AD转换。然后准备将51上的程序移植到ADSP_BF518上,让DSP也可以进行AD采集数据,可是一直没能实现AD转换,不知道是哪里出了问题,难道是单片机51的晶振12M和ADSP的内核时钟150M造成的,是不是ADSP_BF518的机器时钟太快了?如果是机器时钟太快,可以延时调整,可也调整过了,还是AD转换出来的值不对。下面我贴出ADS805E的时序图和51程序和BF518的程序。
单片机51的控制程序:
void main (void)
{
SCON = 0x50;       //REN=1允许串行接受状态,串口工作模式2       
TMOD|= 0x20;      //定时器工作方式2                      
PCON|= 0x80;      //波特率提高一倍                                                    
TH1 = 0xf3; // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)
     TL1 = 0xf3;
TR1  = 1;        //开启定时器1                                                      
ES   = 1;        //开串口中断                  
EA   = 1;        // 开总中断
     // IE = 0x0;
OE = 1;
CLK = 1;
    while(1)
    {  
a=0;
i=0;

CLK = 0;   //下降沿读取数据
_nop_ ();  //短暂延时
_nop_ ();
OE = 0;
BUF2 = (P0&0x0f);  //读取数据高4位
BUF1 = P2;     //读取数据低8位
OE = 1;
_nop_ ();
CLK = 1;
sendChar(BUF2); //串口发送到上位机
sendChar(BUF1);
_nop_ ();

}
}


以下是ADSP_BF518的控制程序:
#include <cdefBF518.h>
#include <sys\exception.h>
#include <ccblkfn.h>
#include <stdio.h>

#define  AD_CLK  PH6
#define  AD_OE   PH5

unsigned short AD_BUF[100];
unsigned short i;

void Delay(int count) //简单延时
{
int i;
for(i=0;i<count;i++);
}

void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm("ssync;");
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm("ssync;");
asm("idle;");
}
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x010f;
}

void Init_SDRAM(void)
{
*pEBIU_SDRRC =  0x00000817;
*pEBIU_SDBCTL = 0x00000025;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}


void ADS805_PORTG_Init()
{
*pPORTH_FER &= ~(AD_CLK | AD_OE); //PG0—PG14为普通IO口
*pPORTHIO_DIR |=  (AD_CLK | AD_OE ); //方向为输出

*pPORTG_FER &=~(PG0 |PG1|PG2|PG3|PG4|PG5|PG6|PG7|PG8|PG9|PG10|PG11); //PG0—PG14为普通IO口
*pPORTGIO_DIR &=~(PG0 |PG1|PG2|PG3|PG4|PG5|PG6|PG7|PG8|PG9|PG10|PG11); //PG0—PG11  AD_OVR为输入
*pPORTGIO_INEN |= (PG0 |PG1|PG2|PG3|PG4|PG5|PG6|PG7|PG8|PG9|PG10|PG11); //输入使能
ssync();
}


void main( void )
{
unsigned short a;
Set_PLL(6,5); //时钟分频,内核时钟25*6M=150M,系统时钟25*6/5=30M
Init_EBIU(); //EBIU 初始化
     Init_SDRAM(); //SDRAM初始化
       ADS805_PORTG_Init();
*pPORTHIO |=  AD_CLK;
*pPORTGIO |=  AD_OE; //AD输出禁止

while(1)
{
pSDRAM_Data=0x0000;
for(i=0;i<100;)
{
*pPORTHIO &= ~AD_CLK; //下降沿读取数据
Delay(70); //短暂延时

*pPORTHIO &= ~AD_OE; //AD输出使能
AD_BUF[i]  = *pPORTGIO & 0x0fff; //取12位的AD值
*pPORTHIO |=  AD_OE; //AD禁止输出
*pPORTHIO |=  AD_CLK;
i++;
}
      Delay(70);
}

}





上传的图片
  20147102115201.jpg [ 107.82 KB 863×503 ] (缩略时请点击查看原图)

 



「该帖子被 懒得取名 在 2014-07-10 21:15:07 编辑过」

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/10 15:03:32
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
时序是通过延时函数来调整的,建议不要降低内核和系统时钟,时钟太低,DSP可能会工作不稳定。
调试硬件主要是配时序,不要仅仅是模拟其他处理器的代码来写,其他的代码只能作为参考,更多的是要看AD的数据手册。
首先你要确保你的硬件接口都能正确输出方波,读取数据接口能正确获得外部IO状态。
然后你要匹配硬件连接时序,如当前时钟是50-100uS,你用DELAY延时不准确的话,可以用定时器写一个延时函数,绝对精确,这个延时函数我有BF533上的,一会发到下载区,你可以参考。
硬件上,你要确保焊接没有问题,设计没有问题,电源,时钟都能正常工作,芯片质量没有问题(这个不好确认,买的时候尽量从正规渠道拿货)
然后先读芯片一个已知数据的寄存器,如芯片的ID,如果没有ID,可以给AD口加一个固定电压,计算出应该读取一个什么样的值,进行读取,读取时,可尝试单步或者连续,必要时,需要在每个IO操作之间增加一些延时,直到读取到正确的值。

硬件调试由于软件和硬件都存在未知的状态,所以需要静下心来一点一点调,单独看代码是找不到原因的,另外不要迷信参考代码的逻辑,毕竟你没有跑过,只能作为参考,具体的还是看数据手册。
以上是我调试硬件的经验,祝你调试成功。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/7/12 20:59:31
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/7/12 21:04:09
懒得取名(论坛新手)
懒得取名
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:298
积分:28
注册时间:2014/2/13
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢,ANDY哥的经验指导,我会再调试看看。有一个地方我不太明白就是:我把Set_PLL(6,5); //时钟分频,内核时钟25*6M=150M,系统时钟25*6/5=30M,会使系统不稳定吗?我用的是BF518,如果我把Set_PLL(16,4);,那么我的USB就是总是会发送误码,使得误码率很高了。我都不敢随便改动系统时钟了。Set_PLL(6,5);设置成这样的系统时钟,还是很低吗?

我是一个菜鸟。
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/14 9:47:56
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
插播广告,OpenADSP开源社区提供BF518芯片、开发板、仿真器正品现货,如有需要,请联系OP的QQ:5516164,邮箱:sale@openadsp.com,淘宝网店:http://dsp-tools.taobao.com/

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/7/14 9:52:14
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
这个AD和USB有何关系,如果你是串口的话,是波特率和系统时钟没有匹配好,需要重新配置。
DSP运行速度太低可能会出问题,但并不是说一定会出问题,并没有资料表明最低速度能到多少。你试试如果没有问题你就继续用,遇到异常就把速度调高点。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/7/15 22:27:55
ooaa123(论坛新手)
ooaa123
头衔:社区公民
帮派:无帮无派
帖数:18
金钱:222
积分:20
注册时间:2018/3/13
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
学习了!

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2018/3/26 18:29:50
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154202 Call, 1 Queries, Processed in 0.031250 second(s),