打印
[i.MX]

iMX6SDL I2C控制器Slave Mode下如何在Master Read会话中发送数据

[复制链接]
1998|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
m15021324778|  楼主 | 2014-6-11 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
m15021324778|  楼主 | 2014-6-11 12:06 | 只看该作者
本帖最后由 m15021324778 于 2014-6-11 13:15 编辑

看不到回复,急啊,还是先附上部分代码供参考,下面的error是这边发送的异常,请帮忙看看:
1.        我们将I2C control置成Slave mode                    ===> 成功
2.        I2C bus上的Master发起一个读操作                  ===> 成功
3.        iMX6SDLRM的I2C控制器接收到
SA REG SA(1)                                       ===> 成功
   其中, SA为从设备地址, REG为一个字节的寄存器地址, SA(1)为带有读标志的从设备地址
4.        IMX6SDLRM侧, 尝试将I2C控制器的TX/RX方式转换成TX Mode ==> 成功, 但此时, I2C控制器已将DR中的值(SA(1))发送到I2C BUS上
5.        iMX6SDLRM尝试写入值到I2C控制器的DR寄存器     ====> 不成功, 通过示波器, 检测到SA(1)被发送到I2C BUS上, 期望写入的值未被写入
Step 1: Init I2C device as a Slave I2C
------------------------------------------------------------------------------------------
364        temp = I2CR_IEN;
365        temp &= ~I2CR_MSTA;
367        writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
-------------------------------------------------------------------------------------------
Step2: Receive SA and REG


Step3: Send data back when SA(1) is received
----------------------------------------------------------------------------------------------------------------
  if (i2sr & I2SR_SRW) { /* Slave transmit, master read */
        /* Set TX mode */
        temp = readb(i2c_imx->base + IMX_I2C_I2DR); //SA(1) is read

        //temp = i2c_imx->slave->regs[i2c_imx->slave->addr].val;   //ERROR: No data is actually written to DR If we write DR at this point.
        //writeb(temp, i2c_imx->base + IMX_I2C_I2DR);

     i2cr |= I2CR_MTX;
     writeb(i2cr, i2c_imx->base + IMX_I2C_I2CR);  // ERROR: at this point, the data of DR has been sent to I2C bus.

        temp = i2c_imx->slave->regs[i2c_imx->slave->addr].val;  //ERROR: Its value is invalid like writing DR like that.
        writeb(temp, i2c_imx->base + IMX_I2C_I2DR);
    }

使用特权

评论回复
板凳
FSL_TICS_Rita| | 2014-6-11 17:31 | 只看该作者
楼主你好,请问你是在什么平台上操作的?

使用特权

评论回复
地板
m15021324778|  楼主 | 2014-6-12 09:58 | 只看该作者
FSL_TICS_Rita 发表于 2014-6-11 17:31
楼主你好,请问你是在什么平台上操作的?

谢谢回复,这个应该跟在什么平台上操作是没有关系的。我们发现
当下面的代码被执行时,
i2cr |= I2CR_MTX;
writeb(i2cr, i2c_imx->base + IMX_I2C_I2CR);
DR中的(残留)数据就立即被送上I2C总线, 无视之前或之后对DR的写入值.
这与设计预期不符,这里该如何控制?我们预期是设置i2c为TX模式,写入I2DR寄存器后,数据才可以被送到I2C上。
另外,当iMX6SDLRM的I2C控制器被设成Slave Mode, 连接在I2C总线上, 请问, 你们有没有在Master Read会话中, 成功的发送数据的案例?

使用特权

评论回复
5
m15021324778|  楼主 | 2014-6-13 14:33 | 只看该作者
官网有I2C设为slave的用例么?linux平台用的。

使用特权

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

本版积分规则

43

主题

250

帖子

2

粉丝