您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF512连接AD7327,AD采不了值
本帖共有828个阅读者
发表帖子 发表投票 回复主题
BF512连接AD7327,AD采不了值
hu12huha(论坛新手)
hu12huha
头衔:社区公民
帮派:无帮无派
帖数:7
金钱:155
积分:9
注册时间:2014/1/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF512连接AD7327,AD采不了值

#include "adi_initialize.h"
#include "gai.h"
#include <cdefBF512.h>
#include <ccblkfn.h>

void Set_PLL(int  pmsel,int pssel)

{

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_SDRAM(void)

{

*pEBIU_SDRRC = 0x00000817;

*pEBIU_SDBCTL = 0x00000025;

*pEBIU_SDGCTL = 0x0091998d;

ssync();

}

void Init_EBIU(void)

{

*pEBIU_AMBCTL0 = 0x7bb07bb0;

*pEBIU_AMBCTL1 = 0x7bb07bb0;

*pEBIU_AMGCTL = 0x000f;

}

void delay(unsigned char i)
{
int a;
for(a=0;a<i;a++);
}

#include <cdefBF512.h>

void SPIinit(void)

{

*pSPI1_BAUD=30;

*pSPI1_FLG=0xFF20;

*pSPI1_CTL = 0x1001|CPHA| CPOL|SIZE;

*pSPI1_CTL = (*pSPI1_CTL | SPE);

}



int SPI1_byte_rw(unsigned int value)

{

int incoming=0;

while(!(*pSPI1_STAT & SPIF));

*pSPI1_TDBR = value;

while(*pSPI1_STAT & RXS)

incoming = *pSPI1_RDBR;

return(incoming);

}

#include <stdio.h>
#include <cdefBF512.h>

int main(void)
{
int tem_x[10];
int i;
i=0;
adi_initComponents();
Set_PLL(16,4);
Init_EBIU();
SPIinit();

delay(0xff);

*pSPI1_FLG &= FLG5;

delay(0xff);

SPI1_byte_rw(0xAAA0);

delay(0xff);
*pSPI1_FLG =0xFF20;

delay(0xff);

*pSPI1_FLG &= FLG5;

delay(0xff);

SPI1_byte_rw(0xCAA0);

*pSPI1_FLG = 0xFF20;

delay(0xff);

*pSPI1_FLG &= FLG5;

delay(0xff);

SPI1_byte_rw(0x9C38);

delay(0xff);

*pSPI1_FLG =0xFF20;

delay(0xff);
while(1)

{
  *pSPI1_FLG &= FLG5;

  delay(0xff);
if(i!=10)
{
  tem_x[i++]=SPI1_byte_rw(0x0000);
}
else
i=0;
delay(0xff);
  *pSPI1_FLG = 0xFF20;

  delay(0xff);

}

}

这个是我写的BF512通过SPI1口与AD7327连接的小程序,然后AD采用连续工作模式,但是为什么我的AD采不进去值呢?


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/1/15 16:01:37
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你先测试一下你手动操作SPI片选信号,信号是否会根据你的操作置高置低。
你看看AD芯片时序中,AD采集过程中片选是需要始终保持为低,还是发送一个数据就要拉高,通常拉高表示本次采集完成。
SPI接收数据时,需要主机提供SPI时钟,SPI时钟只有在SPI主机发送数据时才能产生,所以你的代码送完命令字后,AD芯片还没有返回数据,你就结束采集了,这样踩不到数据,必须再继续保持片选为低,然后发送数据0,此时如果AD有数据返回,会自动存入接收FIFO中,然后你再读取,有时数据不会在下一个时钟返回,所以你多发送几个0看看是否能读到返回数据。
另外SPI的速度是否满足芯片要求,你的延时是否满足,看一下内核时钟寄存器,确认你的延时函数没有被优化掉。

我们网站上有个触摸屏的代码,你可以参考一下。

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

我没找到您说的那个触摸屏的程序啊,您可否发个链接,谢谢


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

while(1)

{
  // *pSPI1_FLG &= 0xDFFF;
   delay(0xff);
   SPI1_byte_rw(0x0000);
   SPI1_byte_rw(0x0000);

我测过那个片选信号一直是有的,也是按我的要求拉高拉低的,然后再送完命令字后我就通过这个程序来发送数据0,而且在这段时间我检测时钟信号也是一直有的,但就是没有数据采集


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/2/19 15:23:16
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如果确认硬件没问题的话,好好配置一下时序吧,根据数据手册的时序图,看看自己的波形和时序要求还有哪不一样,或者用示波器把波形抓下来,然后测量每个波形的时间是否满足时序上要求的,在读取数据时多读几次,必要的话,可以尝试在某些地方加一些短延时,耐心调调。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/2/20 0:14:23
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.160012 Call, 1 Queries, Processed in 0.015625 second(s),