NRF52832 TWI 死循环
1、资源
SDK15.3, TWI 中断模式, 832作为主设备,tp7259从设备
2、问题
A、当快速的触摸的时候,会出现TWI进入死循环
B、接口状态
C、寄存器状态
D、函数调用流程
MemoryReadBuffer( POINT_BUFFER_INDEX, &pointdata[0], 14 )
T7259I2C_Read( addr, len, pdata )
nrf_drv_twi_rx
nrfx_twi_rx
nrfx_twi_xfer
twi_xfer
开启中断接收数据
接收到11个数据的时候就是在中断里面
twi_irq_handler
twi_transfer 就在这两个函数一直死循环
3、然后把TWI的驱动升级为SDK16后目前没有测试到问题主要的差别是接口加了一个prev_suspend
SDK16
typedef struct
{
nrfx_twi_evt_handler_t handler;
void * p_context;
volatile uint32_t int_mask;
nrfx_twi_xfer_desc_t xfer_desc;
uint32_t flags;
uint8_t * p_curr_buf;
size_t curr_length;
bool curr_tx_no_stop;
twi_suspend_t prev_suspend;
nrfx_drv_state_t state;
bool error;
volatile bool busy;
bool repeated;
size_t bytes_transferred;
bool hold_bus_uninit;
} twi_control_block_t;
SDK15.3
typedef struct
{
nrfx_twi_evt_handler_t handler;
void * p_context;
volatile uint32_t int_mask;
nrfx_twi_xfer_desc_t xfer_desc;
uint32_t flags;
uint8_t * p_curr_buf;
size_t curr_length;
bool curr_no_stop;
nrfx_drv_state_t state;
bool error;
volatile bool busy;
bool repeated;
size_t bytes_transferred;
bool hold_bus_uninit;
} twi_control_block_t;
还有发送和接收有suspend处理
static bool twi_receive_byte(NRF_TWI_Type * p_twi,
twi_control_block_t * p_cb)
{
if (p_cb->bytes_transferred < p_cb->curr_length)
{
p_cb->p_curr_buf[p_cb->bytes_transferred] = nrf_twi_rxd_get(p_twi);
++(p_cb->bytes_transferred);
if ((p_cb->bytes_transferred == p_cb->curr_length - 1) && (!TWI_FLAG_SUSPEND(p_cb->flags)))
{
nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK);
}
else if (p_cb->bytes_transferred == p_cb->curr_length && (!TWI_FLAG_SUSPEND(p_cb->flags)))
{
return true;
}
else if (p_cb->bytes_transferred == p_cb->curr_length && TWI_FLAG_SUSPEND(p_cb->flags))
{
p_cb->prev_suspend = TWI_SUSPEND_RX;
return false;
}
nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME);
}
return true;
}
没有找到为什么,那位如果有相当的问题,请指点一二。谢谢!