今天使用硬件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。
使用官方例程
使用我写的函数