0

我有两个设备 MPU6050 和 EEPROM 24C256。我可以单独写和读。但是,当我尝试从 MPU6050 读取数据并在同一会话中将数据写入 EEPROM 时,EEPROM 没有响应。我正在使用 mbed 操作系统库。我的问题是.. 是库、代码还是硬件问题?

MPU6050 读取序列: 在此处输入图像描述

EEPROM 写入页面顺序: 在此处输入图像描述

//代码

const char imuAddress = 0x68<<1;
const char imuDataAddress = 0x3B;
const char eepAddress = 0xA0;
const char data[3] = {1.1, 2.2, 3.3};
char acc[3];

//reading acceleration data from IMU
    while(true){
        i2c.start();
        if(i2c.write(imuAddress) != 1){
            i2c.stop();
            continue;
        }
        if(i2c.write(imuDataAddress) != 1){
            i2c.stop();
            continue;
        }
        i2c.start();
        if(i2c.write(imuAddress | 0x01) != 1){
            i2c.stop();
            continue;
        }
        for (int i = 0; i < 2; i++){
            i2c.read(1);   //read and respond ACK to continue
        }
        i2c.read(0);   //read and respond NACK to stop reading
        i2c.stop();
        break;
    }
//write data to EEPROM
    while(true){
            i2c.start();
            if(i2c.write(eepAddress) != 1){   //here is the problem (EEPROM does not respond)
                i2c.stop();
                continue;
            }
            if(i2c.write(0x00) != 1){
                i2c.stop();
                continue;
            }
            if(i2c.write(0x00) != 1){
                i2c.stop();
                continue;
            }
            bool ack = true;
            for(int i = 0; i < 3; i++){
                if(i2c.write(data[i]) != 1){
                    i2c.stop();
                    ack = false;
                    break;
                }
            }
            if (ack == true){
                i2c.stop();
                break;    
            }
        }
4

1 回答 1

0

我有几个初步的想法,但你可以使用示波器吗?奇怪的是,每个人都单独工作。这让我觉得这可能是过渡之间的问题。(可能尝试在每个之间延迟?另外,可能会删除初始读取中的停止,因为它们不是必需的)

我认为解决这个问题的最好方法是为每个单独运行的消息发布一个范围跟踪,并跟踪它们背靠背运行。

于 2020-03-23T18:09:05.573 回答