搜索
bottom↓
回复: 17

AD7190读出数据始终为0

[复制链接]

出0入0汤圆

发表于 2021-6-5 18:05:44 | 显示全部楼层 |阅读模式
如题,采用软件模拟SPI接口,AVDD提供参考电压。读取配置寄存器、模式寄存器值都是准确的,但读取数据寄存器值始终为0。图片中蓝色是SCK波形,黄色是DOUT波形,DOUT波形明显有问题。相关代码如下:
// 配置AD7190
void AD7190_Config(void)
{
                unsigned        char        buf[4] = {0,0,0,0};
                buf[0] = 0x10;
                WriteToAD7190(1,buf);                  //write communication register 0x10 to control the progress to write configuration register   

                buf[2] = 0x00;
                buf[1] = 0x01;
                buf[0] = 0x0F;
                WriteToAD7190(3,buf);                //write configuration register,unipolar operation,gain=128,channel:AIN1 to AIN2

                buf[0] = 0x08;
                WriteToAD7190(1,buf);                //write communication register 0x08 to control the progress to write mode register

                buf[2] = 0x08;
                buf[1] = 0x03;
                buf[0] = 0xFF;
                WriteToAD7190(3,buf);                //write mode register,internal 4.92MHz clock,output data rate=4.7Hz
}

// 读取数据寄存器
if(GPIO_ReadInputDataBit(WEIGHT_MISO_GPIO_Port, WEIGHT_MISO_Pin) == 0)
{                               
                buf3[0] = 0x58;
                WriteToAD7190(1, buf3);                //write communication register 0x58 to control the progress to read data register
                ReadFromAD7190(3, buf3);                //read data register
                number3 = (buf3[2] << 16) + (buf3[1] << 8) + buf3[0];  
                 printf("data register:          0x%06x\r\n", number3);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2021-6-5 18:09:34 | 显示全部楼层
读取配置寄存器,波形正常,蓝色是SCK波形,黄色是DOUT波形。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2021-6-5 22:17:27 来自手机 | 显示全部楼层
方式对吗?

出0入50汤圆

发表于 2021-6-8 00:09:41 | 显示全部楼层
以前用过AD7190,现在都忘得差不多了,这是之前的驱动文件,写的烂望见谅,希望对你有帮助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2021-6-8 08:30:08 | 显示全部楼层
前几天刚设计了一块有AD7190的板子,只不过代码不是我写。

出0入0汤圆

发表于 2021-6-8 20:35:07 | 显示全部楼层
做称重的应用吗?

出0入1209汤圆

发表于 2021-6-8 22:08:07 | 显示全部楼层
这个芯片好像时序有个变态的地方,当时我记得是用了额外的中断IO接到了MISO上才搞定的,你仔细研究下手册上的时序

出0入1209汤圆

发表于 2021-6-8 22:28:48 | 显示全部楼层
配置寄存器的4个字节不应该连续写入么?我看你好像是分成两次了

出3670入191汤圆

发表于 2023-11-24 16:43:14 | 显示全部楼层
kitten 发表于 2021-6-8 22:08
这个芯片好像时序有个变态的地方,当时我记得是用了额外的中断IO接到了MISO上才搞定的,你仔细研究下手册上 ...
(引用自7楼)

我遇到了和楼主完全一样的问题。

你说的变态地方是不是指AD7190的MISO引脚除了用于SPI输出数据,还用于指示转换完成状态,当它完成一个转换后,该引脚电平会由高变低,在MCU中捕获该中断,然后通过SPI来获取数据?



如果你说的是这个意思,那我感觉我遇到的还不是这个问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入300汤圆

发表于 2023-11-24 17:13:23 | 显示全部楼层
我以前是模拟spi写的,感觉配置了好半天,好多寄存器要配置

出0入1209汤圆

发表于 2023-11-24 23:29:56 | 显示全部楼层
Rabbitoose 发表于 2023-11-24 16:43
我遇到了和楼主完全一样的问题。

你说的变态地方是不是指AD7190的MISO引脚除了用于SPI输出数据,还用于 ...
(引用自9楼)

是这样的,除了这里外,别的没遇到问题。

出0入1209汤圆

发表于 2023-11-24 23:35:21 | 显示全部楼层
/***************************************************************************//**
*   @file   AD7190.c
*   @brief  Implementation of AD7190 Driver.
*   @author none
*******************************************************************************/

/******************************************************************************/
/* Include Files                                                              */
/******************************************************************************/
#include "AD7190.h"                // AD7190 definitions.

//extern unsigned        char        Data_Buff[];
unsigned        char        Data_Buff[5] = {0,0,0,0,0};

/***************************************************************************//**
* @brief Resets the device.
*
* @return none.
*******************************************************************************/
void AD7190_Reset(void)
{
    unsigned char registerWord[5]={0xFF,0xFF,0xFF,0xFF,0xFF};   
                AD7190_Write(5,registerWord);                        
        //        HAL_Delay(10);                        //等待复位完成
}
/***************************************************************************//**

*******************************************************************************/
void SPI_Init(void)
        {
                MX_SPI2_Init();
        }

/*******************************************************************************/


void AD7190_Write(unsigned char count, unsigned char *Data_Buff)
        {       
                HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);
                HAL_SPI_Transmit(&hspi2,Data_Buff,count,500);
                HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_SET);
        }
