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.

[参考译文] ADS1235EVM:我无法让 ads1235 连接到我的 ra4m1evm

Guru**** 2901700 points

Other Parts Discussed in Thread: ADS1235EVM

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

https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-forum/1645204/ads1235evm-i-am-having-trouble-getting-the-ads1235-to-connect-to-my-ra4m1evm

器件型号: ADS1235EVM

 image.png    

#include "hal_data.h"
#include <stdint.h>
#include <stdbool.h>

/* Pins from your FSP config */
#define START_PIN   BSP_IO_PORT_00_PIN_00   // P000 -> START
#define PWDN_PIN    BSP_IO_PORT_00_PIN_01   // P001 -> PWDN
#define DRDY_PIN    BSP_IO_PORT_03_PIN_05   // P305 -> DRDY
#define RESET_PIN   BSP_IO_PORT_04_PIN_04   // P404 -> RESET
#define CS_PIN      BSP_IO_PORT_04_PIN_05   // P405 -> CS

/* ADS1235 commands */
#define CMD_RESET   0x06
#define CMD_RDATA   0x12

/* ADS1235 registers */
#define REG_MODE0   0x02
#define REG_MODE1   0x03
#define REG_REF     0x06
#define REG_PGA     0x10
#define REG_INPMUX  0x11

/* Same values as working Arduino code */
#define MODE0_20SPS_FIR      0x24
#define MODE1_CONT           0x00
#define REF_AVDD_AVSS        0x05
#define PGA_GAIN_1           0x00
#define INPMUX_AIN0_AIN1     0x34

volatile bool spi_done = false;

/* Debug/watch variables */
volatile uint8_t rx_data[5];

volatile uint8_t mode0_value = 0;
volatile uint8_t mode1_value = 0;
volatile uint8_t ref_value   = 0;
volatile uint8_t pga_value   = 0;
volatile uint8_t mux_value   = 0;

volatile int32_t adc_raw     = 0;
volatile int32_t zero_offset = 0;
volatile int32_t net_value   = 0;

void spi_callback(spi_callback_args_t * p_args)
{
    FSP_PARAMETER_NOT_USED(p_args);
    spi_done = true;
}

static void error_loop(void)
{
    while (1)
    {
        R_IOPORT_PinWrite(&g_ioport_ctrl, START_PIN, BSP_IO_LEVEL_LOW);
        R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);

        R_IOPORT_PinWrite(&g_ioport_ctrl, START_PIN, BSP_IO_LEVEL_HIGH);
        R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
    }
}

static void spi_transfer_blocking(uint8_t * tx, uint8_t * rx, uint32_t len)
{
    spi_done = false;

    fsp_err_t err = R_SPI_WriteRead(&g_spi0_ctrl,
                                    tx,
                                    rx,
                                    len,
                                    SPI_BIT_WIDTH_8_BITS);

    if (err != FSP_SUCCESS)
    {
        error_loop();
    }

    uint32_t timeout = 1000000;

    while ((!spi_done) && timeout)
    {
        timeout--;
    }

    if (timeout == 0)
    {
        error_loop();
    }
}

static void cs_low(void)
{
    R_IOPORT_PinWrite(&g_ioport_ctrl, CS_PIN, BSP_IO_LEVEL_LOW);
    R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
}

static void cs_high(void)
{
    R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
    R_IOPORT_PinWrite(&g_ioport_ctrl, CS_PIN, BSP_IO_LEVEL_HIGH);
    R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
}

static void ads_command(uint8_t cmd)
{
    uint8_t tx[2] = {cmd, 0x00};
    uint8_t rx[2] = {0};

    cs_low();
    spi_transfer_blocking(tx, rx, 2);
    cs_high();

    R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);
}

/* Arduino-matching WREG: command + value */
static void ads_write_register(uint8_t reg, uint8_t value)
{
    uint8_t tx[2] =
    {
        (uint8_t)(0x40 | (reg & 0x1F)),
        value
    };

    uint8_t rx[2] = {0};

    cs_low();
    spi_transfer_blocking(tx, rx, 2);
    cs_high();

    R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);
}

/* Arduino-matching RREG: command + two dummy bytes, return rx[2] */
static uint8_t ads_read_register(uint8_t reg)
{
    uint8_t tx[3] =
    {
        (uint8_t)(0x20 | (reg & 0x1F)),
        0x00,
        0x00
    };

    uint8_t rx[3] = {0};

    cs_low();
    spi_transfer_blocking(tx, rx, 3);
    cs_high();

    return rx[2];
}

static bool wait_for_drdy(uint32_t timeout_ms)
{
    bsp_io_level_t level = BSP_IO_LEVEL_HIGH;

    while (timeout_ms--)
    {
        R_IOPORT_PinRead(&g_ioport_ctrl, DRDY_PIN, &level);

        if (level == BSP_IO_LEVEL_LOW)
        {
            return true;
        }

        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
    }

    return false;
}

