一年前咨询过,因为iic 从机为MCU硬件,在处理主机读取数据时,速度比较慢,会出现连续读取数据时,在上一byte的ACK回复完后1个clk时间内不能释放scl的问题。
现在自己重新写读取函数实现了,如下:
但是此函数因为iic数据流包大小被限制在32byte,所以当我的读取数据连续超过12个byte时,iic数据流超出了32个字节
当我使用两个数据流宝来实现时,两个包之间的时间有200-1200us间隔不等,请问有好的解决办法没有?
public bool MulReadIIC(UInt32 iIndex, byte addr, byte reg, Byte[] data, uint data_Len)
{
byte i = 0;
Byte[] mBuffer = new Byte[64];
UInt32 mLength, mInLen;
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STREAM; // 命令码
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_STA; // 产生起始位
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_OUT | 2; //
mBuffer[i++] = addr; //
mBuffer[i++] = reg; //
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_STA; // 产生起始位
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_OUT; //
mBuffer[i++] = (byte)(addr + 1); // 产生起始位
for(byte count=0;count< data_Len-1; count++)
{
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_US + 4; // 延时4us
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_IN + 1; // 输入数据,位5-位0为长度,0长度则只接收一个字节并发送无应答
}
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_US + 4; // 延时4us
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_IN; // 输入数据,位5-位0为长度,0长度则只接收一个字节并发送无应答
mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_END; // 当前包提前结束
mLength = i;
mInLen = 0;
USBIOXdll.USBIO_WriteRead(iIndex, mLength, mBuffer, 0x3F, 1, ref mInLen, mBuffer); // 写出数据块
return true;
}