NXP MCU 技术william hill官网
直播中

无人岛

9年用户 864经验值
擅长:嵌入式技术 制造/封装 控制/MCU
私信 关注
[问答]

如何在主模式下使用LPC824 I2C连续接收两个字节?

我想在主模式下使用 LPC824 I2C 连续接收两个字节。
一切正常,直到 LPC824(主机)接收到第一个字节(LPC 发送从机地址和从机确认,LPC 发送要读取的寄存器地址和从机确认,然后从机发送第一个字节)。然后,如果主机发送了 ACK,则从机将发送下一个字节,但 LPC824 未发送 ACK,一切都停止了。
如何让 LPC824 在收到第一个字节后发送 ACK?
查看波形,我发现当主机接收到第一个字节时,它只产生 8 个时钟脉冲,因此它缺少 ACK 位的时钟脉冲。
绿色:已确认从属寄存器地址
灰色:第一个字节(缺少来自主机的确认)
黄色:master 发送 NACK 并在一段时间后停止

你知道我能做些什么来解决这个问题吗?

回帖(1)

陈伟

2024-1-13 14:58:15
要在主模式下使用 LPC824 I2C 连续接收两个字节,您需要正确设置 LPC824 寄存器和操作序列。以下是使用主角色读取从机寄存器的示例代码:

```c
#include "board.h"
#include "i2c_common.h"

#define I2C_ADDR 0x50 // 从机地址
#define REG_ADDR 0x03 // 要读取的寄存器地址

int main(void)
{
    // 初始化 I2C
    I2C_Init(LPC_I2C);

    // 设置主机寄存器并开始传输
    I2C_M_SETUP_Type i2cCfg;
    uint8_t i2cData[2]; // 存储两个字节
    i2cData[0] = 0x00; // 第一个字节接收后发送 ACK
    i2cData[1] = 0x00; // 第二个字节接收后不发送 ACK
    i2cCfg.sl_addr7bit = I2C_ADDR;
    i2cCfg.tx_data = ®_ADDR;
    i2cCfg.tx_length = 1;
    i2cCfg.rx_data = i2cData;
    i2cCfg.rx_length = 2;
    i2cCfg.retransmissions_max = 3;
    I2C_MasterTransferData(LPC_I2C, &i2cCfg, I2C_TRANSFER_POLLING);

    // 关闭 I2C
    I2C_DeInit(LPC_I2C);
    return 0;
}
```

在上面的代码中,我们首先初始化 LPC824 I2C,并设置一个包含两个字节的缓冲区 `i2cData`。在 `i2cCfg` 中,我们设置从机地址和要读取的寄存器地址,并将 `tx_data` 设置为寄存器地址,以便将其发送到从机。然后,我们将 `rx_data` 设置为 `i2cData`,以便将从机返回的两个字节存储在缓冲区中。最后,我们调用 `I2C_MasterTransferData` 初始化主机传输。

注意如何设置两个字节的 ACK。在第一个字节接收后,主机需要发送 ACK 以接收下一个字节。在第二个字节接收后,主机不需要发送 ACK 并停止传输。在 `i2cData` 中,我们将第一个字节设置为 0x00,以使主机在接收后发送 ACK。我们将第二个字节设置为 0x00,以使主机在接收后停止传输。

最后,我们关闭 LPC824 I2C 并返回 0。确保您的硬件威廉希尔官方网站 和从机设备正确连接并启动。如果一切正常,`i2cData` 会包含从机返回的两个字节。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分