纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 7322|回复: 9

USB_I2C作为slave使用,配置为7比特地址是A0,当配置为10bit地址是多少?

[复制链接]
发表于 2020-6-28 14:42:41 | 显示全部楼层 |阅读模式
I2C作为slave使用,配置为7比特地址是A0,当配置为10bit自身地址是多少?
回复

使用道具 举报

发表于 2020-6-28 14:48:53 | 显示全部楼层
Slave AddrWidth 为10bit ,只是改变地址的宽度,和从机地址没有直接关系的,原来确定地址是多少就是多少的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-28 14:50:32 | 显示全部楼层
hello 发表于 2020-6-28 14:48
Slave AddrWidth 为10bit ,只是改变地址的宽度,和从机地址没有直接关系的,原来确定地址是多少就是多少的


10位开始发高位2比特读盒子没有ACK回?写能回ACK
QQ图片20200628144943.jpg
这是读,发F1,之后没有收到ACK。写F0能返回ACK

硬件模式,主机写10位是先发F0,再发A0,结果正确。读发F1后没有ACK返回(上图所示),是否读写地址不同?
回复 支持 反对

使用道具 举报

发表于 2020-6-28 15:09:21 | 显示全部楼层
本帖最后由 hello 于 2020-6-28 15:12 编辑
lxk 发表于 2020-6-28 14:50
10位开始发高位2比特读盒子没有ACK回?写能回ACK

这是读,发F1,之后没有收到ACK。写F0能返回ACK

我这边使用示波器抓的波形读写都会有ACK(应答的)。
硬件接线
VCC<---->P2
SCL<---->P6
SDA<---->P8
GND<--->P20
QQ图片20200628145525.png
写入数据的波形
QQ图片20200628145655.png
QQ图片20200628145806.jpg
QQ图片20200628150036.jpg

读取的波形
QQ图片20200628150610.png
QQ图片20200628150841.png
























回复 支持 反对

使用道具 举报

发表于 2020-6-29 09:35:06 | 显示全部楼层
能否确认一下,USB_I2C 做为10bit Slave,如果地址仍然为A0,Master读操作满足协议 (F0,A0,F1),我们手上的盒子总会是发送 F1 没有 ACK的状态 F1.jpg
回复 支持 反对

使用道具 举报

发表于 2020-6-29 09:39:02 | 显示全部楼层
PC 这边的程序很简单,这样写行不行,能给个 10bit 操作的例子吗? Demo 里面都是 7 bit的:

uint8_t rw_buffer[65536] = { 0 };

int _tmain(int argc, _TCHAR* argv[])
{
        int ret, i;
        VII_INIT_CONFIG I2C_Config;
        VII_BOARD_INFO BoardInfo;
        uint16_t SlaveReadLen;

        //Scan device
        ret = VII_ScanDevice(1);
        if (ret <= 0) {
                printf("No device connect!\n");
                return ret;
        }

        //Open device
        ret = VII_OpenDevice(VII_USBI2C, 0, 0);
        if (ret != ERR_SUCCESS) {
                printf("Open device error!\n");
                return ret;
        }

        //Get product information
        ret = VII_ReadBoardInfo(0, &BoardInfo);
        if (ret != ERR_SUCCESS) {
                printf("Read board information error!\n");
                return ret;
        }
        else {
                printf("Product Name:%s\n", BoardInfo.ProductName);
                printf("Firmware Version:V%d.%d.%d\n", BoardInfo.FirmwareVersion[1], BoardInfo.FirmwareVersion[2], BoardInfo.FirmwareVersion[3]);
                printf("Hardware Version:V%d.%d.%d\n", BoardInfo.HardwareVersion[1], BoardInfo.HardwareVersion[2], BoardInfo.HardwareVersion[3]);
                printf("Serial Number:");
                for (i = 0; i < 12; i++) {
                        printf("%02X", BoardInfo.SerialNumber);
                }
                printf("\n");
        }

        //Initializes the device
        I2C_Config.AddrType = VII_ADDR_10BIT;
        I2C_Config.ClockSpeed = 400000;
        I2C_Config.ControlMode = VII_HCTL_SLAVE_MODE;
        I2C_Config.MasterMode = VII_SLAVE;
        I2C_Config.SubAddrWidth = VII_SUB_ADDR_NONE;
        I2C_Config.Addr = 0xA0;        //Must be set,very important
        ret = VII_InitI2C(VII_USBI2C, 0, 0, &I2C_Config);
        if (ret != ERR_SUCCESS) {
                printf("Initialize device error!\n");
                return ret;
        }

        while (1) {
                Sleep(5);
                SlaveReadLen = 1;
                ret = VII_SlaveReadBytes(VII_USBI2C, 0, 0, rw_buffer, &SlaveReadLen);
                if ((ret == ERR_SUCCESS) && (SlaveReadLen > 0)) {
                        ret = VII_SlaveWriteBytes(VII_USBI2C, 0, 0, rw_buffer, SlaveReadLen);
                        if (ret != ERR_SUCCESS) {
                                printf("Slave write data error!\n");
                                return ret;
                        }
                        printf("Slave read data %ld bytes, already rollback!\n", SlaveReadLen);
                        continue;
                }
                if (ret == ERR_READ_NO_DATA) {
                        continue;
                }
                else {
                        printf("Slave read data error!\n");
                        return ret;
                }
        }
        return 0;
}



补充内容 (2020-6-29 09:42):
这样的 LOOP BACK 小测试程序,我们用来测试 7bit 读写, 10bit 写都是对的,唯独 10bit 读就不对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-2 09:44:12 | 显示全部楼层
RobinLee 发表于 2020-6-29 09:39
PC 这边的程序很简单,这样写行不行,能给个 10bit 操作的例子吗? Demo 里面都是 7 bit的:

uint8_t rw ...

把时钟速率400K降低调试下,看下结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-2 09:44:14 | 显示全部楼层
RobinLee 发表于 2020-6-29 09:39
PC 这边的程序很简单,这样写行不行,能给个 10bit 操作的例子吗? Demo 里面都是 7 bit的:

uint8_t rw ...

把时钟速率400K降低调试下,看下结果。
回复 支持 反对

使用道具 举报

发表于 2020-7-2 10:19:57 | 显示全部楼层
lxk 发表于 2020-7-2 09:44
把时钟速率400K降低调试下,看下结果。

100K 和 400K 都测试过, 7bit 是没有问题的,10bit 主要的问题就是 F1,A0,F0 这个过程里,发F0,VTG210A 现象也是一样 ,没有给 ACK(图中ACK3)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-2 10:44:12 | 显示全部楼层
lxk 发表于 2020-7-2 09:44
把时钟速率400K降低调试下,看下结果。

我们这个10地址模式(暂不支持)的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 16:00 , Processed in 0.200196 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表