/*******************************************************************************/
void AD7190_Read(unsigned char count, unsigned char *Data_Buff)
{
                HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);
                HAL_SPI_Receive (&hspi2,Data_Buff,count,500);               
                HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_SET);
}
/*******************************************************************************/
void AD7190_Init(void)
        {                       
                Data_Buff[0] = 0x10;                        //配置寄存器         
                Data_Buff[1] = 0x80;                        //斩波使能
                Data_Buff[2] = 0x03;                        //使能2个差分通道
                Data_Buff[3] = 0x10;                        //启用输入缓冲/双极性工作模式/增益=1
                AD7190_Write(4,Data_Buff);               
   
                Data_Buff[0] = 0x08;                        //模式寄存器        
                Data_Buff[1] = 0x78;                        //省电转换模式/使能同时传输状态寄存器/内部时钟
                Data_Buff[2] = 0x23;                        //使能SIN4滤波器/使能奇偶校验/
                Data_Buff[3] = 0xFF;                        //输出速率1023
                AD7190_Write(4,Data_Buff);               

        }
void AD7190_Xway_ReadCongfig(void)
        {       
                   
                Data_Buff[0] = 0x10;                        //配置寄存器         
                Data_Buff[1] = 0x80;                        //斩波使能
                Data_Buff[2] = 0x01;                        //使能X差分通道
                Data_Buff[3] = 0x10;                        //启用输入缓冲/双极性工作模式/增益=1
                AD7190_Write(4,Data_Buff);               
   
                Data_Buff[0] = 0x08;                        //模式寄存器        
                Data_Buff[1] = 0x38;                        //单次转换模式/使能同时传输状态寄存器/内部时钟
                Data_Buff[2] = 0x23;                        //使能SIN4滤波器/使能奇偶校验/
                Data_Buff[3] = 0xFF;                        //输出速率1023
                AD7190_Write(4,Data_Buff);       
    HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);      
        }
void AD7190_Yway_ReadCongfig(void)
        {       
    Data_Buff[0] = 0x10;                        //配置寄存器         
                Data_Buff[1] = 0x80;                        //斩波使能
                Data_Buff[2] = 0x02;                        //使能Y差分通道
                Data_Buff[3] = 0x10;                        //启用输入缓冲/双极性工作模式/增益=1
                AD7190_Write(4,Data_Buff);               
   
                Data_Buff[0] = 0x08;                        //模式寄存器        
                Data_Buff[1] = 0x38;                        //单次转换模式/使能同时传输状态寄存器/内部时钟
                Data_Buff[2] = 0x23;                        //使能SIN4滤波器/使能奇偶校验/
                Data_Buff[3] = 0xFF;                        //输出速率1023
                AD7190_Write(4,Data_Buff);               
    HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);  
        }
void AD7190_XYway_ReadCongfig(void)
        {       
    Data_Buff[0] = 0x10;                        //配置寄存器         
                Data_Buff[1] = 0x80;                        //斩波使能
                Data_Buff[2] = 0x03;                        //使能X/Y差分通道
                Data_Buff[3] = 0x10;                        //启用输入缓冲/双极性工作模式/增益=1
                AD7190_Write(4,Data_Buff);               
   
                Data_Buff[0] = 0x08;                        //模式寄存器        
                Data_Buff[1] = 0x38;                        //单次转换模式/使能同时传输状态寄存器/内部时钟
                Data_Buff[2] = 0x23;                        //使能SIN4滤波器/使能奇偶校验/
                Data_Buff[3] = 0xFF;                        //输出速率1023
                AD7190_Write(4,Data_Buff);       
    HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);   
        }
