TWI配置
#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, ®Addr, 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, ®Addr, 1, true); false代表没有stop位,true代表有stop位