nrfx-TWI

TWI配置

TWI driver filesdk_config.h

#define TWI_MAX_NUM_TX_BYTES 14
#define TWI_TIMEOUT 20000

/* TWI instance ID. */

#define MC_TWI_INSTANCE_ID     1

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

volatile static bool s_twiTxDone = false;
volatile static bool s_twiRxDone = false;
static uint8_t s_twiWriteDataBuffer[TWI_MAX_NUM_TX_BYTES];
TWI初始化,twi_handleEvent可以不需要
static void mergeRegisterAndData(uint8_t *pTxBuf, uint8_t regAddr, uint8_t *pData, uint8_t dataLen)
{
    pTxBuf[0] = regAddr;
    memcpy((pTxBuf + 1), pData, dataLen);
}

static void twi_handleEvent(nrf_drv_twi_evt_t const *pEvent, void *pContext)
{
    switch(pEvent->type)
    {
        case NRF_DRV_TWI_EVT_DONE:
            switch(pEvent->xfer_desc.type)
            {
                case NRF_DRV_TWI_XFER_TX:
                    s_twiTxDone = true;
                    break;
                case NRF_DRV_TWI_XFER_TXTX:
                    s_twiTxDone = true;
                    break;
                case NRF_DRV_TWI_XFER_RX:
                    s_twiRxDone = true;
                    break;
                case NRF_DRV_TWI_XFER_TXRX:
                    s_twiRxDone = true;
                    break;
                default:
                    break;
            }
            break;
        case NRF_DRV_TWI_EVT_ADDRESS_NACK:

            break;
        case NRF_DRV_TWI_EVT_DATA_NACK:

            break;
        default:
            break;
     }
}

void twi_init (void)
{
    ret_code_t err_code;

    const nrf_drv_twi_config_t twi_config = {
       .scl                = TWI_SCL_PIN,
       .sda                = TWI_SDA_PIN,
       .frequency          = NRF_DRV_TWI_FREQ_400K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .clear_bus_init     = false
    };

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

    nrf_drv_twi_enable(&m_twi);
}

void ak_mlx_twi_enable(void)
{
    nrf_drv_twi_enable(&m_twi);
}

void ak_mlx_twi_disable(void)
{
    nrf_drv_twi_disable(&m_twi);
}

mergeRegisterAndData 合并要写入的数据

写操作
ret_code_t ak_data_write(uint8_t slaveAddr, uint8_t regAddr, uint8_t *pData, uint8_t dataLen)
{
    uint32_t errCode;
    uint32_t timeout = TWI_TIMEOUT;

    mergeRegisterAndData(s_twiWriteDataBuffer, regAddr, pData, dataLen);
    errCode = nrf_drv_twi_tx(&m_twi, slaveAddr, s_twiWriteDataBuffer, dataLen + 1, false);

    while((!s_twiTxDone) && --timeout);
    if(!timeout)
    {
        return NRF_ERROR_TIMEOUT;
    }
    s_twiTxDone = false;

    return errCode;
}

nrf_drv_twi_tx(&m_twi, slaveAddr, s_twiWriteDataBuffer, dataLen + 1, false); false代表没有stop位,true代表有stop位

读操作
ret_code_t ak_data_read(uint8_t slaveAddr, uint8_t regAddr, uint8_t *pData, uint8_t dataLen)
{
    uint32_t errCode;
    uint32_t timeout = TWI_TIMEOUT;

    errCode = nrf_drv_twi_tx(&m_twi, slaveAddr, &regAddr, 1, true);
    if(errCode != NRF_SUCCESS)
    {
        return errCode;
    }

    while((!s_twiTxDone) && --timeout);
    if(!timeout)
    {
        return NRF_ERROR_TIMEOUT;
    }
    s_twiTxDone = false;

    errCode = nrf_drv_twi_rx(&m_twi, slaveAddr, pData, dataLen);
    if(errCode != NRF_SUCCESS)
    {
        return errCode;
    }

    timeout = TWI_TIMEOUT;
    while((!s_twiRxDone) && --timeout);
    if(!timeout)
    {
        return NRF_ERROR_TIMEOUT;
    }
    s_twiRxDone = false;

    return errCode;
}

nrf_drv_twi_tx(&m_twi, slaveAddr, &regAddr, 1, true); false代表没有stop位,true代表有stop位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值