注册 登录
查看: 1174|回复: 13

关于K60的I2C发送接收数据

[复制链接]
发表于 2013-8-28 11:55:40 | 显示全部楼层 |阅读模式
首先是山外的代码:
/* Do a repeated start */
    i2c_RepeatedStart(i2cn);

    /* Send Slave Address */
    i2c_write_byte(i2cn, ( SlaveID << 1) | MRSW );
    i2c_Wait(i2cn);

    /* Put in Rx Mode */
    i2c_PutinRxMode(i2cn);

    /* Turn off ACK since this is second to last byte being read*/
    i2c_DisableAck(i2cn); //不应答

    /* Dummy read 虚假读取*/
    result = I2C_D_REG(I2Cx[i2cn]);
    i2c_Wait(i2cn);

    /* Send stop since about to read last byte */
    i2c_Stop(i2cn);


一.在读取从机数据这里,I2Cx_C1,txak位写1,代表传输接收应答响应关闭,并且在整个过程中,这个位都为1,一直是关闭的,因为是一直关闭的关闭这个对之后传输数据没有影响么?没有应答了信号,第9个脉冲是不是代表,在使用了一次接收数据之后,从机接收器不能把SDA拉低发回应信息,那么,怎么确定8位数据过来了?靠IICIF这个位吗?

二.还有在读取DATA寄存器之前,一个虚假读取时什么意思。为什么要读2次?

三,同样的,在发送函数的时候,当data寄存器里面有了要发送的值后,I2Cx_S的rxak位也自动为1,关闭了接收ACK,并且没有写回来...
这2个位置到底怎么回事。和我知道的I2c时序不符合啊.
回复

使用道具 举报

发表于 2013-8-28 13:07:06 | 显示全部楼层
没听明白你的意思
不应答,就表示停止传输
回复 支持 反对

使用道具 举报

发表于 2013-8-28 13:10:50 | 显示全部楼层
i2c_Wait(i2cn);
就是等待 应答啊,脉冲高电平期间,都不拉低,就知道 应答,停止传输
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-28 14:17:32 | 显示全部楼层
风落小鱼 发表于 2013-8-28 13:07
没听明白你的意思
不应答,就表示停止传输

#define i2c_DisableAck(I2Cn)        I2C_C1_REG(I2Cx[I2Cn]) |= I2C_C1_TXAK_MASK

照你这样理解,就是,停止传输,就是通过对TXAK位写1实现(换句话说,txak为1,传输就不能进行)。可是在调用了,I2C_ReadAddr后,并没有去其他的操作来对TXAK写0。调用I2C_ReadAddr后,txak一直是1。可是呢,我这样写 I2C_WriteAddr(I2C0, 0x0f,0x0f, 0x01);
   aa  =  I2C_ReadAddr(I2C0, 0x0f, 0x0f);   后面还是呢个发出I2C数据波形。(TXAK一直为1的)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-28 14:21:22 | 显示全部楼层
风落小鱼 发表于 2013-8-28 13:10
i2c_Wait(i2cn);
就是等待 应答啊,脉冲高电平期间,都不拉低,就知道 应答,停止传输

说简单一点...就是...恩...txak,rxak两个位是拿来干什么的...理解不能...为什么在读取函数中要写1txak,并且在这之后没有请0炒作。
回复 支持 反对

使用道具 举报

发表于 2013-8-28 14:46:07 | 显示全部楼层
参禅、不说话 发表于 2013-8-28 14:21
说简单一点...就是...恩...txak,rxak两个位是拿来干什么的...理解不能...为什么在读取函数中要写1txak, ...

这个需要理解一下 I2C 协议。
TXAK  ,是接收数据后,MCU 是否 发送ACK应当信号。TXAK 为 1 ,则不发生应答。TXAK ,是发送应答哦,即接收数据才会发送应答,别以为 TX 就是发送模式!!!

RXAK,是在发送模式下,侦测是否 接收到应答信号。
回复 支持 反对

使用道具 举报

发表于 2013-8-28 14:47:18 | 显示全部楼层
参禅、不说话 发表于 2013-8-28 14:17
#define i2c_DisableAck(I2Cn)        I2C_C1_REG(I2Cx) |= I2C_C1_TXAK_MASK

照你这样理解,就是,停 ...

i2c_EnterRxMode ,进入接收模式的时候,会 清掉 TXAK 的啊!!!
回复 支持 反对

使用道具 举报

发表于 2013-8-28 14:59:20 | 显示全部楼层
I2C 里,发送应答信号的是 接收方哦
所以在 接收模式 下, 是用 TXAK ,而不是 RXAK ,别搞混
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-28 17:08:59 | 显示全部楼层
风落小鱼 发表于 2013-8-28 14:47
i2c_EnterRxMode ,进入接收模式的时候,会 清掉 TXAK 的啊!!!

有这个宏定义,但是在I2C的几个个函数中都没有使用到呢...就算把它注释掉也没影响。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-28 17:12:31 | 显示全部楼层
风落小鱼 发表于 2013-8-28 14:59
I2C 里,发送应答信号的是 接收方哦
所以在 接收模式 下, 是用 TXAK ,而不是 RXAK ,别搞混

在调用了一次接收,一次发送之后,这2个位置全部是1...没有相应语句来清0它们...你仔细看看...
回复 支持 反对

使用道具 举报

发表于 2013-8-28 17:15:56 | 显示全部楼层
参禅、不说话 发表于 2013-8-28 17:08
有这个宏定义,但是在I2C的几个个函数中都没有使用到呢...就算把它注释掉也没影响。

你好,风落小鱼 没说错的。
我们的例程是用 : i2c_PutinRxMode ,理由是 K60 作为 主机,我们的例程 仅仅读寄存器的值,只需要 接收一个值即可,接收一个值,是不需要应答,因而没有用到 i2c_EnterRxMode。

假如 是需要接收多个 值,就应该用 i2c_EnterRxMode
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-31 02:14:24 | 显示全部楼层
山外メ雲ジ 发表于 2013-8-28 17:15
你好,风落小鱼 没说错的。
我们的例程是用 : i2c_PutinRxMode ,理由是 K60 作为 主机,我们的例程 仅 ...

懂了,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-31 02:15:13 | 显示全部楼层
山外メ雲ジ 发表于 2013-8-28 17:15
你好,风落小鱼 没说错的。
我们的例程是用 : i2c_PutinRxMode ,理由是 K60 作为 主机,我们的例程 仅 ...

懂了,谢谢。
回复 支持 反对

使用道具 举报

发表于 2014-6-2 11:25:33 | 显示全部楼层
我的读出来怎么老是255啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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