[技术问答]

M23芯片,I2C_ReadMultiBytesOneReg修改,看不懂。请大侠指点。

[复制链接]
663|5
手机看帖
扫描二维码
随时随地手机跟帖
nbiot|  楼主 | 2019-11-19 08:37 | 显示全部楼层 |阅读模式


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



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

    I2C_START(i2c);                                                /* Send START */
    while(u8Xfering && (u8Err == 0u))
    {
        I2C_WAIT_READY(i2c) {}
        switch(I2C_GET_STATUS(i2c))
        {
            case 0x08u:
                I2C_SET_DATA(i2c, (uint8_t)(u8SlaveAddr << 1u | 0x00u));      /* Write SLA+W to Register I2CDAT */
                u8Ctrl = I2C_CTL_SI;                             /* Clear SI */
                break;
            case 0x18u:                                             /* Slave Address ACK */
                I2C_SET_DATA(i2c, u8DataAddr);                     /* Write Lo byte address of register */
                break;
            case 0x20u:                                             /* Slave Address NACK */
            case 0x30u:                                             /* Master transmit data NACK */
                u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
                u8Err = 1u;
                break;
            case 0x28u:
                u8Ctrl = I2C_CTL_STA_SI;                         /* Send repeat START */
                break;
            case 0x10u:
                I2C_SET_DATA(i2c, (uint8_t)((u8SlaveAddr << 1u) | 0x01u));    /* Write SLA+R to Register I2CDAT */
                u8Ctrl = I2C_CTL_SI;                             /* Clear SI */
                break;
            case 0x40u:                                             /* Slave Address ACK */
                u8Ctrl = I2C_CTL_SI_AA;                          /* Clear SI and set ACK */
                break;
            case 0x48u:                                             /* Slave Address NACK */
                u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
                u8Err = 1u;
                break;
            case 0x50u:
                au8Rdata[u32rxLen++] = (uint8_t) I2C_GET_DATA(i2c);   /* Receive Data */
                if(u32rxLen < (u32rLen - 1u))
                {
                    u8Ctrl = I2C_CTL_SI_AA;                      /* Clear SI and set ACK */
                }
                else
                {
                    u8Ctrl = I2C_CTL_SI;                         /* Clear SI */
                }
                break;
            case 0x58u:
                au8Rdata[u32rxLen++] = (uint8_t) I2C_GET_DATA(i2c);   /* Receive Data */
                u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
                u8Xfering = 0u;
                break;
            case 0x38u:                                             /* Arbitration Lost */
            default:                                               /* Unknow status */
                u8Ctrl = I2C_CTL_STO_SI;                         /* Clear SI and send STOP */
                u8Err = 1u;
                break;
        }
        I2C_SET_CONTROL_REG(i2c, u8Ctrl);                          /* Write controlbit to I2C_CTL register */
    }
    return u32rxLen;                                               /* Return bytes length that have been received */
}

使用特权

评论回复
玛尼玛尼哄| | 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

粉丝