This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS1256:ADS1256、读取

Guru**** 2510095 points
Other Parts Discussed in Thread: ADS1256

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1125345/ads1256-ads1256-reading

器件型号:ADS1256

大家好、

在我的项目中、我使用 Nucleo-STM32F446RE 和 STMCUBE IDE 来处理 ADS1256、为了连接这些库、我在 GitHub 链接 https://github.com/majialou/STM32F1-ADS1256-Data-Collect 中找到了库 、但我无法从 读取 DRDY 引脚时从该库获取任何输出、 因为我已经将 DRDY 引脚声明为外部中断、并且当我尝试初始化 ads1256时、它被吸入到 drdy 引脚环路中、比如它不会变为低电平、它始终处于高电平。 所以我进行了这样的连接  

MCU                         ADS1256

(PA5) SCLK      -->             SCLK

(PA6) MISO      -->             MISO

(PA7) MOSI      -->             MOSI

(Pb6) CS        -->             PA4.

(PA12) DRDY    -->             PA2.

(PA10)复位   -->            PA3.

5V             -->            5V

3.3V           -->            3.3V

GND           -->            GND  

(PA11) PDWN   -->             未连接到任何设备  

              -->             ANCOM --> AGND //用于单端//

 这是用于 ads1256初始化的代码

<code>

