1、芯片功能介绍
它是一个高精度的24bit采样SAR模数转换芯片 。
它有一个大的输入动态范围。能检测到小的电压变化
它的输出数据可以通过PCI或USB系统获得,读取数据的协议类似于SPI。
(1)引脚
通过示波器观看,可以知道当MSCK为30KHz时,SYNC/PD为高时,就能进行AD转化,有数据时DRDY为低,此时在SCLK的时序下把数据
移位到SDO中。当采用模拟的SPI(即不采用硬件的SPI模块时,请参考: )读取SDO时,SDO的频率为40KHz。而SCLK才900Hz.
从代码上讲SCLK拉高拉低的次数比SDO来得多,应该SCLK比SDO才对。会不会示波器有问题?
(2)读取时序图
上面讲到读取它的是SPI协议,只是类似,大家看它的时序就知道它不是真正的SPI,因为有DRDY脚.
读取方式有两种:CS为常低和读时CS才为低.
从上图可以看到,24bit数据是高位在前,注意的部分用红色圈起来了.
在编程中关键的是t6、t7、t8、t10、t11及最高位得做异或。
2、读数据程序实现
我采用的是读时再让CS下降.
由于是用GPIO口模拟SPI协议,下面的宏先定义各IO口,及读取它们的接口。
[cpp] view plain copy
#define CLK_BANK 2 // SCLK脚
#define CLK_BIT 9
#define DAT_BANK 1 // SDO脚
#define DAT_BIT 25
#define CS_BANK 1 // CS脚
#define CS_BIT 23
#define RDY_BANK 0 // DRDY脚
#define RDY_BIT 12
#define SDA_GPIO (DAT_BANK * 32) + DAT_BIT
#define SET_CLK_HIGH() \
{ \
pin_val[CLK_BANK] = (1<<CLK_BIT) \
}
//if(TRUE == g_bAddDelay) \
//OALStallExecution(g_delayUS) \
//}
#define SET_CLK_LOW() \
{ \
pin_valclr[CLK_BANK] = (1<<CLK_BIT) \
}
//if(TRUE == g_bAddDelay) \
// OALStallExecution(g_delayClkLowUs) \
//}
#define SET_CS_HIGH() \
{ \
pin_val[CS_BANK] = (1<<CS_BIT) \
}
//if(TRUE == g_bAddDelay) \
//OALStallExecution(g_delayUS) \
//}
#define SET_CS_LOW() \
{ \
pin_valclr[CS_BANK] = (1<<CS_BIT) \
}
//if(TRUE == g_bAddDelay) \
//OALStallExecution(g_delayUS) \
//}
#define GET_SDA_DATA ((pin_val[DAT_BANK] & (1<<DAT_BIT)) ? 1 : 0)
#define GET_RDY_DATA ((pin_val[RDY_BANK] & (1<<RDY_BIT)) ? 1 : 0)
把CS拉低后有一个t6才能CLK下降,t6是0ns.(其实可以把for(i = 0i <g_delayCSLowi++)去掉的
[cpp] view plain copy
static BOOL PCIPortRead(DEVICE_HANDLE *devHandlePtr, PULONG outBuffPtr)
{
int i = 0
BOOL retval = TRUE
// 当RDY为低时才去读数据
if(0 == GET_RDY_DATA)
{
#include <AT89X51.H>#include<math.h>
#include<INTRINS.h>
#define uchar unsigned char
#define uint unsigned int
sbit AD7707_DRDY=P3^3
sbit AD7707_DIN=P1^5
sbit AD7707_DOUT=P1^6
sbit AD7707_SCLK=P1^7
bdata uchar WtrByte
sbit WtrBit=WtrByte^7
void Init_AD7707(void) /*初始化AD7707*/
{
uchar i
AD7707_SCLK=1
AD7707_DIN=1
for(i=0i<100i++) /*防止接口迷失*/
{
AD7707_SCLK=0
AD7707_SCLK=1
}
}
void WriteToReg_AD7707(uchar RegByte) /*写AD7707寄存器*/
{
uchar i
WtrByte=RegByte
for(i=0i<8i++)
{
AD7707_SCLK=0
AD7707_DIN=WtrBit
AD7707_SCLK=1
WtrByte=WtrByte<<1
}
}
void AD_AINT1(void) //通道1初始化
{
WriteToReg_AD7707(0x20) /*激活通道 AIN1/LOCOM, 下一步 *** 作为写 Clock Register*/
WriteToReg_AD7707(0x18) /*启用 Master Clock, 2.4576MHz Clock, 设置 Output Rate 为 50Hz*/
WriteToReg_AD7707(0x10) /*激活通道 AIN1/LOCOM, 下一步 *** 作为写 Setup Register*/
WriteToReg_AD7707(0x44) /*Gain = 1, Unipolar 模式, Buffer 关闭, 清 FSYNC 并执行 Self Calibration*/
}
void AD_AINT2(void) //通道2初始化
{
WriteToReg_AD7707(0x21) //*激活通道 AIN2/LOCOM, 下一步 *** 作为写 Clock Register*/
WriteToReg_AD7707(0x18) /*启用 Master Clock, 2.4576MHz Clock, 设置 Output Rate 为 50Hz*/
WriteToReg_AD7707(0x11) /*激活通道 AIN2/LOCOM, 下一步 *** 作为写 Setup Register*/
WriteToReg_AD7707(0x44) /*Gain = 1, Unipolar 模式, Buffer 关闭, 清 FSYNC 并执行 Self Calibration*/
}
void AD_AINT3(void) //通道3初始化
{ WriteToReg_AD7707(0x23) /*激活通道 AIN3/HICOM, 下一步 *** 作为写 Clock Register*/
WriteToReg_AD7707(0x18) /*启用 Master Clock, 2.4576MHz Clock, 设置 Output Rate 为 50Hz*/
WriteToReg_AD7707(0x13) /*激活通道 AIN3/HICOM, 下一步 *** 作为写 Setup Register*/
WriteToReg_AD7707(0x44) /*Gain = 1, Unipolar 模式, Buffer 关闭, 清 FSYNC 并执行 Self Calibration*/
}
uint Read_AD7707(void) /*读取AD7707数据*/
{
uchar i
uint Data=0
while(AD7707_DRDY==1)
for(i=0i<16i++)
{
Data=Data<<1
AD7707_SCLK=0
Data=Data|AD7707_DOUT
AD7707_SCLK=1
}
return Data
}
供供参考:http://www.zhixinrui.com/forum.php?gid=1
DAC_WRTA是对D/A写数据的,DAC_clk是D/A的工作时钟,应该不能直接连接一起的。选择双通道模式,可以使用一个通道,但好像有点画蛇添足的感觉。
开发板不重要,重要的是这个开发板上用什么FPGA芯片?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)