打印

读一个8bit 地址的I2C设备

[复制链接]
798|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stly|  楼主 | 2019-11-16 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请教CyUsb3014的I2C读写
cypress提供了一个CyU3PI2cPreamble_t结构来操作I2C,根据他的说明,我在代码中想读一个8bit  地址的I2C设备

使用特权

评论回复
沙发
llljh| | 2019-11-16 13:53 | 只看该作者
没明白你说的什么

使用特权

评论回复
板凳
stly|  楼主 | 2019-11-16 13:57 | 只看该作者
比如一个设备的DevAddress 为0xaa,我想读他的地址0xf0

使用特权

评论回复
地板
dingy| | 2019-11-16 14:00 | 只看该作者
有代码吗

使用特权

评论回复
5
stly|  楼主 | 2019-11-16 14:04 | 只看该作者
CyU3PI2cPreamble_t preamble;
devAddr = 0xaa;
byteAddress = 0xf0;
preamble.length  = 3;
preamble.buffer[0] = devAddr;
preamble.buffer[1] = (uint8_t)(byteAddress);
preamble.buffer[2] = devAddr + 1;
preamble.ctrlMask  = 0x0002;
status = CyU3PI2cReceiveBytes (&preamble, buffer, 1, NULL);
if(status != CY_U3P_SUCCESS)
{
        return status;
}

看上去像是返回值status 没有成功,不知道问题在哪

使用特权

评论回复
6
pengf| | 2019-11-16 14:10 | 只看该作者
ctrlMask  这个参数,改下这个值

使用特权

评论回复
7
stly|  楼主 | 2019-11-16 14:14 | 只看该作者
没有效果,示波器上测试I2C SDA线上好像只有第一个DevAddr,后面的就都没有了

使用特权

评论回复
8
renyaq| | 2019-11-16 14:17 | 只看该作者
硬件上连接应该没有问题吧

使用特权

评论回复
9
stly|  楼主 | 2019-11-16 14:27 | 只看该作者
换成之前的USB2.0芯片的话,I2C就可以正常读写了,是我代码写错了么???

使用特权

评论回复
10
xxrs| | 2019-11-16 14:33 | 只看该作者

楼主下载FX3 SDK (http://www.cypress.com/?rID=57990)后
关于I2C的使用,请参考路径下C:\Cypress\EZ-USB FX3 SDK\1.2\firmware\serialif_examples的例子cyfxusbi2cdmamode和cyfxusbi2cregmode。

使用特权

评论回复
11
houcs| | 2019-11-16 14:35 | 只看该作者

在I2C Register模式下,读写代码可参考如下:

        if (isRead)
        {
            /* Update the preamble information. */
            preamble.length    = 4;
            preamble.buffer[0] = devAddr;
            preamble.buffer[1] = (uint8_t)(byteAddress >> 8);
            preamble.buffer[2] = (uint8_t)(byteAddress & 0xFF);
            preamble.buffer[3] = (devAddr | 0x01);
            preamble.ctrlMask  = 0x0004;

            status = CyU3PI2cReceiveBytes (&preamble, buffer, (pageCount == 1) ? resCount : glI2cPageSize, 0);
            if (status != CY_U3P_SUCCESS)
            {
                return status;
            }
        }
        else /* Write */
        {
            /* Update the preamble information. */
            preamble.length    = 3;
            preamble.buffer[0] = devAddr;
            preamble.buffer[1] = (uint8_t)(byteAddress >> 8);
            preamble.buffer[2] = (uint8_t)(byteAddress & 0xFF);
            preamble.ctrlMask  = 0x0000;

            status = CyU3PI2cTransmitBytes (&preamble, buffer, (pageCount == 1) ? resCount : glI2cPageSize, 0);
            if (status != CY_U3P_SUCCESS)
            {
                return status;
            }

使用特权

评论回复
12
ousj| | 2019-11-16 14:38 | 只看该作者
可以到官网建一个case,关于建case

使用特权

评论回复
13
xxrs| | 2019-11-16 14:41 | 只看该作者

CyU3PReturnStatus_t
SensorRead(
        uint8_t addr,
        uint8_t *buf)
{
    CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;
    CyU3PI2cPreamble_t preamble;



    preamble.buffer[0] = SENSOR_ADDR_WR ;       /*  Mask out the transfer type bit. */
    preamble.buffer[1] = addr;
    preamble.buffer[2] = SENSOR_ADDR_RD;
    preamble.length    = 3;
    preamble.ctrlMask  = 0x0002;                                /*  Send start bit after third byte of preamble. */

    apiRetStatus = CyU3PI2cReceiveBytes (&preamble, buf, 1, 0);
    SensorI2CAccessDelay (apiRetStatus);

    return apiRetStatus;
}
更多操作

使用特权

评论回复
14
dingy| | 2019-11-16 14:44 | 只看该作者
直接设置iic 或者用io口模拟按照时序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

433

主题

7058

帖子

0

粉丝