nRF52832 TWI1错误

请问各位我想开启nRF52832的TWI1,但是我修改TWI_INSTANCE_ID为1,就会报错(如图所示),请问这是为什么呢?

img

可以借鉴下

#define IIC_SCL_PIN             27    // SCL signal pin
#define IIC_SDA_PIN             26    // SDA signal pin

/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

/**
 * @brief TWI events handler.
 */
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
    switch (p_event->type)
    {
        case NRF_DRV_TWI_EVT_DONE:
            if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX)
            {
                data_handler(m_sample);
            }
            m_xfer_done = true;
            break;
        default:
            break;
    }
}

/**
 * @brief TWI initialization.
 */
void twi_init (void)
{
    ret_code_t err_code;

    const nrf_drv_twi_config_t twi_config = {
       .scl                = IIC_SCL_PIN,           // 引脚配置
       .sda                = IIC_SDA_PIN,           // 引脚配置
       .frequency          = NRF_DRV_TWI_FREQ_100K, // 传输速率
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH, // IIC中断优先级
       .clear_bus_init     = false
    };

    err_code = nrf_drv_twi_init(&m_twi, &twi_config, twi_handler, NULL);
    APP_ERROR_CHECK(err_code);

    nrf_drv_twi_enable(&m_twi);
}

/**
 * @brief TWI uninitialization.
 */
void twi_uninit (void)
{
    nrf_drv_twi_uninit(&m_twi);
}



方法不存在 NRF*****这个方法

去看看数据手册,你好好看看地址

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据您提供的信息,我猜测您使用的是nRF5 SDK,且您试图在使用TWI时遇到了问题。根据错误提示,TWI1可能未被定义或未启用。

为了启用TWI1,请确保您已执行以下步骤:

1.在sdk_config.h文件中,启用TWI1:

#define TWI1_ENABLED             1
  1. 在您的代码中,初始化TWI1并执行读取/写入操作,例如:
#define TWI_INSTANCE_ID     1

static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

/* 初始化TWI1 */
ret_code_t twi_init(void)
{
    ret_code_t err_code;

    const nrf_drv_twi_config_t twi_config = {
       .scl                = ARDUINO_SCL_PIN,
       .sda                = ARDUINO_SDA_PIN,
       .frequency          = NRF_TWI_FREQ_400K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .clear_bus_init     = false
    };

    err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);

    if (err_code == NRF_SUCCESS)
    {
        nrf_drv_twi_enable(&m_twi);
    }

    return err_code;
}

/* 从设备地址为0x53的传感器读取数据 */
ret_code_t twi_read(uint8_t address, uint8_t *data, uint8_t length)
{
    ret_code_t err_code;

    err_code = nrf_drv_twi_tx(&m_twi, address, data, 1, true);

    if (err_code == NRF_SUCCESS)
    {
        err_code = nrf_drv_twi_rx(&m_twi, address, data, length);
    }

    return err_code;
}

/* 向设备地址为0x53的传感器写入数据 */
ret_code_t twi_write(uint8_t address, uint8_t *data, uint8_t length)
{
    ret_code_t err_code;

    uint8_t tx_data[length + 1];
    tx_data[0] = data[0];
    memcpy(&tx_data[1], &data[1], length-1);

    err_code = nrf_drv_twi_tx(&m_twi, address, tx_data, length, false);

    return err_code;
}

请注意,TWI_INSTANCE_ID必须与配置文件中定义的ID相匹配(在本例中,TWI_INSTANCE_ID被设置为1,与配置文件中定义的相同)。

希望这可以解决您的问题。
如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

根据报错信息,这是一个编译错误,编译器无法找到NRF_DRV_TWI_INSTANCE(1)这个标识符。

这是因为nRF52832芯片只有一个TWI外设实例(TWI0),所以nrf_drv_twi.h头文件中只定义了NRF_DRV_TWI_INSTANCE(0)这个标识符,没有定义NRF_DRV_TWI_INSTANCE(1)。

所以,要解决这个问题,你有两种方法:

  1. 使用TWI0实例,将TWI_INSTANCE_ID修改为0,然后使用NRF_DRV_TWI_INSTANCE(0)来定义TWI实例。这个是最简单直接的方法。

  2. 如果一定要使用TWI1实例,你需要自己定义这个标识符。可以在代码中添加如下定义:

c
#define NRF_DRV_TWI_INSTANCE(1)  {0, 0}  // Define TWI1 instance 

然后在定义TWI实例时使用这个标识符:

c 
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(1);

这相当于你自己定义了TWI1这个实例,然后代码中使用这个实例。但实际上nRF52832芯片还是只有TWI0一个物理实例。

所以,总结来说,这个报错是因为你试图使用不存在的TWI1实例,解决方法是:

  1. 使用TWI0实例,修改代码中的TWI_INSTANCE_ID为0。
  2. 自己定义TWI1实例标识符NRF_DRV_TWI_INSTANCE(1),然后使用这个标识符。但实际上还是使用的TWI0物理实例。