i2c例程中的疑问

[复制链接]
查看872 | 回复6 | 2023-12-3 17:21:00 | 显示全部楼层 |阅读模式


i2c demo例程中,如下:i2c收发完成后都是进行一个延时操作,等待收发完成。这样对于需要i2c持续操作的任务,就降低了收发的效率
  1. bflb_i2c_transfer(i2c0, msgs, 2);
  2.     printf("write over\r\n");
  3.     bflb_mtimer_delay_ms(100);

  4.     /* Read page 0 */
  5.     msgs[1].addr = 0x50;
  6.     msgs[1].flags = I2C_M_READ;
  7.     msgs[1].buffer = read_data;
  8.     msgs[1].length = EEPROM_TRANSFER_LENGTH;
  9.     bflb_i2c_transfer(i2c0, msgs, 2);
  10.     printf("read over\r\n");
  11.     bflb_mtimer_delay_ms(100);
复制代码
考虑是否能将 bflb_i2c_transfer 前面加一个等待 i2c 非busy 然后进行下一步的的操作呢
  1. int bflb_i2c_transfer(struct bflb_device_s *dev, struct bflb_i2c_msg_s *msgs, int count)
  2. {
  3.     uint16_t subaddr = 0;
  4.     uint16_t subaddr_size = 0;
  5.     bool is_addr_10bit = false;
  6.     int ret = 0;

  7.     bflb_i2c_disable(dev);

  8.     for (uint16_t i = 0; i < count; i++) {
  9.         if (msgs[i].flags & I2C_M_TEN) {
  10.             is_addr_10bit = true;
  11.         } else {
  12.             is_addr_10bit = false;
  13.         }
  14.         if (msgs[i].flags & I2C_M_NOSTOP) {
  15.             subaddr = 0;
  16.             for (uint8_t j = 0; j < msgs[i].length; j++) {
  17.                 subaddr += msgs[i].buffer[j] << (j * 8);
  18.             }
  19.             subaddr_size = msgs[i].length;
  20.             bflb_i2c_addr_config(dev, msgs[i].addr, subaddr, subaddr_size, is_addr_10bit);
  21.             i++;
  22.         } else {
  23.             subaddr = 0;
  24.             subaddr_size = 0;
  25.             bflb_i2c_addr_config(dev, msgs[i].addr, subaddr, subaddr_size, is_addr_10bit);
  26.         }

  27.         if (msgs[i].length > 256) {
  28.             return -EINVAL;
  29.         }
  30.         bflb_i2c_set_datalen(dev, msgs[i].length);
  31.         if (msgs[i].flags & I2C_M_READ) {
  32.             bflb_i2c_set_dir(dev, 1);
  33.             if ((msgs[i].flags & I2C_M_DMA) == 0) {
  34.                 ret = bflb_i2c_read_bytes(dev, msgs[i].buffer, msgs[i].length);
  35.                 if (ret < 0) {
  36.                     return ret;
  37.                 }
  38.             } else {
  39.                 bflb_i2c_enable(dev);
  40.             }
  41.         } else {
  42.             bflb_i2c_set_dir(dev, 0);
  43.             if ((msgs[i].flags & I2C_M_DMA) == 0) {
  44.                 ret = bflb_i2c_write_bytes(dev, msgs[i].buffer, msgs[i].length);
  45.                 if (ret < 0) {
  46.                     return ret;
  47.                 }
  48.             } else {
  49.                 bflb_i2c_enable(dev);
  50.             }
  51.         }
  52.     }

  53.     return 0;
  54. }
复制代码

  1. /* 0xC : i2c_bus_busy */
  2. #define I2C_STS_I2C_BUS_BUSY    (1 << 0U)
  3. #define I2C_CR_I2C_BUS_BUSY_CLR (1 << 1U)
复制代码
纯属个人想法,不知是否可行或者会带来其他稳定性问题,各位坛友可以帮忙一起看看,谢谢!
回复

使用道具 举报

Ject | 2023-12-3 19:25:45 | 显示全部楼层
回复

使用道具 举报

WT_0213 | 2023-12-4 09:11:01 | 显示全部楼层
扣的挺深入呀
回复 支持 反对

使用道具 举报

爱笑 | 2023-12-4 10:01:55 | 显示全部楼层
优秀~
用心做好保姆工作
回复

使用道具 举报

lsrly | 2023-12-4 10:33:38 | 显示全部楼层
这个对于有时IIC会出BUG不,
回复 支持 反对

使用道具 举报

干簧管 | 2023-12-4 11:15:26 | 显示全部楼层
lsrly 发表于 2023-12-4 10:33
这个对于有时IIC会出BUG不,

可以测试下,具体不清楚
回复 支持 反对

使用道具 举报

1084504793 | 2024-1-2 08:48:17 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则