有關(guān)于CH341A I2C 與Arduino交換訊息的做法

請問有關(guān)于使用CH341A I2C 與arduino的資料交換的方法


我將arduino設定為Slave,并設定地址為0x08,使用USBIO_WriteI2C傳送字符或是數(shù)字都沒有問題。


同樣的,我還是將arduino設定為Slave, 地址設定0x08,并且設定為收到需求后傳送回資訊,但是一直無法收到從arduino的資訊。兩邊程式的寫法如下


Arduino

/*********************************************************/

#include

void setup() {

? Wire.begin(8);? ? ? ? ? ? ? ? // join i2c bus with address #8

? Wire.onRequest(requestEvent); // register event

}

void loop() {

? delay(100);

}

void requestEvent() {

? Wire.write("Hello "); // respond with message of 6 bytes

}

/*********************************************************/

PC

/*********************************************************/

UCHAR?SendData[1024]?=?{0};
UCHAR?ReceiveData[1024]?=?{0};

? SendData[0] = 0x08;

? SendData[1] = 0x00;


USBIO_StreamI2C(DeviceIndex,?2,?SendData,?6,?ReceiveData);

/*********************************************************/


請各位不吝惜指教,謝謝!

您好,CH341的I2C固定作為主機,是可以使用如上API直接和作為I2C從機的MCU通訊的。USBIO_WriteI2C接口可以成功,則:

BOOL ? ?WINAPI ?USBIO_StreamI2C( ?// 處理I2C數(shù)據(jù)流,2線接口,時鐘線為SCL引腳,數(shù)據(jù)線為SDA引腳(準雙向I/O),速度約56K字節(jié)

? ? ULONG ? ? ? ? ? iIndex, ?// 指定CH341設備序號

? ? ULONG ? ? ? ? ? iWriteLength, ?// 準備寫出的數(shù)據(jù)字節(jié)數(shù)

? ? PVOID ? ? ? ? ? iWriteBuffer, ?// 指向一個緩沖區(qū),放置準備寫出的數(shù)據(jù),首字節(jié)通常是I2C設備地址及讀寫方向位

? ? ULONG ? ? ? ? ? iReadLength, ?// 準備讀取的數(shù)據(jù)字節(jié)數(shù)

? ? PVOID ? ? ? ? ? oReadBuffer ); ?// 指向一個緩沖區(qū),返回后是讀入的數(shù)據(jù)

接口函數(shù)中的iWriteBuffer需要和USBIO_WriteI2C的設備地址和單元地址相同。建議Arduino代碼加入串口調(diào)試,先定位問題出在Arduino的發(fā)送還是接收方向。也可以使用USBIO_ReadI2C接口測試單字節(jié)接收是否可成功。


先謝謝 TECH39的回覆。?

我測試使用USBIO_ReadI2C來接收來自于Arduino的單個字節(jié)。

收到的值都剛好是Arduino所發(fā)送的值的一半。


程式如下:

Arduino

/*********************************************************/

#include

void setup() {

? Wire.begin(8);? ? ? ? ? ? ? ? // join i2c bus with address #0x08

? Wire.onRequest(requestEvent);?

}


void loop() {

? delay(100);

}


void requestEvent() {

? Wire.write(0x10);?

}

/*********************************************************/

PC

/*********************************************************/

UCHAR DeviceIndex = 0x00;

UCHAR mDataAddr = 0x08;

UCHAR ReceiveData[1024] = {0};

USBIO_ReadI2C(DeviceIndex, mDataAddr, 0x00, ReceiveData);

//ReceiveData[0] = 0x08;

/*********************************************************/


我使用兩個arduino來傳遞訊息是正常的,我不確定我是否正確的使用USBIO_ReadI2C這個函數(shù),謝謝!


另外,我想要請教一下

PVOID? ? ? ? ? ?iWriteBuffer,? // 指向一個緩沖區(qū),放置準備寫出的數(shù)據(jù),首字節(jié)通常是I2C設備地址及讀寫方向位,

其中的讀寫方向的意思和撰寫的方法,謝謝!



您好,USBIO_ReadI2C和USBIO_WriteI2C的使用方法并沒有區(qū)別,其中接口函數(shù)中iDevice的低7位用于指定I2C設備地址,iAddr為數(shù)據(jù)單元地址,如EEPROM的存儲單元偏移地址。以I2C協(xié)議7位設備地址為例,I2C協(xié)議地址后還會跟1個最低位來表示讀寫方向位,最低位1表示讀,0表示寫。USBIO_ReadI2C和USBIO_WriteI2C會自動生成方向位,上述例子,使用0x08地址沒有問題。

若使用USB_StreamI2C函數(shù)中, iWriteBuffer的首字節(jié)需要包含地址+讀寫方向位,因此當設備地址為0x08時,I2C寫首字節(jié)應為:0x08 << 1 | 0x00 = 0x10,I2C讀首字節(jié)應為:0x08 << 1 | 0x01 = 0x11。

此外建議您使用CH341EVT中的庫和工程軟件,內(nèi)有各平臺完整工程,可直接使用或進行二次開發(fā)。

鏈接地址為:http://www.findthetime.net/downloads/CH341EVT_ZIP.html?,可優(yōu)先使用VC例程,路徑:CH341PAR\VC下的CH341PAR.EXE



感謝TECH39的說明,讓我的思路清楚很多。

接下來我會開始學習附件中的代碼。


只有登錄才能回復,可以選擇微信賬號登錄

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