static int32_t ads_read_data(void)
{
    uint8_t tx[5] =
    {
        CMD_RDATA,
        0x00,
        0x00,
        0x00,
        0x00
    };

    rx_data[0] = 0;
    rx_data[1] = 0;
    rx_data[2] = 0;
    rx_data[3] = 0;
    rx_data[4] = 0;

    if (!wait_for_drdy(1000))
    {
        return adc_raw;
    }

    cs_low();
    spi_transfer_blocking(tx, (uint8_t *)rx_data, 5);
    cs_high();

    /* Same alignment as Arduino */
    int32_t value = ((int32_t)rx_data[2] << 16) |
                    ((int32_t)rx_data[3] << 8)  |
                    ((int32_t)rx_data[4]);

    if (value & 0x800000)
    {
        value |= 0xFF000000;
    }

    return value;
}

static void ads_init(void)
{
    R_IOPORT_PinWrite(&g_ioport_ctrl, CS_PIN,    BSP_IO_LEVEL_HIGH);
    R_IOPORT_PinWrite(&g_ioport_ctrl, PWDN_PIN,  BSP_IO_LEVEL_HIGH);
    R_IOPORT_PinWrite(&g_ioport_ctrl, RESET_PIN, BSP_IO_LEVEL_HIGH);
    R_IOPORT_PinWrite(&g_ioport_ctrl, START_PIN, BSP_IO_LEVEL_HIGH);

    R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);

    ads_command(CMD_RESET);

    R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);

    R_IOPORT_PinWrite(&g_ioport_ctrl, PWDN_PIN,  BSP_IO_LEVEL_HIGH);
    R_IOPORT_PinWrite(&g_ioport_ctrl, RESET_PIN, BSP_IO_LEVEL_HIGH);
    R_IOPORT_PinWrite(&g_ioport_ctrl, START_PIN, BSP_IO_LEVEL_HIGH);

    R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);

    ads_write_register(REG_MODE0,  MODE0_20SPS_FIR);
    ads_write_register(REG_MODE1,  MODE1_CONT);
    ads_write_register(REG_REF,    REF_AVDD_AVSS);
    ads_write_register(REG_PGA,    PGA_GAIN_1);
    ads_write_register(REG_INPMUX, INPMUX_AIN0_AIN1);

    R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);

    mode0_value = ads_read_register(REG_MODE0);
    mode1_value = ads_read_register(REG_MODE1);
    ref_value   = ads_read_register(REG_REF);
    pga_value   = ads_read_register(REG_PGA);
    mux_value   = ads_read_register(REG_INPMUX);
}

static void tare_scale(void)
{
    int64_t sum = 0;

    for (int i = 0; i < 20; i++)
    {
        sum += ads_read_data();
        R_BSP_SoftwareDelay(60, BSP_DELAY_UNITS_MILLISECONDS);
    }

    zero_offset = (int32_t)(sum / 20);
}

void hal_entry(void)
{
    R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg);

    fsp_err_t err = R_SPI_Open(&g_spi0_ctrl, &g_spi0_cfg);
    if (err != FSP_SUCCESS)
    {
        error_loop();
    }

    ads_init();

    __asm volatile ("nop");   // Breakpoint here, check register readback

    tare_scale();

    while (1)
    {
        adc_raw = ads_read_data();
        net_value = adc_raw - zero_offset;

        __asm volatile ("nop");   // Breakpoint here, check rx_data and adc_raw

        R_BSP_SoftwareDelay(250, BSP_DELAY_UNITS_MILLISECONDS);
    }
}

在屏幕截图中、无论是否应用负载、我获得的逻辑分析仪数据都显示相同。 我已经仔细检查了接线和连接、但我仍然看到相同的结果。

我以前能够使 ADS1235EVM 与 Arduino UNO R4 WiFi 正常工作、我添加了上面的工作设置配置以供参考。 但是、我无法使用 n ü e² studio 使其与 RA4M1 评估板正常配合使用。

如果对我接下来应该查看的内容提供任何建议或建议、我们将非常感激。

 ads1235withr4wifi 与 r4 wifi 的屏幕截图与 load.zip 

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

    您好、Skyler Joseph Ely、

    看起来您没有在正确的边沿触发。 ADC 在下降沿在 DIN 上锁存数据。 您可以在下图中看到这一点、其中 DIN 上的输出此时正在转换。

    尝试在 MCU 配置设置中修复此问题、查看 ADC 是否响应

    -布莱恩

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

    一切都很棒。我将它从 时钟极性从 奇数边沿的数据 采样、偶数边沿的数据变化到偶数边沿的数据采样、奇数边沿的数据变化。再次感谢 Bryan、由于我的技能问题、你为我节省了很多头巾。

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

    您好、Skyler Joseph Ely、

    很高兴我们能尽快解决这个问题

    -布莱恩