qazplm3218 发表于 2020-7-11 11:18:53

qazplm3218 发表于 2020-7-11 11:18
你好,帮我看下,这个代码哪里错误,要怎么修改?谢谢
void at24c1024_response(void)       //at24c1024应答 ...

这个是在24C02的基础上修改的

ts2000 发表于 2020-7-11 12:50:16

除了地址长度不一致,其它读写方法都是相同的

hujjj 发表于 2020-7-11 14:00:37

楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:
/*************************************************************
* 函数名:at24cxx_Wite_Data(uint8_t addr,uint8_t data)
* 输入参数:addr = 要写入的地址
*         data = 要写入的数据
* 输出参数:无
*************************************************************/
void at24cxx_Write_Data(uint16_t addr,uint8_t data) // 将数据data写入指定地址Addr
{

    SI2C_Start();                //开始I2C通讯
    SI2C_Send(0xA0);             //发送EEPROM器件写入地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr>>8);          //发送高8位地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr%256);         //发送低8位地址
    SI2CIsAck();               //等待应答
    SI2C_Send(data);             //发送数据
    SI2CIsAck();               //等待应答
    SI2C_Stop();               //结束I2C通讯
    delay_us(4);
}

/*************************************************************
* 函数名:at24cxx_Read_Data(uint8_t addr)
* 输入参数:addr = 要读取的地址
* 输出参数:data = 读出的数据
*************************************************************/
uint8_t at24cxx_Read_Data(uint16_t addr)            // 读指定地址Addr里的数据Data
{
    uint8_t data=0x00;
   
    SI2C_Start();                //开始I2C通讯
    SI2C_Send(0xA0);             //发送EEPROM器件地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr>>8);          //发送高8位地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr%256);         //发送低8位地址
    SI2CIsAck();               //等待应答

    SI2C_Start();
    SI2C_Send(0xA1);             //发送EEPROM器件读取地址
    SI2CIsAck();
   
    data = SI2C_Receive();       //读一字节数据
    SI2CDoAck();
    SI2C_Stop();
    delay_us(4);
    return data;
}

/*************************************************************
* 函数名:at24cxx_Page_Write(uint8_t addr,uint8_t *buff,uint8_t size)
* 输入参数:addr = 要写入的起始地址
*         *buff= 要写入的数组指针
*         size = 数组的长度
* 输出参数:无
*************************************************************/
void at24cxx_Page_Write(uint16_t addr,uint8_t *buff,uint8_t size) // 将数据buff数组写入指定起的始地址Addr
{
    uint8_t i;
       
    SI2C_Start();                //开始I2C通讯
    SI2C_Send(0xA0);             //发送EEPROM器件写入地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr>>8);          //发送高8位地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr%256);         //发送低8位地址
    SI2CIsAck();               //等待应答       
        for(i=0; i<size; i++){
      SI2C_Send(buff);      //发送数据
      SI2CIsAck();             //等待应答
    }
        SI2C_Stop();               //结束I2C通讯
    delay_us(4);
}

/*************************************************************
* 函数名:at24cxx_Page_Read(uint8_t addr)
* 输入参数:addr = 要读取的地址
* 输出参数:data = 读出的数据
*************************************************************/
uint8_t at24cxx_Page_Rea(uint16_t addr,uint8_t size)// 读指定起始地址Addr里的数据到buff
{
    uint8_t i,buff;
   
    SI2C_Start();                //开始I2C通讯
    SI2C_Send(0xA0);             //发送EEPROM器件地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr>>8);          //发送高8位地址
    SI2CIsAck();               //等待应答
    SI2C_Send(addr%256);         //发送低8位地址
    SI2CIsAck();               //等待应答

    SI2C_Start();
    SI2C_Send(0xA1);             //发送EEPROM器件读取地址
    SI2CIsAck();
    for(i=0; i<size; i++){
      buff = SI2C_Receive();//读一字节数据
      SI2CDoAck();
    }
        SI2C_Stop();
    delay_us(4);
    return *buff;
}

qazplm3218 发表于 2020-7-11 15:15:54

hujjj 发表于 2020-7-11 14:00
楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:

非常感谢您,我仔细看看

qazplm3218 发表于 2020-7-11 16:24:03

hujjj 发表于 2020-7-11 14:00
楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:

你好,能把完整的24C1024驱动发我参考下吗?私发也可以,6135135@qq.com

hujjj 发表于 2020-7-11 17:06:43

qazplm3218 发表于 2020-7-11 16:24
你好,能把完整的24C1024驱动发我参考下吗?私发也可以,

这个就是完整的驱动,我在AT24C32上使用的,不知道在AT24C1024上能否直接使用。这个驱动是直接调用I2C的基本功能,您可能需要对相应的函数名称稍作修改,或者参考这个代码,对您的驱动程序中写操作地址添加高低字节写入功能就行。

qazplm3218 发表于 2020-7-11 19:42:56

hujjj 发表于 2020-7-11 17:06
这个就是完整的驱动,我在AT24C32上使用的,不知道在AT24C1024上能否直接使用。这个驱动是直接调用I2C的 ...

好的,感谢

奏奏奏 发表于 2020-7-12 15:57:18

https://www.stmcu.org.cn/module/forum/thread-621388-1-1.html
我之前发过的帖子,标题是“[分享] 重新封装函数读写AT24CM02”

对于24C1024而言,已经地址寻址到17位,16位地址是不够用的,参考我这个帖子的处理,当然我劝你看HAL库的封装的函数

qazplm3218 发表于 2020-7-13 23:08:41

奏奏奏 发表于 2020-7-12 15:57
https://www.stmcu.org.cn/module/forum/thread-621388-1-1.html
我之前发过的帖子,标题是“[分享] 重新封 ...

你好,16位地址通过以下代码处理,已经测试通过,
SI2C_Send(addr>>8);          //发送高8位地址
SI2CIsAck();               //等待应答
SI2C_Send(addr%256);         //发送低8位地址

那17位地址改如何处理?
谢谢!

qazplm3218 发表于 2020-7-14 20:05:39

谢谢各位,已解决!
页: 1 [2]
查看完整版本: STM32F103驱动24C1024?