这几天刚入手一块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);
}
}
「该帖子被 懒得取名 在 2014-07-10 21:15:07 编辑过」