Я пытаюсь написать код для связи с акселерометром .
Мой mcu - это nRF52, и я пытаюсь использовать пример SPI, приведенный в SDK15.0.0.0.
Я также использую драйверы, созданные производителем для lis2dh12 .
Учитывая, что моя конфигурация PIN-кода правильная, у меня до сих пор есть моя функция записи:
int32_t my_write_reg(void* handler, uint8_t reg, uint8_t* write_buf, uint16_t len)
{
uint8_t buff[2];
buff[0] = reg & 0x7F;
buff[1] = write_buf[0];
spi_xfer_done = false;
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, buff, 2, NULL, 0));
while (!spi_xfer_done)
{
__WFE();
};
return 0;
}
Моя функция чтения следующая:
int32_t my_read_reg(void* handler, uint8_t reg, uint8_t* read_buf, uint16_t len)
{
reg |= 0xC0;
spi_xfer_done = false;
APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, ®, 1, read_buf, len));
while (!spi_xfer_done)
{
__WFE();
};
return 0;
}
Инициализация SPI дается функцией:
void spi_init(void)
{
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = SPI_SS_PIN;
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin = SPI_SCK_PIN;
nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL);
}
Моя главная выглядит так:
int main(void)
{
bsp_board_init(BSP_INIT_LEDS);
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
spi_init();
NRF_LOG_INFO("SPI example started.");
bsp_board_led_invert(BSP_BOARD_LED_0);
lis2dh12_ctx_t my_accel;
my_accel.read_reg = my_read_reg;
my_accel.write_reg = my_write_reg;
lis2dh12_device_id_get(&my_accel,m_rx_buf);
NRF_LOG_HEXDUMP_INFO(m_rx_buf, sizeof(m_rx_buf));
NRF_LOG_FLUSH();
}
У моего главного нет цикла while, потому что я просто пытаюсь прочитать идентификатор акселерометра. Но код всегда возвращает 0, как будто устройство даже не подключено.
Есть ли кто-нибудь, у кого есть время и интерес, чтобы помочь мне с этим?
(Я не очень знаком с SPI и nRF52, но я пытаюсь).