AD7190读出数据始终为0
如题,采用软件模拟SPI接口,AVDD提供参考电压。读取配置寄存器、模式寄存器值都是准确的,但读取数据寄存器值始终为0。图片中蓝色是SCK波形,黄色是DOUT波形,DOUT波形明显有问题。相关代码如下:// 配置AD7190
void AD7190_Config(void)
{
unsigned char buf = {0,0,0,0};
buf = 0x10;
WriteToAD7190(1,buf); //write communication register 0x10 to control the progress to write configuration register
buf = 0x00;
buf = 0x01;
buf = 0x0F;
WriteToAD7190(3,buf); //write configuration register,unipolar operation,gain=128,channel:AIN1 to AIN2
buf = 0x08;
WriteToAD7190(1,buf); //write communication register 0x08 to control the progress to write mode register
buf = 0x08;
buf = 0x03;
buf = 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 = 0x58;
WriteToAD7190(1, buf3); //write communication register 0x58 to control the progress to read data register
ReadFromAD7190(3, buf3); //read data register
number3 = (buf3 << 16) + (buf3 << 8) + buf3;
printf("data register: 0x%06x\r\n", number3);
} 读取配置寄存器,波形正常,蓝色是SCK波形,黄色是DOUT波形。 方式对吗? 以前用过AD7190,现在都忘得差不多了,这是之前的驱动文件,写的烂望见谅,希望对你有帮助 前几天刚设计了一块有AD7190的板子,只不过代码不是我写。 做称重的应用吗? 这个芯片好像时序有个变态的地方,当时我记得是用了额外的中断IO接到了MISO上才搞定的,你仔细研究下手册上的时序 配置寄存器的4个字节不应该连续写入么?我看你好像是分成两次了 kitten 发表于 2021-6-8 22:08
这个芯片好像时序有个变态的地方,当时我记得是用了额外的中断IO接到了MISO上才搞定的,你仔细研究下手册上 ...
(引用自7楼)
我遇到了和楼主完全一样的问题。
你说的变态地方是不是指AD7190的MISO引脚除了用于SPI输出数据,还用于指示转换完成状态,当它完成一个转换后,该引脚电平会由高变低,在MCU中捕获该中断,然后通过SPI来获取数据?
如果你说的是这个意思,那我感觉我遇到的还不是这个问题。{:sweat:} 我以前是模拟spi写的,感觉配置了好半天,好多寄存器要配置 Rabbitoose 发表于 2023-11-24 16:43
我遇到了和楼主完全一样的问题。
你说的变态地方是不是指AD7190的MISO引脚除了用于SPI输出数据,还用于 ...
(引用自9楼)
是这样的,除了这里外,别的没遇到问题。 /***************************************************************************//**
* @file AD7190.c
* @briefImplementation of AD7190 Driver.
* @author none
*******************************************************************************/
/******************************************************************************/
/* Include Files */
/******************************************************************************/
#include "AD7190.h" // AD7190 definitions.
//extern unsigned char Data_Buff[];
unsigned char Data_Buff = {0,0,0,0,0};
/***************************************************************************//**
* @brief Resets the device.
*
* @return none.
*******************************************************************************/
void AD7190_Reset(void)
{
unsigned char registerWord={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 = 0x10; //配置寄存器
Data_Buff = 0x80; //斩波使能
Data_Buff = 0x03; //使能2个差分通道
Data_Buff = 0x10; //启用输入缓冲/双极性工作模式/增益=1
AD7190_Write(4,Data_Buff);
Data_Buff = 0x08; //模式寄存器
Data_Buff = 0x78; //省电转换模式/使能同时传输状态寄存器/内部时钟
Data_Buff = 0x23; //使能SIN4滤波器/使能奇偶校验/
Data_Buff = 0xFF; //输出速率1023
AD7190_Write(4,Data_Buff);
}
void AD7190_Xway_ReadCongfig(void)
{
Data_Buff = 0x10; //配置寄存器
Data_Buff = 0x80; //斩波使能
Data_Buff = 0x01; //使能X差分通道
Data_Buff = 0x10; //启用输入缓冲/双极性工作模式/增益=1
AD7190_Write(4,Data_Buff);
Data_Buff = 0x08; //模式寄存器
Data_Buff = 0x38; //单次转换模式/使能同时传输状态寄存器/内部时钟
Data_Buff = 0x23; //使能SIN4滤波器/使能奇偶校验/
Data_Buff = 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 = 0x10; //配置寄存器
Data_Buff = 0x80; //斩波使能
Data_Buff = 0x02; //使能Y差分通道
Data_Buff = 0x10; //启用输入缓冲/双极性工作模式/增益=1
AD7190_Write(4,Data_Buff);
Data_Buff = 0x08; //模式寄存器
Data_Buff = 0x38; //单次转换模式/使能同时传输状态寄存器/内部时钟
Data_Buff = 0x23; //使能SIN4滤波器/使能奇偶校验/
Data_Buff = 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 = 0x10; //配置寄存器
Data_Buff = 0x80; //斩波使能
Data_Buff = 0x03; //使能X/Y差分通道
Data_Buff = 0x10; //启用输入缓冲/双极性工作模式/增益=1
AD7190_Write(4,Data_Buff);
Data_Buff = 0x08; //模式寄存器
Data_Buff = 0x38; //单次转换模式/使能同时传输状态寄存器/内部时钟
Data_Buff = 0x23; //使能SIN4滤波器/使能奇偶校验/
Data_Buff = 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 = 0x10; //配置寄存器
Data_Buff = 0x80; //斩波使能
Data_Buff = 0x03; //使能X/Y差分通道
Data_Buff = 0x10; //启用输入缓冲/双极性工作模式/增益=1
AD7190_Write(4,Data_Buff);
Data_Buff = 0x08; //模式寄存器
Data_Buff = 0x18; //连续转换模式/使能同时传输状态寄存器/内部时钟
Data_Buff = 0x23; //使能SIN4滤波器/使能奇偶校验/
Data_Buff = 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 = 0x58; //写入0X58表示将要读取数据寄存器+状态信息总计32bit
AD7190_Write(1,Data_Buff);
AD7190_Read(4,Data_Buff); //读取数据寄存器+状态信息总计32bit
}
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置位表示数据有效。然后主循环处理数据。 kitten 发表于 2023-11-24 23:40
AD7190_Reset();
HAL_Delay(5);
AD7190_Init(); //AD7910初始化
(引用自13楼)
感谢分享,十分感谢!
问一个细节问题:
既然MISO已经作为SPI的一个信号线,也就是这个引脚的GPIO模式已经被初始化为“alternate function push pull”,那当需要接受中断的时候是不是要重新初始化它为外部中断模式?简而言之就是要不要把这个引脚来回切换配置? Rabbitoose 发表于 2023-11-25 00:05
感谢分享,十分感谢!
问一个细节问题:
(引用自14楼)
理论上你说的这样是可以的,我嫌来回切换麻烦没有这样用。硬件上把另外一个IO连接到MISO上了,然后用这个IO的中断来读取数据。 kitten 发表于 2023-11-25 01:07
理论上你说的这样是可以的,我嫌来回切换麻烦没有这样用。硬件上把另外一个IO连接到MISO上了,然后用这个 ...
(引用自15楼)
我用了你说的方法。
不过我读不出来的最根本问题是SYNC信号没有给高电平,所以导致数字滤波器和模拟调制器一直处于复位状态,所以导致它不转换。给高电平就好了。
kitten 发表于 2023-11-25 01:07
理论上你说的这样是可以的,我嫌来回切换麻烦没有这样用。硬件上把另外一个IO连接到MISO上了,然后用这个 ...
(引用自15楼)
如果这样的话,数据输出也会有电平的高低变化,另外一个GPIO岂不是要频繁进入中断程序?这个如何处理才得当? TINXPST 发表于 2023-11-27 17:39
如果这样的话,数据输出也会有电平的高低变化,另外一个GPIO岂不是要频繁进入中断程序?这个如何处理才得 ...
(引用自17楼)
可以启动前关闭那个中断, 读取结束再打开.
页:
[1]