ADI 技术
直播中

王玉洁

7年用户 204经验值
私信 关注
[问答]

AD7779读数据失败

您好,

遇到一个AD7779数据采集的问题,请教下

1、使用平台:MSP430F5483a + AD7779
2、控制接口MSP430 IO口模拟SPI接口,控制AD7779,单片机时钟频率为1MHz
3、目前已经成功读写AD7779寄存器

4、AD7779寄存器配置参数,

void AD7779_Setup(void)
{
uint i = 0;

AD7779_SPI_Init();

AD7779_Reset();

Delay_ms(200);

//将SPI接口配置成读写AD7779内部寄存器,默认就是读写寄存器
AD7779_Register_Write(0x13, 0x80);

//仅使能ch0通道,禁止其他通道,先测试一个通道是否能够正常工作
AD7779_Register_Write(0x08, 0xFE);

//设置电源模式,默认是低速模式
AD7779_Register_Write(0x11, 0x24);

//设置参考电压类型,Internal Reference
AD7779_Register_Write(0x15, 0x40);

//默认数据格式DOUT_HEADER_FORMAT,CRC header使能
AD7779_Register_Write(0x14, 0x20);

//设置采样率MCLK=4096KHz  MOD_MCLK=MCLK/8=512KHz 采样率=1KHz,那么SRC_N=MOD_MCLK/采样率=512/1=512,没有小数所以SRC_IF=0
AD7779_Register_Write(0x60, 0x02); //SRC_N_MSB
AD7779_Register_Write(0x61, 0x00); //SRC_N_LSB
AD7779_Register_Write(0x62, 0x00); //SRC_IF_MSB
AD7779_Register_Write(0x63, 0x00); //SRC_IF_LSB

//SRC_UPDATE,更新参数
AD7779_Register_Write(0x64, 0x01);

//读取寄存器的数值,看是否设置成功
for(i=0; i<0x65; i++)
{
data = AD7779_Register_Read(i);
}

//将SPI接口配置成读取ADC的数据,GENERAL_USER_CONFIG_3.bit4 = SPI_SLAVE_MODE_EN,在配置AD7779之后将SPI接口设置成读取ADC数据的工作模式
AD7779_Register_Write(0x13, 0x90);
}

5、失败---读取AD7779 转换结果失败

void AD7779_Read_Data(void)
{
uchar i = 0;

//总共八个通道,每个通道32bit数据=8bit CRC头 + 24bit转换数据
    for(i=0; i<8; i++)
    {
//将片选信号拉低
        AD7779_CS_LO;
        Delay_us(AD7779_DELAY);

//读取32bit数据
    adcvalue = AD7779_SPI_RdByte(32);

//从CRC头中获取AD通道编号
    ch = (adcvalue >> 28) & 0x07;


//将片选信号拉高

        AD7779_CS_HI;
        Delay_us(AD7779_DELAY);
    }
}

6、使用CCS测试结果,通道编号每次都在变化


7、读取AD7779数据的时间,在/RDY管脚出现下降沿中断时读取数据

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
P2IFG &= ~BIT0;                          // P2.0 IFG cleared

//在/RDY管脚的下降沿中断程序中读取数据   
AD7779_Read_Data();
}

8、下图是技术手册中关于ADC转换数据格式的说明






9、问题:
1>虽然可以成功读写AD7779寄存器,但是不确定是否配置正确,目前就像测试下ch0能否工作
2>在配置好寄存器之后,SPI是否成功进入读取ADC数据模式
3>在通过SPI读取数据,在整个读取的过程中已经将MOSI管脚拉低,避免超过64个MCLK高电平,造成SPI接口复位
4>不知为什么分析CRC头时,通道编号总是没有规律的变化
5>难道时读取数据的时间不对,不能再/RDY的下降沿读取
6>难道不是每次都读取32bit数据吗
7>难道不是依次读取8通道的数据,只有没有禁止的通道才有非零数据吗
8>总而言之,对何时读取数据,怎么读取数据,读取多少数据还不太清楚,也没有找到相应的参考文档和程序
9>/START管脚怎么处理呢

10、会不会还有硬件问题


附件是程序,请参考


这个问题已经困扰我两周时间了,实在是没有招了,希望能给与帮助

谢谢

贾文全

189-1022-6857



jiawq

回帖(6)

丁浩

2019-1-9 11:28:01
1. 方便提供原理图截图看一下吗?
2. /START管脚不用时,要拉到搞电平(手册有笔误)。并把SYCIN和SYCOUT短接。
3. 可以提供示波器抓到的/DRDY, /CS, SCLK, SDO的波形吗?像Figure 3. SPI Control Interface Timing Diagram。
举报

