有关于CH341A I2C 与Arduino交换讯息的做法

请问有关于使用CH341A I2C 与arduino的资料交换的方法


我将arduino设定为Slave,并设定地址为0x08,使用USBIO_WriteI2C传送字符或是数字都没有问题。


同样的,我还是将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数据流,2线接口,时钟线为SCL引脚,数据线为SDA引脚(准双向I/O),速度约56K字节

    ULONG           iIndex,  // 指定CH341设备序号

    ULONG           iWriteLength,  // 准备写出的数据字节数

    PVOID           iWriteBuffer,  // 指向一个缓冲区,放置准备写出的数据,首字节通常是I2C设备地址及读写方向位

    ULONG           iReadLength,  // 准备读取的数据字节数

    PVOID           oReadBuffer );  // 指向一个缓冲区,返回后是读入的数据

接口函数中的iWriteBuffer需要和USBIO_WriteI2C的设备地址和单元地址相同。建议Arduino代码加入串口调试,先定位问题出在Arduino的发送还是接收方向。也可以使用USBIO_ReadI2C接口测试单字节接收是否可成功。


先谢谢 TECH39的回覆。 

我测试使用USBIO_ReadI2C来接收来自于Arduino的单个字节。

收到的值都刚好是Arduino所发送的值的一半。


程式如下:

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这个函数,谢谢!


另外,我想要请教一下

PVOID           iWriteBuffer,  // 指向一个缓冲区,放置准备写出的数据,首字节通常是I2C设备地址及读写方向位,

其中的读写方向的意思和撰写的方法,谢谢!



您好,USBIO_ReadI2C和USBIO_WriteI2C的使用方法并没有区别,其中接口函数中iDevice的低7位用于指定I2C设备地址,iAddr为数据单元地址,如EEPROM的存储单元偏移地址。以I2C协议7位设备地址为例,I2C协议地址后还会跟1个最低位来表示读写方向位,最低位1表示读,0表示写。USBIO_ReadI2C和USBIO_WriteI2C会自动生成方向位,上述例子,使用0x08地址没有问题。

若使用USB_StreamI2C函数中, iWriteBuffer的首字节需要包含地址+读写方向位,因此当设备地址为0x08时,I2C写首字节应为:0x08 << 1 | 0x00 = 0x10,I2C读首字节应为:0x08 << 1 | 0x01 = 0x11。

此外建议您使用CH341EVT中的库和工程软件,内有各平台完整工程,可直接使用或进行二次开发。

链接地址为:http://www.wch.cn/downloads/CH341EVT_ZIP.html ,可优先使用VC例程,路径:CH341PAR\VC下的CH341PAR.EXE



感谢TECH39的说明,让我的思路清楚很多。

接下来我会开始学习附件中的代码。


只有登录才能回复,可以选择微信账号登录