本帖最后由 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);
}
|