你好,帮我看下,这个代码哪里错误,要怎么修改?谢谢
void at24c1024_response(void) //at24c1024应答 ...
这个是在24C02的基础上修改的 除了地址长度不一致,其它读写方法都是相同的 楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:
/*************************************************************
* 函数名: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;
}
hujjj 发表于 2020-7-11 14:00
楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:
非常感谢您,我仔细看看 hujjj 发表于 2020-7-11 14:00
楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:
你好,能把完整的24C1024驱动发我参考下吗?私发也可以,6135135@qq.com qazplm3218 发表于 2020-7-11 16:24
你好,能把完整的24C1024驱动发我参考下吗?私发也可以,
这个就是完整的驱动,我在AT24C32上使用的,不知道在AT24C1024上能否直接使用。这个驱动是直接调用I2C的基本功能,您可能需要对相应的函数名称稍作修改,或者参考这个代码,对您的驱动程序中写操作地址添加高低字节写入功能就行。 hujjj 发表于 2020-7-11 17:06
这个就是完整的驱动,我在AT24C32上使用的,不知道在AT24C1024上能否直接使用。这个驱动是直接调用I2C的 ...
好的,感谢 https://www.stmcu.org.cn/module/forum/thread-621388-1-1.html
我之前发过的帖子,标题是“[分享] 重新封装函数读写AT24CM02”
对于24C1024而言,已经地址寻址到17位,16位地址是不够用的,参考我这个帖子的处理,当然我劝你看HAL库的封装的函数
奏奏奏 发表于 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位地址改如何处理?
谢谢! 谢谢各位,已解决!
页:
1
[2]