uint8_t ads1256_init(void)
{
	    uint8_t regs_buf[4];
	    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6, GPIO_PIN_RESET);
	    HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
	    for(;;){
	        HAL_GPIO_WritePin(GPIOA, REST_Pin|PDWN_Pin, GPIO_PIN_RESET);
	        HAL_Delay(1);
	        HAL_GPIO_WritePin(GPIOA, REST_Pin|PDWN_Pin, GPIO_PIN_SET);
	        HAL_Delay(1);
	        printf("hello sagar1\r\n");
	        printf("status1:%d\r\n",HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	        while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	        printf("hello sagar2\r\n");
	        ads1256_read_regs(0,regs_buf,sizeof(regs_buf));
	        printf("hello sagar3\r\n");
	        if( regs_buf[1]==0x01 && regs_buf[2]==0x20 && regs_buf[3]==0xF0 )
	            printf("break\r\n");
	        	break;
	        HAL_Delay(100);
	    }
	    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    printf("hello sagar4\r\n");
	    printf("status2:%d\r\n",HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    regs_buf[REG_STATUS]=0xf4;//STATUS REGISTER:Auto-Calibration Enabled,Analog Input Buffer Disabled
	    regs_buf[REG_ADCON]=CLKOUT_OFF+DETECT_OFF+ads125x_conf.gain;   //ADCON=00h
	    regs_buf[REG_DRATE]=ads125x_conf.sampling_rate;
	    ads1256_write_regs(REG_STATUS,regs_buf,sizeof(regs_buf));
	    printf("status3:%d\r\n",HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    while(!HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    printf("status4:%d\r\n",HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    printf("hello sagar5\r\n");
	    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    ads1256_read_regs(0,regs_buf,sizeof(regs_buf));
	    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    ads1256_channel_init();
	    ads1256_write_cmd(CMD_SYNC);
	    ads1256_write_cmd(CMD_WAKEUP);
	    printf("hello sagar6\r\n");
	    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    ads1256_write_cmd(CMD_SELFCAL); //self-calibration
	    while(!HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
	    printf("hello sagar7\r\n");
	    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

	    return 1;
}
<code>
 

我已经将我的 drdy 引脚连接到示波器、引脚始终处于高电平、因此我应该做什么来帮助我解决这个问题  

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、sagar m、

    通常不应将数字输入悬空、例如 SYNC/PWDN 引脚。 您不知道该引脚上的电压会浮动到什么、因此您无法确定 ADC 的状态。 如果您希望根据代码使用命令来控制同步、那么我会在 SYNC/PWDN 和 DVDD 之间放置一个上拉电阻器、以确保该引脚在加电时处于已知状态。

    如果 ADC 正确供电并在 CLKIN 引脚上提供了有效的时钟信号、则应能够切换 SYNC 引脚以启动转换、从而在 DRDY 引脚上产生脉冲。 更多信息、请参阅数据表第27页的"同步"部分。 这是一个您可以执行的简单测试、它将验证 ADC 是否至少工作正常。 如果您按照数据表的说明操作、但仍然在 DRDY 中未看到脉冲、则 ADC 未正确供电、时钟信号无效、或两者皆无效。

    此外、这些 printf()语句的执行可能需要很长时间、这可能会导致控制器在某些情况下错过 DRDY 中断。 您可以将这些值存储在内存/缓冲区中、然后在代码完成后打印它们。

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bryan、感谢您的回复、

    将 SYNC/PDWN 引脚连接到3.3V 就像这样  

    ADS1256  

    SYNC/PDWN  -> 3.3V

    MCU  

    SYNC/PWDN  -> 3.3V

    请确认这一点、因为在 ads1256中、我们在 P1也有 PDWN/SYNC 引脚、所以如此。

    另外一件事是在代码开始之前通过切换 SYNC/PDWN 引脚检查 ads12456是否正常工作、因为我已将声明为 SYNC/PDWN 的 MCU 引脚 PA11连接到3.3V、我希望在这之后也是正确的 更改 while 环路上的控件、这意味着 DRDY 不低。 我也在示波器中观察到、但我怀疑 SCLK 中仅在 STM32中选择了16MHz、但在 ads1256中、他们提到了7.68MHz、即使我也尝试设置8MHz、但也是如此 结果将相同。

     因此,如果我犯了任何错误,请告诉我。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、sagar m、

    在您发送的信号列表中、PWDN 显示"未连接任何内容"。 因此、我不确定如果该引脚未连接到任何设备、如何切换该引脚。 我也不清楚这意味着除了 SYNC/PWDN 引脚之外的任何其他引脚都未连接到任何引脚、因此是悬空的。

    ADS1256需要一个1/4系统时钟频率(CLKIN)的 SCLK 周期。 由于 ADS1256可支持的最大 CLKIN 频率为8MHz、因此 SCLK 必须<=2MHz。 如果您以大于此值的任何 SCLK 速度运行、ADC 将不起作用。

    请确保您已向 ADC 提供有效的 CLKIN 信号、并确保 SCLK 频率<= CLKIN/4。

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bryan、

    [~ userid="204916" url="μ C/support/data-switchers-group/data-switchers/f/data-switchers-forum/1125345/ads1256-ads1256-reading/4175290#4175290"]因此、我不确定如果此引脚未连接任何引脚、如何切换此引脚。 我也不清楚这意味着除了 SYNC/PWDN 引脚之外的任何其他引脚都未连接到任何引脚、因此是悬空的。[/报价]

    在您提出建议之前没有实际值、现在我已经像这样将其连接到3.3V

    MCU   

    SYNC/PDWN  -> 3.3V

    但在这里、我对 ADS1256 SYNC/PDWN 引脚是否为 P1有疑问、因此我的 MCU 配置的 SYNC/PDWN 引脚(PA11)连接到3.3V、因此在 ADS1256中、我们是否可以将该引脚悬空?  

    [引用 userid="204916" URL"~/support/data-switchers-group/data-switchers/f/data-switchers-forum/1125345/ads1256-ads1256-reading/4175290#4175290"]请确保已向 ADC 提供有效的 CLKIN 信号,并确保 <= CLKIN/引用频率。]

    在 STM32输出频率设置为8MHz 的情况下、我已通过环路测试验证 SPI 是否正常工作、即使我连接 ADS1256 且具有 Sort MISO 和 MOSI 引脚、并且我传输了一些数据并在此时接收到相同的数据、也能正常工作 请参阅我的 SCLK 勾选、但当我通过启动 ADS1256初始化时

    1.切换 RESET 和 PDWN 引脚  

    2.等待 DRDY 变为低电平

    在这里、我没有在逻辑分析仪中获取 SCLK 脉冲的高电平信号

    因此我在等待 DRDY 低电平脉冲时发现 SCLK 计时有问题 SCLK 为高电平,因此在 不将 DRDY 引脚置为低电平时无法发送任何命令。

    因此、任何解决该问题的建议都是如此。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、sagar m、

    我很困惑、如果您将 SYNC 引脚连接到3.3V、该引脚如何悬空? 您是否在 ADC 和 MCU 之间有电平转换器? 或者同步跟踪是否直接进入 MCU?

    我建议在 ADC 处为 DVDD 添加一个 SYNC/PWDN 上拉电阻器。

    SCLK 速度需要  <= CLKIN/4、因此请确保应用的 SCLK 信号不大于此值。 我不清楚您是否已解决此问题。

    此外、SCLK 应该空闲低电平、而不是高电平。 如果 SCLK 为高电平且未切换、则说明您的 SPI 外设未在 MCU 中正确配置。

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bryan、很抱歉迟到了回复、我已经尝试用200毫秒重置 RESET 和 PDWN 引脚、现在 DRDY 正在持续切换、我开始以这种方式从状态寄存器中读取芯片 ID  

    <code>
    uint8_t  ADS1256RREG(uint8_t reg_addr)
    {
    
    		uint8_t wrbuf1;
    		uint8_t wrbuf2;
    		uint8_t final;
    		wrbuf1 = ADS1256_CMD_RREG | reg_addr;
    		wrbuf2 = 0x00;
    		while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);
    		HAL_SPI_Transmit(&hspi2,&wrbuf1,1,10);
    		HAL_SPI_Transmit(&hspi2,&wrbuf2,1,10);
    		HAL_SPI_Receive(&hspi2,&final,1,10);
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);
    		printf("read_data1:0x%x\r\n",final);
    		return final;
    }
    
    
    
    //ID Verification//
    while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
    uint8_t ID = ADS1256RREG(ADS1256_STATUS);
    printf("ID:0x%x\r\n",ID);
    <code>
     

    因此、在读取数据后、我只有0x00、但值应为0x34-0x36 、如果移位4位右 ID 应为3、那么即使使用 Arduino、我也已经经历了许多代码、但结果仍然相同。

    谢谢你。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、sagar m、

    您能否发布显示这些命令期间数据事务的逻辑分析仪图? 这将有助于验证 ADC 的响应方式以及时序。

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bryan、

    感谢您的回复、现在芯片 ID 读取次数是3次、但有时是15次、然后我开始读取电位计模拟值、但值是0。

    这是代码和逻辑分析仪图像。

    <code>
    //  ads1256.c//
    #include "ads12.h"
    #include "main.h"
    uint32_t sum;
    uint8_t data[3];
    long ulResult;
    long double ldVolutage;
    SPI_HandleTypeDef hspi2;
    int scanMode=0;
    
    void ADS1256WREG(uint8_t regaddr,uint8_t databyte)
    {
    		uint8_t cmd;
    		uint8_t dummy=0x00;
    		while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
    		cmd = ADS1256_CMD_WREG | regaddr;
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);
    		HAL_SPI_Transmit(&hspi2, &cmd, 1, 10);
    		HAL_SPI_Transmit(&hspi2, &dummy, 1, 10);
    		HAL_SPI_Transmit(&hspi2, &databyte, 1, 10);
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);
    }
    
    uint8_t  ADS1256RREG(uint8_t reg_addr)
    {
    
    		uint8_t wrbuf[2];
    		uint8_t final;
    		wrbuf[0] = ADS1256_CMD_RREG | reg_addr;
    		wrbuf[1] = 0x00;
    		while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);
    		HAL_SPI_Transmit(&hspi2,wrbuf,2,1);
    		HAL_Delay(0.00625);
    		HAL_SPI_Receive(&hspi2,&final,1,1);
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);
    		return final;
    }
    
    void ConfigADC()
    {
    	uint8_t cmd2 = 0x53;
    	uint8_t cmd3 = 0x00;
    	uint8_t cmd4 = 0x63;
    	HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);
    	HAL_SPI_Transmit(&hspi2,&cmd2,1,1);
    	HAL_SPI_Transmit(&hspi2,&cmd3,1,1);
    	HAL_SPI_Transmit(&hspi2,&cmd4,1,1);
    	HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);
        HAL_Delay(1);
    
    }
    void ADS1256_Init(void)
    {
    	HAL_NVIC_DisableIRQ(EXTI4_IRQn);
    	HAL_GPIO_WritePin(GPIOA,REST_Pin,GPIO_PIN_RESET);
    	HAL_Delay(200);
    	HAL_GPIO_WritePin(GPIOA,REST_Pin,GPIO_PIN_SET);
    	HAL_Delay(200);
    	uint8_t ID = ADS1256RREG(0);
    	printf("ID:0x%x\r\n",ID);
    	printf("ID:%d\r\n",(ID >>4));
    	ConfigADC();
    	printf("Configuration updated\r\n");
    	HAL_NVIC_EnableIRQ(EXTI4_IRQn);
    
    }
    
    void set_single_channel(uint8_t channel)
    {
      ADS1256WREG(ADS1256_MUX,(channel<<4) | (1<<3));
    }
    void set_diff_channel(uint8_t channel)
    {
    	if(channel == 0)
    	{
    		ADS1256WREG(ADS1256_MUX,(0 << 4) | 1);
    	}
    	else if(channel == 1)
    	{
    		ADS1256WREG(ADS1256_MUX,(2 << 4) | 3);
    	}
    	else if(channel == 2)
    	{
    		ADS1256WREG(ADS1256_MUX,(4 << 4) | 5);
    	}
    	else if(channel == 3)
    	{
    		ADS1256WREG(ADS1256_MUX,(6 << 4) | 7);
    	}
    }
    long double ADS1256ReadData(uint8_t channel)
    {
    
      uint8_t cmd1;
      uint8_t cmd2;
      uint8_t cmd3;
    if(scanMode == 0)
    {
    
    	if (channel > 8)
    	{
    		return 0;
    	}
    	else
    	{
    		//set_single_channel(channel);
    		cmd1 = ADS1256_CMD_SYNC;
    		cmd2 = ADS1256_CMD_WAKEUP;
    		cmd3 = 0x01;
    		uint8_t d=0x00;
    
    
    //		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);
    //		HAL_SPI_Transmit(&hspi2, &cmd1, 1, 0.5);
    //		HAL_SPI_Transmit(&hspi2, &cmd2, 1, 0.5);
    //		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);
    
    		while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);
    		HAL_SPI_Transmit(&hspi2,&cmd3,1,0.5);
    		HAL_Delay(0.00683);
    		HAL_SPI_Transmit(&hspi2,&d,1,0.1);
    		HAL_SPI_Receive(&hspi2,&data[0],1,0.1);
    		HAL_SPI_Transmit(&hspi2,&d,1,0.1);
    		HAL_SPI_Receive(&hspi2,&data[1],1,0.1);
    		HAL_SPI_Transmit(&hspi2,&d,1,0.1);
    		HAL_SPI_Receive(&hspi2,&data[2],1,0.1);
    		HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);
    		sum = (data[0]<<16)|(data[1]<<8) | data[2];
    		if (sum & 0x800000)
    		{
    		    sum &= 0xF000000;
    		}
    
    	ldVolutage = (long double)sum*5.0/0x7FFFFF;
    	printf("single_end_voltage:%.3Lf\r\n",ldVolutage);
    	return ldVolutage;
    
    	}
    }
    else
    {
    	if(channel >=4)
    	{
    		return 0;
    	}
    	else
    	{
    		set_diff_channel(channel);
    		cmd1 = ADS1256_CMD_SYNC;
    		cmd2 = ADS1256_CMD_WAKEUP;
    		cmd3 = ADS1256_CMD_RDATA;
    		HAL_SPI_Transmit(&hspi2, &cmd1, 1, 10);
    		HAL_SPI_Transmit(&hspi2, &cmd2, 1, 100);
    		while(HAL_GPIO_ReadPin(DRDY_GPIO_Port,DRDY_Pin));
    		HAL_SPI_Transmit(&hspi2, &cmd3, 1, 10);
    		HAL_SPI_Receive(&hspi2, data, 3, 10);
    		sum = (data[0]<<16) & 0xff0000;
    		sum |=(data[1]<<8) &  0xff00;
    		sum |=data[2] & 0xff;
    		if (sum & 0x800000)
    		{
    			sum &= 0xF000000;
    		}
    	ldVolutage = (long double)sum*5.0/0x7FFFFF;
    	printf("diff_voltage:%.3Lf\r\n",ldVolutage);
    	return ldVolutage;
    
    	 }
     }
    }
    <code>
    
    //ads1256.h//
    <code>
    #include "main.h"
    #include "stdio.h"
    extern SPI_HandleTypeDef hspi2;
    
    
    #ifndef __ADS1256_H_
    #define __ADS1256_H_
    
    #define ADS1256_CMD_WAKEUP 0xFF
    #define ADS1256_CMD_RDATA  0x01
    #define ADS1256_CMD_RDATAC 0x03
    #define buffer_en 1
    //#define ADS1256_CMD_SDATAC 0x0F
    #define ADS1256_CMD_RREG 0x10
    #define ADS1256_CMD_WREG 0x50
    #define ADS1256_CMD_SELFCAL 0xf0
    #define ADS1256_CMD_SELFOCAL 0xf1
    #define ADS1256_CMD_SELFGCAL 0xf2
    #define ADS1256_CMD_SYSOCAL 0xf3
    #define ADS1256_CMD_SYSGCAL 0xf4
    #define ADS1256_CMD_SYNC   0xFC
    #define ADS1256_CMD_STANDBY 0xfd
    //#define ADS1256_CMD_REST 0xFE
    
    
    
    // define the ADS1256 register values
    #define ADS1256_STATUS 0x00
    #define ADS1256_MUX 0x01
    #define ADS1256_ADCON 0x02
    #define ADS1256_DRATE 0x03
    #define ADS1256_IO 0x04
    #define ADS1256_OFC0 0x05
    #define ADS1256_OFC1 0x06
    #define ADS1256_OFC2 0x07
    #define ADS1256_FSC0 0x08
    #define ADS1256_FSC1 0x09
    #define ADS1256_FSC2 0x0A
    
    // define multiplexer codes
    #define ADS1256_MUXP_AIN0 0x00
    #define ADS1256_MUXP_AIN1 0x10
    #define ADS1256_MUXP_AIN2 0x20
    #define ADS1256_MUXP_AIN3 0x30
    #define ADS1256_MUXP_AIN4 0x40
    #define ADS1256_MUXP_AIN5 0x50
    #define ADS1256_MUXP_AIN6 0x60
    #define ADS1256_MUXP_AIN7 0x70
    #define ADS1256_MUXP_AINCOM 0x80
    
    #define ADS1256_MUXN_AIN0 0x00
    #define ADS1256_MUXN_AIN1 0x01
    #define ADS1256_MUXN_AIN2 0x02
    #define ADS1256_MUXN_AIN3 0x03
    #define ADS1256_MUXN_AIN4 0x04
    #define ADS1256_MUXN_AIN5 0x05
    #define ADS1256_MUXN_AIN6 0x06
    #define ADS1256_MUXN_AIN7 0x07
    #define ADS1256_MUXN_AINCOM 0x08
    
    // define gain codes
    #define ADS1256_GAIN_1 0x00
    #define ADS1256_GAIN_2 0x01
    #define ADS1256_GAIN_4 0x02
    #define ADS1256_GAIN_8 0x03
    #define ADS1256_GAIN_16 0x04
    #define ADS1256_GAIN_32 0x05
    #define ADS1256_GAIN_64 0x06
    //#define ADS1256_GAIN_64 0x07
    
    // define drate codes
    #define ADS1256_DRATE_30000SPS 0xF0
    #define ADS1256_DRATE_15000SPS 0xE0
    #define ADS1256_DRATE_7500SPS 0xD0
    #define ADS1256_DRATE_3750SPS 0xC0
    #define ADS1256_DRATE_2000SPS 0xB0
    #define ADS1256_DRATE_1000SPS 0xA1
    #define ADS1256_DRATE_500SPS 0x92
    #define ADS1256_DRATE_100SPS 0x82
    #define ADS1256_DRATE_60SPS 0x72
    #define ADS1256_DRATE_50SPS 0x63
    #define ADS1256_DRATE_30SPS 0x53
    #define ADS1256_DRATE_25SPS 0x43
    #define ADS1256_DRATE_15SPS 0x33
    #define ADS1256_DRATE_10SPS 0x23
    #define ADS1256_DRATE_5SPS 0x13
    #define ADS1256_DRATE_2_5SPS 0x03
    
    long double ADS1256ReadData(uint8_t channel);
    void ADS1256_Init(void);
    
    #endif
    <code>
    
    //main.c//
    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * @file           : main.c
      * @brief          : Main program body
      ******************************************************************************
      * @attention
      *
      * Copyright (c) 2022 STMicroelectronics.
      * All rights reserved.
      *
      * This software is licensed under terms that can be found in the LICENSE file
      * in the root directory of this software component.
      * If no LICENSE file comes with this software, it is provided AS-IS.
      *
      ******************************************************************************
      */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "stdio.h"
    #include "string.h"
    #include "retarget.h"
    #include "ads12.h"
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    
    
    UART_HandleTypeDef huart5;
    UART_HandleTypeDef huart2;
    
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USART2_UART_Init(void);
    static void MX_SPI2_Init(void);
    static void MX_UART5_Init(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    static uint8_t is_adc_drdy;
    long double AD_value0;
    long double AD_value1;
    long double AD_value2;
    long double AD_value3;
    long double AD_value4;
    long double AD_value5;
    long double AD_value6;
    long double AD_value7;
    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART2_UART_Init();
      MX_SPI2_Init();
      MX_UART5_Init();
      RetargetInit(&huart5);
      ADS1256_Init();
      /* USER CODE BEGIN 2 */
    
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    	  if(is_adc_drdy==1)
    	  {
    	   AD_value0 = ADS1256ReadData(0);
    	  }
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      /** Configure the main internal regulator output voltage
      */
      __HAL_RCC_PWR_CLK_ENABLE();
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
    
      /** Initializes the RCC Oscillators according to the specified parameters
      * in the RCC_OscInitTypeDef structure.
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
      RCC_OscInitStruct.PLL.PLLM = 8;
      RCC_OscInitStruct.PLL.PLLN = 64;
      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
      RCC_OscInitStruct.PLL.PLLQ = 2;
      RCC_OscInitStruct.PLL.PLLR = 2;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
    
      /** Initializes the CPU, AHB and APB buses clocks
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV4;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /**
      * @brief SPI2 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_SPI2_Init(void)
    {
    
      /* USER CODE BEGIN SPI2_Init 0 */
    
      /* USER CODE END SPI2_Init 0 */
    
      /* USER CODE BEGIN SPI2_Init 1 */
    
      /* USER CODE END SPI2_Init 1 */
      /* SPI2 parameter configuration*/
      hspi2.Instance = SPI2;
      hspi2.Init.Mode = SPI_MODE_MASTER;
      hspi2.Init.Direction = SPI_DIRECTION_2LINES;
      hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
      hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
      hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
      hspi2.Init.NSS = SPI_NSS_SOFT;
      hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
      hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
      hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
      hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
      hspi2.Init.CRCPolynomial = 10;
      if (HAL_SPI_Init(&hspi2) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN SPI2_Init 2 */
    
      /* USER CODE END SPI2_Init 2 */
    
    }
    
    /**
      * @brief UART5 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_UART5_Init(void)
    {
    
      /* USER CODE BEGIN UART5_Init 0 */
    
      /* USER CODE END UART5_Init 0 */
    
      /* USER CODE BEGIN UART5_Init 1 */
    
      /* USER CODE END UART5_Init 1 */
      huart5.Instance = UART5;
      huart5.Init.BaudRate = 115200;
      huart5.Init.WordLength = UART_WORDLENGTH_8B;
      huart5.Init.StopBits = UART_STOPBITS_1;
      huart5.Init.Parity = UART_PARITY_NONE;
      huart5.Init.Mode = UART_MODE_TX_RX;
      huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart5.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart5) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN UART5_Init 2 */
    
      /* USER CODE END UART5_Init 2 */
    
    }
    
    /**
      * @brief USART2 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_USART2_UART_Init(void)
    {
    
      /* USER CODE BEGIN USART2_Init 0 */
    
      /* USER CODE END USART2_Init 0 */
    
      /* USER CODE BEGIN USART2_Init 1 */
    
      /* USER CODE END USART2_Init 1 */
      huart2.Instance = USART2;
      huart2.Init.BaudRate = 115200;
      huart2.Init.WordLength = UART_WORDLENGTH_8B;
      huart2.Init.StopBits = UART_STOPBITS_1;
      huart2.Init.Parity = UART_PARITY_NONE;
      huart2.Init.Mode = UART_MODE_TX_RX;
      huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart2.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart2) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN USART2_Init 2 */
    
      /* USER CODE END USART2_Init 2 */
    
    }
    
    /**
      * @brief GPIO Initialization Function
      * @param None
      * @retval None
      */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOH_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
      __HAL_RCC_GPIOD_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(REST_GPIO_Port, REST_Pin, GPIO_PIN_RESET);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
    
      /*Configure GPIO pin : B1_Pin */
      GPIO_InitStruct.Pin = B1_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin : DRDY_Pin */
      GPIO_InitStruct.Pin = DRDY_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(DRDY_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin : REST_Pin */
      GPIO_InitStruct.Pin = REST_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(REST_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin : CS_Pin */
      GPIO_InitStruct.Pin = CS_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(CS_GPIO_Port, &GPIO_InitStruct);
    
      /* EXTI interrupt init*/
      HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(EXTI4_IRQn);
    
    }
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
        if( GPIO_Pin == DRDY_Pin )
        {
            is_adc_drdy = 1;
        }
    }
    /* USER CODE BEGIN 4 */
    
    /* USER CODE END 4 */
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      __disable_irq();
      while (1)
      {
      }
      /* USER CODE END Error_Handler_Debug */
    }
    
    #ifdef  USE_FULL_ASSERT
    /**
      * @brief  Reports the name of the source file and the source line number
      *         where the assert_param error has occurred.
      * @param  file: pointer to the source file name
      * @param  line: assert_param error line source number
      * @retval None
      */
    void assert_failed(uint8_t *file, uint32_t line)
    {
      /* USER CODE BEGIN 6 */
      /* User can add his own implementation to report the file name and line number,
         ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    <code>
    
    
    

      逻辑分析仪图像

    我已经浏览过数据表、并为了读取时间为6.5微秒的芯片、我使用过相同的时间、但仍有一些时间为我提供了15、

    数据读取也为零。

    我 对延迟时间有很多疑问、因此请帮助解决此问题。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、sagar m、

    您尝试在逻辑分析仪图中发送什么命令? 该图像中大约有40个 SCLK 脉冲、但看起来您在 MOSI 上发送全0或全1。 这只是多个唤醒命令。

    SCLK 应在 ADS1256的下降沿触发、如数据表的"DIN 和 DOUT"部分所述。 Saleae 逻辑分析仪的正确设置如下所示。

    此外、您的 SCLK 速度似乎太慢。 您需要能够在下一个 DRDY 脉冲之前发送 RDATA 命令并时钟输出数据。 我只对 DRDY 脉冲之间的3-4个 SCLK 脉冲进行计数、因此您需要提高 SCLK 或降低 ADC 数据速率。 否则、您将获得损坏的数据。

    如果您想解决其中的一些问题并向我发送更多逻辑分析仪数据、您只需发送.Sal 文件、以便我可以查看整个通信、而不是发送屏幕截图。

    布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bryan、

    为了提高时钟速度、我降低了配置中的预分频器、现在每个周期的延迟降低到纳秒、但在整个传输/接收完成之前、我仍然不知道如何将 DRDY 设为低电平。?

     此外、我在 saleae 逻辑分析仪 CPOL =0和 CPHS =1中配置了 DRDY 信号作为使能信号、但数据测量错误、但如果我配置了 CPOL =0和 CPHS =0、则其测量 正确、那么问题出在哪里??

    我正在尝试获取.saleae 文件 ,但.saleae 文件没有选项,所以我可以发送每个传输屏幕截图吗??

    我的主要疑问是如何计算正确 传输/接收的延迟、如在 STM32中、我们有 HAL_SIP_transmit (&hspi1、write_data_buf、size (write_data_buf)、delay) 功能、因此对于传输、我们还需要提供延迟、并且我们需要保持 ADS1256中读/写的确切延迟、以便我们如何做到这一点?/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、sagar m、

    ADC 控制的是 DRDY 信号、而不是控制器。 当来自 ADC 的新数据准备就绪时、DRDY 会下降至低电平。 DRDY 引脚将以大约等于1/DR 的间隔进行脉冲。 因此、如果 DR = 30kSPS、则假定您持续转换、DRDY 脉冲间隔将为~33us。 因此、您需要确保 SCLK 速度足够快、以便能够在此间隔内时钟输出数据。 如果您要为 ADC 提供7.68MHz 系统时钟、我建议使用1.92MHz SCLK。 如果您希望以低于30kSPS 的速率进行采样、SCLK 可能小于1.92MHz

    [引用 userid="500152" URL"~/support/data-switchers-group/data-switchers/f/data-switchers-forum/1125345/ads1256-ads1256-readings/4180532#4180532"]感谢您的回复,现在芯片 ID 读取的次数是3次,但已开始读取模拟电位器值15次,但已开始读取模拟电位器值15次。]

    您在上一篇文章中说、您无法正确读取寄存器、这似乎是 Saleae 设置方式的问题。 但是、现在您能够使用 CPOL = 0和 CPHA = 0读取寄存器并正确获取数据了吗? 我对实际问题是什么感到困惑

    [引用 userid="500152" URL"~/support/data-translators-group/data-translators/f/data-translators-forum/1125345/ads1256-ads1256-reading/4182296#4182296"]我正在尝试获取.saleae 文件 ,但没有.sale 文件选项,因此我可以发送每个文件。[?]

    您应该能够保存一个捕获、如下所示

    [引用 userid="500152" URL"~/support/data-translers-group/data-translers/f/data-translers-forum/1125345/ads1256-ads1256-reading/4182296#4182296]\n 我的主要疑问是如何计算正确 传输/接收的延迟、如 STM32_buf_transmit、hal_delay (sip_the_transmit)、 功能、因此对于传输、我们还需要提供延迟、并且我们需要在 ADS1256中保持准确的读取/写入延迟、以便我们如何做到这一点。?/

    我不确定这个问题是什么? 您是否需要有关设置控制器延迟的帮助? 如果是、这将是 ST 的一个问题。 与 ADS1256正确通信所需的延迟显示在 ADC 数据表的第6页和第7页上。 具体而言、确保尊重命令(T11)和 DIN 到 DOUT (T6)之间的延迟。 同样、您必须在固件中对这些延迟进行编程、如果您需要有关编写固件的帮助、则需要联系 MCU 制造商。

    布莱恩