CH341的I2C通信問(wèn)題

你好!

最近使用CH341實(shí)現(xiàn)上位機(jī)與數(shù)據(jù)芯片I2C通信時(shí)遇到以下問(wèn)題:

1、使用USBIO_StreamI2C讀取數(shù)據(jù)時(shí)跳字節(jié)讀取。如數(shù)據(jù)為{48,50,76,87,48,49},讀取到2個(gè)數(shù)據(jù)為50,76,下一次讀到的是48,49;

2、使用USBIO_OpenDevice->USBIO_StreamI2C->USBIO_CloseDevice的順序讀取,為什么每次都是從上次讀取位置向后讀取,只有拔插設(shè)備后才從頭讀取?

望解答

這個(gè)問(wèn)題沒(méi)有回復(fù)的嗎

設(shè)備地址0X50,讀的時(shí)候USBIO_StreamI2C的iWriteBuffer首字節(jié)寫(xiě)的0XA1,第二個(gè)字節(jié)看其他貼說(shuō)寫(xiě)單元地址,但是無(wú)論寫(xiě)什么進(jìn)去都是跳字節(jié)讀取,也就是第一個(gè)字節(jié)數(shù)據(jù)讀取不到,能幫忙解決這個(gè)問(wèn)題嗎


您好,如上操作流程沒(méi)問(wèn)題,您的I2C外設(shè)本身是否需要填寫(xiě)I2C單元地址。如果需要?jiǎng)t沒(méi)問(wèn)題。芯片沒(méi)有緩存I2C數(shù)據(jù)的功能,每次執(zhí)行結(jié)果均為此次交互的內(nèi)容。這樣,您看下手里有沒(méi)有邏輯分析儀等工具,可以抓下如上通訊的波形,看下物理上返回的內(nèi)容是否有問(wèn)題。此外,也可以直接用我們提供的官方工具讀取對(duì)比。鏈接:http://www.findthetime.net/downloads/CH341EVT_ZIP.html?


后面通過(guò)嘗試發(fā)現(xiàn),只發(fā)送iWriteBuffer的首字節(jié)(0XA1)就能成功讀取。但是這樣就無(wú)法指定起始位置進(jìn)行讀取了?


您好,這個(gè)取決于您這邊的外設(shè)是否需要單獨(dú)輸入單元地址的。您看下手冊(cè)的描述,是否和當(dāng)前的代碼操作相匹配。


外設(shè)寄存器地址是16位應(yīng)該怎么輸入呢


您好,16位的I2C地址,發(fā)送緩沖區(qū)WriteBuffer,往后進(jìn)行填充即可。如下可作參考:

BOOL ? ?WINAPI ?CH341WriteEEPROM( ?// 向EEPROM中寫(xiě)入數(shù)據(jù)塊

? ? ULONG ? ? ? ? ? iIndex, ?// 指定CH341設(shè)備序號(hào)

? ? EEPROM_TYPE ? ? iEepromID, ?// 指定EEPROM型號(hào)

? ? ULONG ? ? ? ? ? iAddr, ?// 指定數(shù)據(jù)單元的地址

? ? ULONG ? ? ? ? ? iLength, ?// 準(zhǔn)備寫(xiě)出的數(shù)據(jù)字節(jié)數(shù)

? ? PUCHAR ? ? ? ? ?iBuffer ) ?// 指向一個(gè)緩沖區(qū),放置準(zhǔn)備寫(xiě)出的數(shù)據(jù)

{

? ? ULONG ? mLen;

? ? UCHAR ? mWrBuf[256];

? ? if ( iEepromID >= ID_24C01 && iEepromID <= ID_24C16 ) { ?// 7位-11位地址

? ? ? ? while ( iLength ) {

? ? ? ? ? ? mWrBuf[0] = (UCHAR)( 0xA0 | ( iAddr >> 7 ) & 0x0E ); ?// I2C目標(biāo)設(shè)備地址,最低位為0則進(jìn)行寫(xiě)操作

? ? ? ? ? ? mWrBuf[1] = (UCHAR)iAddr; ?// 低8位地址

? ? ? ? ? ? mLen = iEepromID >= ID_24C04 ? 16 - ( iAddr & 15 ) : 8 - ( iAddr & 7 ); ?// 不超過(guò)頁(yè)長(zhǎng)度

? ? ? ? ? ? if ( mLen > iLength ) mLen = iLength;

? ? ? ? ? ? CopyMemory( &mWrBuf[2], iBuffer, mLen );

? ? ? ? ? ? if ( CH341StreamI2C( iIndex, 2 + mLen, mWrBuf, 0, NULL ) == FALSE ) return( FALSE ); ?// 處理I2C數(shù)據(jù)流

? ? ? ? ? ? CH341SetDelaymS( iIndex, 10 ); ?// 設(shè)置10毫秒硬件異步延時(shí)

? ? ? ? ? ? iAddr += mLen;

? ? ? ? ? ? iLength -= mLen;

? ? ? ? ? ? iBuffer += mLen;

? ? ? ? }

? ? }

? ? else if ( iEepromID >= ID_24C32 && iEepromID <= ID_24C4096 ) { ?// 12位-19位地址

? ? ? ? while ( iLength ) {

? ? ? ? ? ? mWrBuf[0] = (UCHAR)( 0xA0 | ( iAddr >> 15 ) & 0x0E ); ?// I2C目標(biāo)設(shè)備地址,最低位為0則進(jìn)行寫(xiě)操作

? ? ? ? ? ? mWrBuf[1] = (UCHAR)( iAddr >> 8 ); ?// 高8位地址

? ? ? ? ? ? mWrBuf[2] = (UCHAR)iAddr; ?// 低8位地址

? ? ? ? ? ? mLen = iEepromID >= ID_24C512 ? 128 - ( iAddr & 127 ) : ( iEepromID >= ID_24C128 ? 64 - ( iAddr & 63 ) : 32 - ( iAddr & 31 ) ); ?// 不超過(guò)頁(yè)長(zhǎng)度

? ? ? ? ? ? if ( mLen > iLength ) mLen = iLength;

? ? ? ? ? ? CopyMemory( &mWrBuf[3], iBuffer, mLen );

? ? ? ? ? ? if ( CH341StreamI2C( iIndex, 3 + mLen, mWrBuf, 0, NULL ) == FALSE ) return( FALSE ); ?// 處理I2C數(shù)據(jù)流

? ? ? ? ? ? CH341SetDelaymS( iIndex, 10 ); ?// 設(shè)置10毫秒硬件異步延時(shí)

? ? ? ? ? ? iAddr += mLen;

? ? ? ? ? ? iLength -= mLen;

? ? ? ? ? ? iBuffer += mLen;

? ? ? ? }

? ? }

? ? else return( FALSE );

? ? return( TRUE );

}



只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频