WCH沁恒单片机
直播中

发财树

11年用户 460经验值
私信 关注
[问答]

求助,使用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);/*********************************************************/


请各位不吝惜指教,谢谢!
  

回帖(3)

王建军

2022-7-1 10:39:40
您好,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接口测试单字节接收是否可成功。
举报

鲍淑君

2022-7-1 10:39:48
先谢谢 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设备地址及读写方向位,

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

李勇

2022-7-1 10:39:53
您好,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例程,路径:CH341PARVC下的CH341PAR.EXE
举报

更多回帖

发帖
×
20
完善资料,
赚取积分