i2c的发送和接收的底层实现
uint32_t hal_i2c_task_mrecv(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t* tx_buf, uint8_t* rx_buf, uint16_t rx_item_len, uint16_t item_cnt, uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler)
{
uint32_t task_idx;
ASSERT(id < HAL_I2C_ID_NUM, invalid_id, id);
if (hal_ic2_sm[id].cfg.mode != HAL_I2C_API_MODE_TASK)
{
return HAL_I2C_ERRCODE_INV_PARAM;
}
task_idx = hal_i2c_sm_commit(id, tx_buf, tx_item_len, rx_buf, rx_item_len, item_cnt, device_addr, HAL_I2C_SM_TASK_ACTION_M_RECV, transfer_id, handler);
hal_i2c_sm_kickoff(id);
return hal_i2c_sm_wait_task_if_need(id, task_idx, HAL_I2C_SYNC_TM_MS);
}
uint32_t hal_i2c_task_msend(enum HAL_I2C_ID_T id, uint16_t device_addr, const uint8_t* tx_buf, uint8_t* rx_buf, uint16_t rx_item_len, uint16_t item_cnt, uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler)
{
uint32_t task_idx;
ASSERT(id < HAL_I2C_ID_NUM, invalid_id, id);
if (hal_ic2_sm[id].cfg.mode != HAL_I2C_API_MODE_TASK)
{
return HAL_I2C_ERRCODE_INV_PARAM;
}
task_idx = hal_i2c_sm_commit(id, tx_buf, tx_item_len, NULL,0,item_cnt, device_addr, HAL_I2C_SM_TASK_ACTION_M_SEND, transfer_id, handler);
hal_i2c_sm_kickoff(id);
return hal_i2c_sm_wait_task_if_need(id, task_idx, HAL_I2C_SYNC_TM_MS);
}
static uint32_t hal_i2c_sm_commit(enum HAL_I2C_ID_T id, const uint8_t* tx_buf, uint16_t tx_txn_len, uint8_t* rx_buf, uint16_t rx_txn_len, uint16_t txn_cnt, uint16_t target_addr, uint32_t action, uint32_t transfer_id, HAL_I2C_TRANSFER_HANDLER_T handler)
{
uint32_t cur = har_i2c_sm[id].in_task;
hal_i2c_sm[id].task[cur].tx_buf = tx_buf;
hal_i2c_sm[id].task[cur].rx_buf = rx_buf;
hal_i2c_sm[id].task[cur].stop = 1;
hal_i2c_sm[id].task[cur].lock = 1;
hal_i2c_sm[id].task[cur].state = 0;
hal_i2c_sm[id].task[cur].rx_txn_len = rx_txn_len;
hal_i2c_sm[id].task[cur].tx_txn_len = tx_txn_len;
hal_i2c_sm[id].task[cur].tx_pos = 0;
hal_i2c_sm[id].task[cur].rx_pos = 0;
hal_i2c_sm[id].task[cur].rx_cmd_sent = 0;
hal_i2c_sm[id].task[cur].errcode = 0;
hal_i2c_sm[id].task[cur].action = action;
hal_i2c_sm[id].task[cur].handler = handler;
hal_i2c_sm[id].task[cur].restart_after_write = 1;
hal_i2c_sm[id].task[cur].target_addr = target_addr;
hal_i2c_sm[id].task[cur].transfer_id = transfer_id;
hal_i2c_sm[id].in_task = (cur + 1) % HAL_I2C_SM_TASK_NUM_MAX;
hal_i2c_sm[id].task_count++;
return cur;
}