[技术问答] M23芯片,I2C_ReadMultiBytesOneReg修改,看不懂。请大侠指点。

[复制链接]
 楼主| nbiot 发表于 2019-11-19 08:37 | 显示全部楼层 |阅读模式


M23芯片,I2C_ReadMultiBytesOneReg函数修改,看不懂源码。。。
如果我想在函数中增加一些发送的数据,或修改停止或启动位,不知如何修改,请大侠指点。



  1. uint32_t I2C_ReadMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t au8Rdata[], uint32_t u32rLen)
  2. {
  3.     uint8_t u8Xfering = 1u, u8Err = 0u, u8Ctrl = 0u;
  4.     uint32_t u32rxLen = 0u;

  5.     I2C_START(i2c);                                                /* Send START */
  6.     while(u8Xfering && (u8Err == 0u))
  7.     {
  8.         I2C_WAIT_READY(i2c) {}
  9.         switch(I2C_GET_STATUS(i2c))
  10.         {
  11.             case 0x08u:
  12.                 I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u));      /* Write SLA+W to Register I2CDAT */
  13.                 u8Ctrl = I2C_CTL_SI;                             /* Clear SI */
  14.                 break;
  15.             case 0x18u:                                             /* Slave Address ACK */
  16.                 I2C_SET_DATA(i2c, u8DataAddr);                     /* Write Lo byte address of register */
  17.                 break;
  18.             case 0x20u:                                             /* Slave Address NACK */
  19.             case 0x30u:                                             /* Master transmit data NACK */
  20.                 u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
  21.                 u8Err = 1u;
  22.                 break;
  23.             case 0x28u:
  24.                 u8Ctrl = I2C_CTL_STA_SI;                         /* Send repeat START */
  25.                 break;
  26.             case 0x10u:
  27.                 I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u));    /* Write SLA+R to Register I2CDAT */
  28.                 u8Ctrl = I2C_CTL_SI;                             /* Clear SI */
  29.                 break;
  30.             case 0x40u:                                             /* Slave Address ACK */
  31.                 u8Ctrl = I2C_CTL_SI_AA;                          /* Clear SI and set ACK */
  32.                 break;
  33.             case 0x48u:                                             /* Slave Address NACK */
  34.                 u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
  35.                 u8Err = 1u;
  36.                 break;
  37.             case 0x50u:
  38.                 au8Rdata[u32rxLen++] = (uint8_t) I2C_GET_DATA(i2c);   /* Receive Data */
  39.                 if(u32rxLen < (u32rLen - 1u))
  40.                 {
  41.                     u8Ctrl = I2C_CTL_SI_AA;                      /* Clear SI and set ACK */
  42.                 }
  43.                 else
  44.                 {
  45.                     u8Ctrl = I2C_CTL_SI;                         /* Clear SI */
  46.                 }
  47.                 break;
  48.             case 0x58u:
  49.                 au8Rdata[u32rxLen++] = (uint8_t) I2C_GET_DATA(i2c);   /* Receive Data */
  50.                 u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
  51.                 u8Xfering = 0u;
  52.                 break;
  53.             case 0x38u:                                             /* Arbitration Lost */
  54.             default:                                               /* Unknow status */
  55.                 u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
  56.                 u8Err = 1u;
  57.                 break;
  58.         }
  59.         I2C_SET_CONTROL_REG(i2c, u8Ctrl);                          /* Write controlbit to I2C_CTL register */
  60.     }
  61.     return u32rxLen;                                               /* Return bytes length that have been received */
  62. }
玛尼玛尼哄 发表于 2019-11-19 13:35 | 显示全部楼层
这个例子确实难懂。
734774645 发表于 2019-11-19 15:19 | 显示全部楼层
代码可以看懂,看不懂的是不懂的协议。
huahuagg 发表于 2019-11-21 07:44 来自手机 | 显示全部楼层
直接调用这个函数就可以发送吧
jasontu 发表于 2019-11-21 07:56 | 显示全部楼层
在技術手冊裡面有master/slave transfer and reciver 的圖,配合i2c state應該就會了。
 楼主| nbiot 发表于 2019-11-21 09:24 | 显示全部楼层
jasontu 发表于 2019-11-21 07:56
在技術手冊裡面有master/slave transfer and reciver 的圖,配合i2c state應該就會了。
...

技術手冊有吗?我没找到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:QQ 2419286292

82

主题

181

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部