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

#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 评估板正常配合使用。
如果对我接下来应该查看的内容提供任何建议或建议、我们将非常感激。
