一年前咨詢過,因?yàn)閕ic 從機(jī)為MCU硬件,在處理主機(jī)讀取數(shù)據(jù)時,速度比較慢,會出現(xiàn)連續(xù)讀取數(shù)據(jù)時,在上一byte的ACK回復(fù)完后1個clk時間內(nèi)不能釋放scl的問題。
現(xiàn)在自己重新寫讀取函數(shù)實(shí)現(xiàn)了,如下:
但是此函數(shù)因?yàn)閕ic數(shù)據(jù)流包大小被限制在32byte,所以當(dāng)我的讀取數(shù)據(jù)連續(xù)超過12個byte時,iic數(shù)據(jù)流超出了32個字節(jié)
當(dāng)我使用兩個數(shù)據(jù)流寶來實(shí)現(xiàn)時,兩個包之間的時間有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;? // 產(chǎn)生起始位
? ? ? ? ? ? mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_OUT | 2;? //??
? ? ? ? ? ? mBuffer[i++] = addr;? //?
? ? ? ? ? ? mBuffer[i++] = reg;? //?
? ? ? ? ? ? mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_STA;? // 產(chǎn)生起始位
? ? ? ? ? ? mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_OUT;? //??
? ? ? ? ? ? mBuffer[i++] = (byte)(addr + 1);? // 產(chǎn)生起始位
? ? ? ? ? ? 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;? // 輸入數(shù)據(jù),位5-位0為長度,0長度則只接收一個字節(jié)并發(fā)送無應(yīng)答
? ? ? ? ? ? }
? ? ? ? ? ? mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_US + 4;? // 延時4us
? ? ? ? ? ? mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_IN;? // 輸入數(shù)據(jù),位5-位0為長度,0長度則只接收一個字節(jié)并發(fā)送無應(yīng)答
? ? ? ? ? ? mBuffer[i++] = USBIOXdll.mCH341A_CMD_I2C_STM_END;? // 當(dāng)前包提前結(jié)束
? ? ? ? ? ? mLength = i;
? ? ? ? ? ? mInLen = 0;
? ? ? ? ? ? USBIOXdll.USBIO_WriteRead(iIndex, mLength, mBuffer, 0x3F, 1, ref mInLen, mBuffer);? // 寫出數(shù)據(jù)塊
? ? ? ? ? ? return true;
? ? ? ? }