MSPM0G3507: 硬件I2C 发送延迟

Part Number: MSPM0G3507

今天使用硬件I2C,打算写一下poll方式的硬件i2c发送,这边发送100个数据,中间有1.7ms的延迟,总耗时为0.2ms 

时钟频率为32mhz iic速度为100khz,如果使用官方例程的话同样也有1.7ms的延迟,希望有官方可以解答一下。

以及如何避免这个问题。

附代码

int8_t I2C_Send_Poll(I2C_Regs *i2c,uint32_t targetAddr,uint8_t set_reg,uint8_t *buffer,uint16_t count,int8_t use_reg_flag)  //如果返回为-1为异常0为正常
{
    //可以在这边在加一个计数时间的延迟,有时间在搞吧.
    int timeout=50000;  //时间延迟函数
    uint32_t gTxCount=7,toolong=0; //保存一下填充了多少数据到fifo里面

    //先判断一波长不长如果不长就不进入一直填fifo的程序了

    if (gTxCount < count) {
        toolong=1;
    } else {
        toolong=0;
    }

    if (use_reg_flag) { //如果不使用reg的话
        DL_I2C_transmitControllerData(i2c, set_reg); //先填充reg到fifo剩下的就无所谓啦!
    }

    gTxCount=DL_I2C_fillControllerTXFIFO(i2c, buffer, count); // 填充待发数据到FIFO 同时保存一下已经填充了多少数据进去

    while (!(DL_I2C_getControllerStatus(i2c) & DL_I2C_CONTROLLER_STATUS_IDLE)); // 等待I2C总线空闲

    DL_I2C_startControllerTransfer(i2c, targetAddr,DL_I2C_CONTROLLER_DIRECTION_TX,count); // 发送数据

    if (toolong) {
        while (gTxCount<count) {  //在这里等待,如果没发送完数据就一直填数据进去
            // if (DL_I2C_getControllerStatus(i2c)&DL_I2C_CONTROLLER_STATUS_ERROR) {
            //     DL_I2C_flushControllerTXFIFO(i2c);
            //     return -1; //上一次地址没有应答    
            // }
            // if (DL_I2C_getControllerStatus(i2c) & DL_I2C_CONTROLLER_STATUS_ARBITRATION_LOST) {
            //     DL_I2C_flushControllerTXFIFO(i2c);
            //     return -2;//总线仲裁失败
            // }
            if (DL_I2C_isControllerTXFIFOEmpty (i2c)) {
              gTxCount+=DL_I2C_fillControllerTXFIFO(i2c,&(buffer[gTxCount]), count-gTxCount);
              //z++;
            }
        }
    }
    what=gTxCount;
    while (DL_I2C_getControllerStatus(i2c) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS); //等待总线空闲发送成功

    if (DL_I2C_getControllerStatus(i2c)&DL_I2C_CONTROLLER_STATUS_ERROR) {
        DL_I2C_flushControllerTXFIFO(i2c);
        return -1; //上一次地址没有应答    
    }
    if (DL_I2C_getControllerStatus(i2c) & DL_I2C_CONTROLLER_STATUS_ARBITRATION_LOST) {
        DL_I2C_flushControllerTXFIFO(i2c);
        return -2;//总线仲裁失败
    }
    DL_I2C_flushControllerTXFIFO(i2c);
    return 0;
}

附图,黄色的点为ACK。

使用官方例程

使用我写的函数