• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

rookie_志伟

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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;
}

posted on 2020-10-14 13:40  rookie_志伟  阅读(282)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3