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