王玉洁

2019-1-9 11:47:52
引用: jdjfuwegs 发表于 2019-1-9 11:11
1. 方便提供原理图截图看一下吗?
2. /START管脚不用时,要拉到搞电平(手册有笔误)。并把SYCIN和SYCOUT短接。
3. 可以提供示波器抓到的/DRDY, /CS, SCLK, SDO的波形吗?像Figure 3. SPI Control Interface Timing Diagram。

StevenX,
          您好:
 
经过将SPI的时钟频率从500KHZ,提升到了2MHZ之后,可以正常读取8个通道的数据了;就是因为SPI时钟频率不够造成的数据读取不正确的原因。
但是,还遇到一个问题,当仅使能01通道时,连续读取8个通道数据时,有时候其他通道还有数据,调试结果如下图:

错误时:


1、使用中断方式,仅在RDY管脚下降沿触发中断,在中断程序中连续读取8个通道数据,每个通道读取4个字节数据
    for(i=0; i<8; i++)
    {
        AD7779_CS_LO;
        Delay_us(0);
 
        adcvalue = AD7779_SPI_RdByte(32);
        ch = (adcvalue >> 28) & 0x07;
 
        AD7779_CS_HI;
        Delay_us(0);
    }
 
2、AD7779的配置如下:
/********************************************************************
* 函数名称:BSL_AD7779_Init
* 函数功能:配置AD7779
* 函数说明:
* 调用函数:无
* 全局变量:无
* 入口参数:Uint8 chnum : 使能通道,每一位对应一个通道,1=使能,0=禁止
* 出口参数:
********************************************************************/
Int16 BSL_AD7779_Init(Uint8 chnum)
{
    CSL_Status status;
    Int16 i = 0;
 
  AD7779_Reset();
 
  //将SPI接口配置成读写AD7779内部寄存器,默认就是读写寄存器
  status = AD7779_Register_Write(0x13, 0x40);
 
 
  //使能ch0通道,禁止其他通道
// AD7779_Register_Write(0x08, 0xFE);
  chnum = chnum ^ 0xFF;
  status = AD7779_Register_Write(0x08, chnum);
 
 
  //设置电源模式,默认是低速模式,使能内部参考电压
  status = AD7779_Register_Write(0x11, 0x34);
 
 
  //设置参考电压类型,选择内部参考电压
  status = AD7779_Register_Write(0x15, 0x40);
 
 
  //默认数据格式DOUT_HEADER_FORMAT,CRC header使能
  status = AD7779_Register_Write(0x14, 0x20);
 
 
  //设置采样率MCLK=4096KHz  MOD_MCLK=MCLK/8=512KHz 采样率=1KHz,那么SRC_N=MOD_MCLK/采样率=512/1=512,没有小数所以SRC_IF=0
  status = AD7779_Register_Write(0x60, 0x02); //SRC_N_MSB
  status = AD7779_Register_Write(0x61, 0x00); //SRC_N_LSB
  status = AD7779_Register_Write(0x62, 0x00); //SRC_IF_MSB
  status = AD7779_Register_Write(0x63, 0x00); //SRC_IF_LSB
 
  //SRC_UPDATE,更新参数
  status = AD7779_Register_Write(0x64, 0x01);
 
  for(i=0; i<0x65; i++)
  {
  regdata = AD7779_Register_Read(i);
  }
 
  //将SPI接口配置成读取ADC的数据,GENERAL_USER_CONFIG_3.bit4 = SPI_SLAVE_MODE_EN,
  status = AD7779_Register_Write(0x13, 0x90);
 
  return status;
}
 
3、还不太明白RDY管脚的具体作用,
     1、所有通道都转换完毕才输出RDY脉冲,还是周期输出?
     2、假设5个通道同时采集怎么同步?
     3、上面图片那种现象是为什么呢?
 
谢谢
举报

王玉洁

2019-1-9 11:55:15
引用: 60user164 发表于 2019-1-9 11:31
StevenX,
          您好:
 

并且 尝试了将SPI时钟频率提高到了10MHz 仍然有这种现象 上面后两张图片明显后几个通道数据读取出错了 不知道为什么
请给些建议,是不是AD7779配置的问题
举报

孙秀英

2019-1-9 12:13:04
这就是经验啊,我们可以借鉴。
举报

更多回帖

×
20
完善资料,
赚取积分