Hi Mauro,

I think there is some issue in your SPI (I don't know if it is in your
configuration, or on your wiring, or in our device, or something else).

The issue you are seeing (only 1 bit transmitted) could be confirmed by
this error message:

nrf52_spi_exchange: Incomplete transfer wrote 536915151 expected 1

Looking at your configuration I noticed you enabled the char driver
support, but it is not required for native SPI drivers, it is used only for
testing.

(*) SPI character driver

It will create a /dev/spi0 that could be used to test SPI communication
directly, but since you are not using SPI test application, I think it is
not necessary.

I also noticed that 536915151 is 0x2000ACCF, which seems like a memory
pointer, which raises my suspicion there is some misconfiguration issue.

There are only two boards that currently have support for this sensor and
they used I2C.

So, I suggest you test first using I2C, since you can use a board as
reference. Or maybe someone working with this chip could help (not sure if
Raiden00 has this chip).

BR,

Alan

On Sun, Mar 3, 2024 at 6:08 PM Mauro Sollar <maurosol...@gmail.com> wrote:

> Hi,
>
> I made the recommended change and it compiled normally, but I saw that the
> code was missing the implementation of the CS signal, so I made the changes
> below and it still didn't work. Does the code really work for the
> nRF52832-DK? I used my logic analyzer and there is no information on the
> data line, only 1 in the 8 bits, but there is the rise and fall of the
> signal, I also checked the clock and it is ok! This is very confusing for
> me, I thought it would be easier to use the example of this BMI160 sensor.
> If you have any further help I would appreciate it again! Thanks!
>
> ============================== vi
> ./boards/arm/nrf52/nrf52832-dk/src/nrf52_bringup.c
>
> #include "nrf52_spi.h"
> #include <nuttx/sensors/bmi160.h>
>
> int nrf52_bringup(void)
> {
>   int ret;
> ...
> ...
> ...
>
>   struct spi_dev_s *dev = nrf52_spibus_initialize(0);
>               <<<----------- Added by me
>   ret = bmi160_register("/dev/accel0", dev);
>                  <<<-----------
>   if (ret < 0)
>                                      <<<-----------
>     {
>                                          <<<-----------
>       syslog(LOG_ERR, "ERROR: bmi160_register failed: %d\n", ret);
> <<<-----------
>     }
>                                          <<<-----------
>
> ...
> ...
> ...
>
>
> }
>
>
> ============================== vi
> ./boards/arm/nrf52/nrf52832-dk/include/board.h
>
> #define BOARD_SPI0_CS_PIN  (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT0 |
> GPIO_PIN(11))    <<<----------- Added by me
> #define BOARD_SPI0_INT_PIN (GPIO_OUTPUT | GPIO_PORT0 | GPIO_PIN(12))
>                                <<<-----------
>
> vi ./arch/arm/src/board/board/nrf52832-dk.h e adicione as linhas abaixo:
>
> /* BMI160 pins
>  * CS   - P0.11
>  * INT  - P0.12
>  */
>
> #define GPIO_BMI160_CS    (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT0 |
> GPIO_PIN(11))   <<<----------- Added by me
> #define GPIO_BMI160_INT   (GPIO_INPUT  | GPIO_PORT0 | GPIO_PIN(12))
>                                  <<<-----------
>
>
> ============================== vi
> ./boards/arm/nrf52/nrf52832-dk/src/nrf52_spi.c
>
>
> void nrf52_spidev_initialize(void)
> {
> #ifdef CONFIG_NRF52_SPI0_MASTER
> #  ifdef CONFIG_IEEE802154_MRF24J40
>   /* Configure the SPI-based MRF24J40 chip select GPIO */
>
>   spiinfo("Configure GPIO for MRF24J40 SPI1/CS\n");
>
>   nrf52_gpio_config(GPIO_MRF24J40_CS);
>   nrf52_gpio_write(GPIO_MRF24J40_CS, true);
> #  endif
> #  ifdef CONFIG_SENSORS_BMI160
> <<<----------- Added by me
>   /* Configure the SPI-based BMI160 chip select GPIO */  <<<-----------
>
>   spiinfo("Configure GPIO for BMI160 SPI0/CS\n");        <<<-----------
>
>   nrf52_gpio_config(GPIO_BMI160_CS);                     <<<-----------
>   nrf52_gpio_write(GPIO_BMI160_CS, true);                <<<-----------
> #  endif
>        <<<-----------
> #endif
> }
>
> ifdef CONFIG_NRF52_SPI0_MASTER
> void nrf52_spi0select(struct spi_dev_s *dev, uint32_t devid,
>                       bool selected)
> {
>   spiinfo("devid: %08lx CS: %s\n",
>           (unsigned long)devid, selected ? "assert" : "de-assert");
>
>   spiinfo("BMI160 device %s\n",                            <<<-----------
> Added by me
>           selected ? "asserted" : "de-asserted");          <<<-----------
>   /* Set the GPIO low to select and high to de-select */   <<<-----------
>   nrf52_gpio_write(GPIO_BMI160_CS, !selected);             <<<-----------
>
>   switch (devid)
>     {
> #ifdef CONFIG_IEEE802154_MRF24J40
>     case SPIDEV_IEEE802154(0):
>         {
>           spiinfo("MRF24J40 device %s\n",
>                   selected ? "asserted" : "de-asserted");
>
>           /* Set the GPIO low to select and high to de-select */
>
>           nrf52_gpio_write(GPIO_MRF24J40_CS, !selected);
>           break;
>         }
> #endif
>
>       default:
>         {
>           break;
>         }
>     }
> }
>
> uint8_t nrf52_spi0status(struct spi_dev_s *dev, uint32_t devid)
> {
>   uint8_t status = 0;
>
>   status |= SPI_STATUS_PRESENT;     <<--------------------- Added by me
>
>   switch (devid)
>     {
> #ifdef CONFIG_IEEE802154_MRF24J40
>       case SPIDEV_IEEE802154(0):
>         {
>           status |= SPI_STATUS_PRESENT;
>           break;
>         }
> #endif
>
>       default:
>         {
>           break;
>         }
>     }
>
>   return status;
> }
>
>
>
> ============================== vi ./arch/arm/src/nrf52/nrf52_spi.c
>
> static void nrf52_spi_gpioinit(struct nrf52_spidev_s *priv)
> {
>   nrf52_gpio_config(priv->sck_pin);
>   nrf52_spi_pselinit(priv, NRF52_SPIM_PSELSCK_OFFSET, priv->sck_pin);
>
> #ifdef CONFIG_NRF52_SPI0_MASTER
>   if (priv == &g_spi0dev)
>     {
>       nrf52_gpio_config(BOARD_SPI0_CS_PIN);                  <<<-----------
> Added by me
>       nrf52_spi_pselinit(priv, NRF52_SPIM_PSELCSN_OFFSET,    <<<-----------
>                          BOARD_SPI0_CS_PIN);
>
> #ifdef BOARD_SPI0_MISO_PIN
>       nrf52_gpio_config(BOARD_SPI0_MISO_PIN);
>       nrf52_spi_pselinit(priv, NRF52_SPIM_PSELMISO_OFFSET,
>                          BOARD_SPI0_MISO_PIN);
> #endif
> #ifdef BOARD_SPI0_MOSI_PIN
>       nrf52_gpio_config(BOARD_SPI0_MOSI_PIN);
>       nrf52_spi_pselinit(priv, NRF52_SPIM_PSELMOSI_OFFSET,
>                          BOARD_SPI0_MOSI_PIN);
>       nrf52_gpio_write(BOARD_SPI0_MOSI_PIN, false);
> #endif
>     }
> #endif
>
> ================= Error on NSH Terminal =================
>
>
> nsh>rf52_spidev_initialize: Configure GPIO for BMI160 SPI0/CS
> nrf52_spi_setmode: mode=0
> nrf52_spi_setfrequency: Frequency 1000000
> nrf52_spi0select: devid: 000d0000 CS: assert
> nrf52_spi0select: BMI160 device asserted
> nrf52_spi_exchange: Incomplete transfer wrote 536915151 expected 1
> nrf52_spi0select: devid: 000d0000 CS: de-assert
> nrf52_spi0select: BMI160 device de-asserted
> nrf52_spi_setmode: mode=0
> nrf52_spi0select: devid: 000d0000 CS: assert
> nrf52_spi0select: BMI160 device asserted
> nrf52_spi_exchange: Incomplete transfer wrote 536915151 expected 1
> nrf52_spi0select: devid: 000d0000 CS: de-assert
> nrf52_spi0select: BMI160 device de-asserted
> nrf52_spi_setmode: mode=0
> nrf52_spi0select: devid: 000d0000 CS: assert
> nrf52_spi0select: BMI160 device asserted
> nrf52_spi_exchange: Incomplete transfer wrote 536915143 expected 1
> nrf52_spi0select: devid: 000d0000 CS: de-assert
> nrf52_spi0select: BMI160 device de-asserted
> ERROR: bmi160_register failed: -19
>
> Em seg., 26 de fev. de 2024 às 03:57, raiden00pl <raiden0...@gmail.com>
> escreveu:
>
> > You need to specify that SPI is used as master:
> CONFIG_NRF52_SPI0_MASTER=y
> >
> > niedz., 25 lut 2024 o 21:22 Mauro Sollar <maurosol...@gmail.com>
> > napisał(a):
> >
> > > Hi,
> > >
> > > I'm trying to use the BMI160 sensor with the Nordic nRF52832-dk Kit,
> help
> > > me please!
> > >
> > > Kconfig Configuration:
> > >
> > > System type
> > >   nRF52 Peripheral Selection
> > >     (*) SPI 0
> > > Device Drivers
> > >   (*) SPI Driver Support
> > >     (*) SPI character driver
> > >   (*) Sensor Device Support
> > >     (*) Bosch BMI160 Inertial Measurement Sensor support
> > >   IO Expander/GPIO Support
> > >     (*) GPIO driver
> > > Application Configuration
> > >   Examples
> > >     (*) BMI160
> > >
> > > I added the following lines to the file:
> > > ./boards/arm/nrf52/nrf52832-dk/src/nrf52_bringup.c
> > >
> > >
> > > int nrf52_bringup(void)
> > > {
> > >   int ret;
> > > ...
> > > ...
> > > ...
> > >
> > >   struct spi_dev_s *dev = nrf52_spibus_initialize(0);
> > >   ret = bmi160_register("/dev/accel0", dev);
> > >   if (ret < 0)
> > >     {
> > >       syslog(LOG_ERR, "ERROR: bmi160_register failed: %d\n", ret);
> > >     }
> > >
> > > ...
> > > ...
> > > ...
> > >
> > >
> > > }
> > >
> > > Show this error:
> > >
> > > board/nrf52_bringup.c:104:27: warning: implicit declaration of function
> > > 'nrf52_spibus_initialize'; did you mean 'nrf52_spidev_initialize'?
> > > [-Wimplicit-function-declaration]
> > >   104 |   struct spi_dev_s *dev = nrf52_spibus_initialize(0);
> > >       |                           ^~~~~~~~~~~~~~~~~~~~~~~
> > >       |                           nrf52_spidev_initialize
> > > board/nrf52_bringup.c:104:27: warning: initialization of 'struct
> > spi_dev_s
> > > *' from 'int' makes pointer from integer without a cast
> > [-Wint-conversion]
> > > LD: nuttx
> > > arm-none-eabi-ld:
> > > /home/mauro/nuttxspace/nuttx/staging/libdrivers.a(bmi160_base.o): in
> > > function `bmi160_getreg8':
> > > /home/mauro/nuttxspace/nuttx/drivers/sensors/bmi160_base.c:87:
> undefined
> > > reference to `bmi160_configspi'
> > > arm-none-eabi-ld:
> > > /home/mauro/nuttxspace/nuttx/staging/libdrivers.a(bmi160_base.o): in
> > > function `bmi160_putreg8':
> > > /home/mauro/nuttxspace/nuttx/drivers/sensors/bmi160_base.c:145:
> undefined
> > > reference to `bmi160_configspi'
> > > arm-none-eabi-ld:
> > > /home/mauro/nuttxspace/nuttx/staging/libdrivers.a(bmi160_base.o): in
> > > function `bmi160_getreg16':
> > > /home/mauro/nuttxspace/nuttx/drivers/sensors/bmi160_base.c:205:
> undefined
> > > reference to `bmi160_configspi'
> > > arm-none-eabi-ld:
> > > /home/mauro/nuttxspace/nuttx/staging/libdrivers.a(bmi160_base.o): in
> > > function `bmi160_getregs':
> > > /home/mauro/nuttxspace/nuttx/drivers/sensors/bmi160_base.c:265:
> undefined
> > > reference to `bmi160_configspi'
> > > make[1]: *** [Makefile:197: nuttx] Erro 1
> > > make: *** [tools/Unix.mk:546: nuttx] Erro 2
> > >
> > >
> > > thanks,
> > > --
> > > Mauro Costa Sollar
> > > Cel.: 31 98894-2932
> > >
> >
>
>
> --
> Mauro Costa Sollar
> Cel.: 31 98894-2932
>

Reply via email to