NXP MCU 技术论坛
直播中

安立路

9年用户 886经验值
私信 关注
[问答]

求分享实现一个i2c演示示例来接收来自传感器的数据

我正在实现一个 i2c 演示示例来接收来自传感器的数据,
s32k144 将充当主机,传感器充当从机,
我尝试使用示例代码,但我发现的只是主发送器代码,
是否有可用的简单主接收器代码?

回帖(1)

周煌煦

2024-1-4 11:24:42
以下是一个基本的主接收器代码:

```
#include "s32k144.h"
#include "i2c.h"

#define I2C_SLAVE_ADDR 0x50 // I2C 从机地址
#define I2C_DATA_SIZE 6     // 期望的数据大小

uint8_t i2c_rx_data[I2C_DATA_SIZE];

void i2c_init(void)
{
    I2C0->F |= I2C_F_MULT(0x01) | I2C_F_ICR(0x1F); // 设置 I2C 时钟分频
    I2C0->C1 |= I2C_C1_IICEN_MASK;                // 启用 I2C 模块
}

void i2c_receive_data(uint8_t slave_addr, uint8_t *data, uint8_t data_size)
{
    I2C0->C1 |= I2C_C1_TX_MASK;  // 发送 START bit
    I2C0->D = (slave_addr << 1) | 0x01; // 发送从地址和读位
    while (!(I2C0->S & I2C_S_BUSY_MASK)); // 等待总线被占用
   
    for (int i = 0; i < data_size - 1; i++)
    {
        I2C0->C1 &= ~I2C_C1_TX_MASK;            // 切换到接收模式
        I2C0->C1 |= I2C_C1_TXAK_MASK;           // 总线空闲时手动 ACK
        data[i] = I2C0->D;                      // 接收数据
        while (!(I2C0->S & I2C_S_IICIF_MASK));   // 等待接收完成
        I2C0->S |= I2C_S_IICIF_MASK;             // 清除中断标志位
    }
   
    I2C0->C1 &= ~I2C_C1_TX_MASK;     // 切换到接收模式
    I2C0->C1 &= ~I2C_C1_TXAK_MASK;  // 总线空闲时自动 ACK
    data[data_size - 1] = I2C0->D;  // 接收最后一个字节
    I2C0->C1 |= I2C_C1_TX_MASK;     // 发送 STOP bit
}

int main(void)
{
    i2c_init();
    i2c_receive_data(I2C_SLAVE_ADDR, i2c_rx_data, I2C_DATA_SIZE);
   
    // 处理接收到的数据
   
    return 0;
}
```

该代码主要是发送一个START bit(产生Start信号),然后将从机地址和读位发送到I2C总线上,进入接收模式并手动或自动发送ACK信号。并且重复接收数据并处理中间块,最后接收数据并停止。请注意,这里的i2c_rx_data是一个大小为6的数组,因为我们期望接收6个字节的数据。不同的传感器可能需要不同的字节数,因此请根据您使用的传感器进行相应更改。 如果仍然存在问题,可以提供更多信息和代码。
举报

更多回帖

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