void AD7190_XYway_series_ReadCongfig(void)
        {       
    Data_Buff[0] = 0x10;                        //配置寄存器         
                Data_Buff[1] = 0x80;                        //斩波使能
                Data_Buff[2] = 0x03;                        //使能X/Y差分通道
                Data_Buff[3] = 0x10;                        //启用输入缓冲/双极性工作模式/增益=1
                AD7190_Write(4,Data_Buff);               
   
                Data_Buff[0] = 0x08;                        //模式寄存器        
                Data_Buff[1] = 0x18;                        //连续转换模式/使能同时传输状态寄存器/内部时钟
                Data_Buff[2] = 0x23;                        //使能SIN4滤波器/使能奇偶校验/
                Data_Buff[3] = 0xFF;                        //输出速率1023
                AD7190_Write(4,Data_Buff);               
    HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);  
        }
void AD7190_Read_data(void)
        {            
    Data_Buff[0] = 0x58;          //写入0X58表示将要读取数据寄存器+状态信息总计32bit
    AD7190_Write(1,Data_Buff);               
    AD7190_Read(4,Data_Buff);                  //读取数据寄存器+状态信息总计32bit          
        }

出0入1209汤圆

发表于 2023-11-24 23:40:35 | 显示全部楼层
        AD7190_Reset();               
        HAL_Delay(5);
        AD7190_Init();        //AD7910初始化      
        HAL_Delay(500);
        AD7190_XYway_series_ReadCongfig();
        HAL_Delay(200);
        HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);   


if( AD_RDY_OK==1)               //AD数据有效
          {

            AD_RDY_OK = 0;
            HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);  //禁用RDY中断         
            AD7190_Read_data();
            Data_handle();            
            HAL_GPIO_WritePin(AD_CS_GPIO_Port,AD_CS_Pin,GPIO_PIN_RESET);   
            HAL_Delay(10);
            HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);    //使能AD_RDY中断  
          }
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
楼上是完成的AD7190.c文件,然后主程序里初始化ADC,使能中断,中断里将AD_RDY_OK置位表示数据有效。然后主循环处理数据。

出3670入191汤圆

发表于 2023-11-25 00:05:47 | 显示全部楼层
kitten 发表于 2023-11-24 23:40
AD7190_Reset();               
        HAL_Delay(5);
        AD7190_Init();        //AD7910初始化      
(引用自13楼)

感谢分享,十分感谢!

问一个细节问题:
既然MISO已经作为SPI的一个信号线,也就是这个引脚的GPIO模式已经被初始化为“alternate function push pull”,那当需要接受中断的时候是不是要重新初始化它为外部中断模式?简而言之就是要不要把这个引脚来回切换配置?

出0入1209汤圆

发表于 2023-11-25 01:07:03 | 显示全部楼层
Rabbitoose 发表于 2023-11-25 00:05
感谢分享,十分感谢!

问一个细节问题:
(引用自14楼)

理论上你说的这样是可以的,我嫌来回切换麻烦没有这样用。硬件上把另外一个IO连接到MISO上了,然后用这个IO的中断来读取数据。

出3670入191汤圆

发表于 2023-11-25 16:07:31 | 显示全部楼层
kitten 发表于 2023-11-25 01:07
理论上你说的这样是可以的,我嫌来回切换麻烦没有这样用。硬件上把另外一个IO连接到MISO上了,然后用这个 ...
(引用自15楼)

我用了你说的方法。

不过我读不出来的最根本问题是SYNC信号没有给高电平,所以导致数字滤波器和模拟调制器一直处于复位状态,所以导致它不转换。给高电平就好了。

出0入0汤圆

发表于 2023-11-27 17:39:05 | 显示全部楼层
kitten 发表于 2023-11-25 01:07
理论上你说的这样是可以的,我嫌来回切换麻烦没有这样用。硬件上把另外一个IO连接到MISO上了,然后用这个 ...
(引用自15楼)

如果这样的话,数据输出也会有电平的高低变化,另外一个GPIO岂不是要频繁进入中断程序?这个如何处理才得当?

出0入42汤圆

发表于 2023-11-27 18:16:03 | 显示全部楼层
TINXPST 发表于 2023-11-27 17:39
如果这样的话,数据输出也会有电平的高低变化,另外一个GPIO岂不是要频繁进入中断程序?这个如何处理才得 ...
(引用自17楼)

可以启动前关闭那个中断, 读取结束再打开.  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 14:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表