树莓派pico I2C读写AT24C02

问题遇到的现象和发生背景

我正在学习pico,用I2C读写AT24C02时遇到一些问题
我希望在地址0x00写入数据0x12,代码如下,但用串口助手读出来的数据却不一样
有人用过树莓派pico的sdk吗?
AT24C02模块是在淘宝买的,三个引脚接地,写地址应当是0xA0,读地址应当是A1。

代码
#include 
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "pico/binary_info.h"

// I2C defines
// This example will use I2C0 on GPIO8 (SDA) and GPIO9 (SCL) running at 400KHz.
// Pins can be changed, see the GPIO function select table in the datasheet for information on GPIO assignments
#define I2C_PORT i2c0
#define I2C_SDA 8
#define I2C_SCL 9

#define ADDR_W 0xA0 //AT24写地址
#define ADDR_R 0xA1 //AT24读地址


int main()
{
    stdio_init_all();

    // I2C Initialisation. Using it at 400Khz.
    i2c_init(I2C_PORT, 400*1000);
    
    gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
    gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
    gpio_pull_up(I2C_SDA);
    gpio_pull_up(I2C_SCL);

    //bi_decl(bi_2pins_with_func(I2C_SDA,I2C_SCL,GPIO_FUNC_I2C));

    uint8_t buf[2]={0x00,0x12};
    uint8_t buffer[1];
    uint8_t reg_addr=0x00;

    i2c_write_blocking(I2C_PORT,ADDR_W,buf,2,false);//写入数据


    printf("completed");
    //puts("Hello, world!");
    while (1)
    {


        i2c_write_blocking(I2C_PORT,ADDR_W,®_addr,1,true);//写入要读取的地址
        i2c_read_blocking(I2C_PORT,ADDR_R,buffer,1,false);//读取数据

        printf("now output results\n");
        printf("%d\n",buffer[0]);
        printf("completed\n");
        sleep_ms(1000);
    }

    return 0;
}


你是否已经检查过 AT24C02 的配置是否正确?比如说,内存地址是否是 0x00,写保护设置是否正确等。

另外,你可以尝试在写入数据之后,立即读取该数据,看看是否和你写入的数据一致。这将有助于排除写入数据失败的可能性。

你也可以使用串口助手打印出 I2C 传输的日志信息,看看是否有其他的错误信息。


如果以上方法都没有帮助,可以尝试使用其他的

I2C 工具(比如说 i2c-tools)来测试,这将有助于排除硬件问题。

此外,你可以尝试使用 i2c_read_blocking() 和 i2c_write_blocking() 函数的返回值来判断 I2C 传输是否成功。如果函数返回 -1,则表明传输失败。你可以在出现问题时,打印出这些函数的返回值,以帮助排查问题。

首先,我们应该检查一下我们在程序中给出的AT24C02写入地址和读地址是否正确,两个都是0xA0,如果不正确,先手动去查阅一下AT24C02的规格书,再去改正它。

其次,可以尝试添加i2c_start/i2c_stop函数来解决读写AT24C02的问题,不仅如此,也可以增加一些延迟来解决响应不及时的问题。

最后,如果仍然无法解决读写2C02的问题,你可以尝试去物联网相关的论坛或者技术社区寻求帮助,也可以尝试自己调试,熟悉I2C协议和AT24C02的操作流程。

你可以尝试使用pico sdk提供的I2C库函数来读写AT24C02来确保代码的正确性。另外,你可以检查一下您的AT24C02模块是否已经正确接好,确保地址和引脚接口是否正确。

关于pico中的ic2的读写操作,可以参考一些资料,我这里给你找了一些,对你应该有帮助的,都是具体的操作实现实例。你可以照着一步一步实现即可。希望对你解决当前的问题能有所帮助。
资料链接如下:
(1)https://blog.csdn.net/xiaoqi976633690/article/details/123804128
(2)PICO AHT10温湿度传感器i2C读取实例:
https://my.oschina.net/VenusV/blog/5583546