I'm working on a project with the AD5940, and it looks like this case did the job.
nrf52832+SPI+AD5940 cannot get ad5940id
However, I am using NCS v2.2.0 and not nRF5 v17.1 - so code translation is required.
My current code is as follows:
Overlay:
/ {
gpio_custom {
compatible = "gpio-keys";
gpiocu0: gpiocu0 {
label = "GPIO_D2";
gpios = <&gpio1 4 0>;/* D2 */
};
gpiocu1: gpiocu1 {
label = "GPIO_D5";
gpios = <&gpio1 7 0>;/* D5 */
};
gpiocu2: gpiocu2 {
label = "GPIO_D6";
gpios = <&gpio1 8 0>;/* D6 */
};
ad5940reset: ad5940reset {
label = "AD5940_RESET";
gpios = <&gpio1 12 0>;/* D10 */
};
};
aliases {
gpiod2 = &gpiocu0;
gpiod5 = &gpiocu1;
gpiod6 = &gpiocu2;
reset5940 = &ad5940reset;
};
};
&arduino_spi {
status = "okay";
ad5940:ad5940@0{
compatible = "adi,adxl345";
// compatible = "adi,adxl372";
reg = <0>;
spi-max-frequency = <DT_FREQ_M(4)>;
friendly-name = "ad5940";
// int1-gpios = <&gpio1 8 0>;
};
};
nRF adjustment(nRF_MCU_Port.c):
#include "ad5940.h"
#include "nRF_MCU_Port.h"
#include <zephyr/device.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/logging/log.h>
#include <inttypes.h>
#include <dk_buttons_and_leds.h>
LOG_MODULE_REGISTER(BIA_AD5940);
volatile static uint32_t ucInterrupted = 0; /* Flag to indicate interrupt occurred */
#define AD5940_SPI DT_NODELABEL(ad5940)
static const struct spi_dt_spec dev_spi = SPI_DT_SPEC_GET(AD5940_SPI, SPI_WORD_SET(8) | SPI_MODE_GET(0), 0);
/* GPIO Configuration*/
#define D6 DT_ALIAS(gpiod6)
#if !DT_NODE_HAS_STATUS(D6, okay)
#error "Unsupported board: gpiod6 devicetree alias is not defined"
#endif
/*For the XXRst functions*/
#define R5940 DT_ALIAS(reset5940)
#if !DT_NODE_HAS_STATUS(R5940, okay)
#error "Unsupported board: reset_5940 devicetree alias is not defined"
#endif
uint8_t selector = 0;
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(D6, gpios, {0});
/*AD5940 Reset Pin*/
static const struct gpio_dt_spec reset_dev = GPIO_DT_SPEC_GET_OR(R5940, gpios, {0});
/*Interrupt Special settings*/
static struct gpio_callback button_cb_data;
bool AD5940_SPI_SETUP(void)
{
if (!device_is_ready(dev_spi.bus))
{
// LOG_ERR("Couldn't find %s\n", dev_spi.bus->name);
printk("Couldn't find %s\n", dev_spi.bus->name);
return false;
}
else
{
// LOG_WRN("SPI Initialized\n\r");
bool success = (AD5940_ReadReg(REG_AFECON_ADIID) == AD5940_ADIID) ? true : false;
if(success)
printk("SPI Initialized\n\r");
else
// printk("SPI Initialization failed\n\r");
return success;
}
}
void Ext_Int0_Handler(const struct device *dev, struct gpio_callback *cb,
uint32_t pins)
{
// /* Clear interrupt flag */
ucInterrupted = 1;
// LOG_INF("Ext_Int0_Handler\n\r");
// todo: ADD BLE and EMG interrupt handling here - or not - depends on the application
/* This example just set the flag and deal with interrupt in AD5940Main function. It's your choice to choose how to process interrupt. */
}
//GPIO Free "interrupt"
void set_interrupt(void)
{
ucInterrupted = 1;
}
void AD5940_INT_SETUP(void)
{
int ret;
if (!device_is_ready(button.port))
{
printk("Error: button device %s is not ready\n",
button.port->name);
return;
}
ret = gpio_pin_configure_dt(&button, GPIO_INPUT);
if (ret != 0)
{
printk("Error %d: failed to configure %s pin %d\n",
ret, button.port->name, button.pin);
return;
}
ret = gpio_pin_interrupt_configure_dt(&button,
GPIO_INT_EDGE_TO_ACTIVE);
if (ret != 0)
{
printk("Error %d: failed to configure interrupt on %s pin %d\n",
ret, button.port->name, button.pin);
return;
}
gpio_init_callback(&button_cb_data, Ext_Int0_Handler, BIT(button.pin));
gpio_add_callback(button.port, &button_cb_data);
printk("Set up button at %s pin %d\n", button.port->name, button.pin);
// LOG_INF("Set up button at %s pin %d\n", button.port->name, button.pin);
}
// void AD5940_GUI_SETUP(void)
// {
// if (!device_is_ready(dev_led0.port->name))
// {
// // LOG_ERR("Couldn't find %s\n", dev_led0.port->name);
// printk("Couldn't find %s\n", dev_led0.port->name);
// return;
// }
// else
// {
// // LOG_WRN("GPIO Initialized\n\r");
// printk("GPIO Initialized\n\r");
// gpio_pin_configure_dt(&dev_led0, GPIO_OUTPUT_INIT_LOW);
// }
// }
void AD5940_RESET_SETUP(void)
{
if (!device_is_ready(reset_dev.port))
{
// LOG_ERR("Couldn't find %s\n", reset_dev.port->name);
printk("Couldn't find %s\n", reset_dev.port->name);
return;
}
else
{
// LOG_WRN("GPIO Initialized\n\r");
printk("GPIO Initialized\n\r");
gpio_pin_configure_dt(&reset_dev, GPIO_OUTPUT);
}
}
void AD5940_ReadWriteNBytes(unsigned char *pSendBuffer, unsigned char *pRecvBuff, unsigned long length)
{
const struct spi_buf tx_buf = {
.buf = pSendBuffer,
.len = length};
const struct spi_buf_set tx = {
.buffers = &tx_buf,
.count = 1};
const struct spi_buf rx_buf = {
.buf = pRecvBuff,
.len = length};
const struct spi_buf_set rx = {
.buffers = &rx_buf,
.count = 1};
if (spi_transceive_dt(&dev_spi, &tx, &rx))
{
// LOG_ERR("SPI transceive failed\n");
printk("SPI transceive failed\n");
return;
}
}
void AD5940_CsClr(void)
{
// Do nothing - built in inside SPI API
}
void AD5940_CsSet(void)
{
// Do nothing - built in inside SPI API
}
void AD5940_RstSet(void)
{
// Check it - maybe it has special flag
if (gpio_pin_get_dt(&reset_dev) == 0)
{
// LOG_INF("Reset pin set\n");
printk("nRF_MCU_Port: Reset pin set\n");
gpio_pin_set_dt(&reset_dev, 1);
}
}
void AD5940_RstClr(void)
{
// Check it - maybe it has special flag
if (gpio_pin_get_dt(&reset_dev) == 1)
{
// LOG_INF("nRF_MCU_Port: Reset pin clear\n");
printk("nRF_MCU_Port: Reset pin clear\n");
gpio_pin_set_dt(&reset_dev, 0);
}
}
void AD5940_DATA_GUI(void)
{
// gpio_pin_toggle_dt(&dev_led0);
}
void AD5940_Delay10us(uint32_t time)
{
k_usleep(time * 10);
}
uint32_t AD5940_GetMCUIntFlag(void)
{
return ucInterrupted;
}
uint32_t AD5940_ClrMCUIntFlag(void)
{
ucInterrupted = 0;
return 1;
}
uint32_t AD5940_MCUResourceInit(void)
{
// LOG_WRN("AD5940_MCUResourceInit\n\r");
printk("nRF_MCU_Port: AD5940_MCUResourceInit\n\r");
AD5940_INT_SETUP();
// AD5940_GUI_SETUP();
AD5940_RESET_SETUP();
AD5940_RstSet();
if(!AD5940_SPI_SETUP())
{
// LOG_ERR("SPI Initialization failed\n\r");
printk("SPI Initialization failed\n\r");
while(1);
}
return 0;
}
nRF_MCU_Port.h
#ifndef NRF_MCU_PORT_H_ #define NRF_MCU_PORT_H_ uint32_t AD5940_MCUResourceInit(void); void AD5940_DATA_GUI(void); void set_interrupt(void); #endif /* NRF_MCU_PORT_H_ */
Currently, it looks like the reset and interrupts are initializing well. The spi instance is "initialized," but I can't use the spi port as a sensor.
The evaluation board for this component is based on the Arduino R3 pinout.
The component is functioning ( I tested with the native MCU)
This is urgent for our project schedule; please help!
Thanks to all the helpers!