你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103驱动24C1024?

[复制链接]
qazplm3218 提问时间:2020-7-9 20:23 /
24C1024与24C02的驱动是否通用?我用24C02的驱动(模拟IO口)向24C1024的0x01地址写入数据0x01,读写都不正常?谁能提供24C1024的驱动参考下,谢谢!

收藏 评论19 发布时间:2020-7-9 20:23

举报

19个回答
老牛洋车 回答时间:2020-7-11 14:00:37
楼上正解。
可参考我的代码,分别是读写一个字节,和读写一页:
  1. /*************************************************************
  2. * 函数名:  at24cxx_Wite_Data(uint8_t addr,uint8_t data)
  3. * 输入参数:addr = 要写入的地址
  4. *           data = 要写入的数据
  5. * 输出参数:无
  6. *************************************************************/
  7. void at24cxx_Write_Data(uint16_t addr,uint8_t data) // 将数据data写入指定地址Addr
  8. {

  9.     SI2C_Start();                //开始I2C通讯
  10.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址
  11.     SI2CIsAck();                 //等待应答
  12.     SI2C_Send(addr>>8);          //发送高8位地址
  13.     SI2CIsAck();                 //等待应答
  14.     SI2C_Send(addr%256);         //发送低8位地址
  15.     SI2CIsAck();                 //等待应答
  16.     SI2C_Send(data);             //发送数据
  17.     SI2CIsAck();                 //等待应答
  18.     SI2C_Stop();                 //结束I2C通讯
  19.     delay_us(4);
  20. }

  21. /*************************************************************
  22. * 函数名:  at24cxx_Read_Data(uint8_t addr)
  23. * 输入参数:addr = 要读取的地址
  24. * 输出参数:data = 读出的数据
  25. *************************************************************/
  26. uint8_t at24cxx_Read_Data(uint16_t addr)            // 读指定地址Addr里的数据Data
  27. {
  28.     uint8_t data=0x00;
  29.    
  30.     SI2C_Start();                //开始I2C通讯
  31.     SI2C_Send(0xA0);             //发送EEPROM器件地址
  32.     SI2CIsAck();                 //等待应答
  33.     SI2C_Send(addr>>8);          //发送高8位地址
  34.     SI2CIsAck();                 //等待应答
  35.     SI2C_Send(addr%256);         //发送低8位地址
  36.     SI2CIsAck();                 //等待应答

  37.     SI2C_Start();
  38.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址
  39.     SI2CIsAck();
  40.    
  41.     data = SI2C_Receive();       //读一字节数据
  42.     SI2CDoAck();
  43.     SI2C_Stop();
  44.     delay_us(4);
  45.     return data;
  46. }

  47. /*************************************************************
  48. * 函数名:  at24cxx_Page_Write(uint8_t addr,uint8_t *buff,uint8_t size)
  49. * 输入参数:addr = 要写入的起始地址
  50. *           *buff= 要写入的数组指针
  51. *           size = 数组的长度
  52. * 输出参数:无
  53. *************************************************************/
  54. void at24cxx_Page_Write(uint16_t addr,uint8_t *buff,uint8_t size) // 将数据buff数组写入指定起的始地址Addr
  55. {
  56.     uint8_t i;
  57.        
  58.     SI2C_Start();                //开始I2C通讯
  59.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址
  60.     SI2CIsAck();                 //等待应答
  61.     SI2C_Send(addr>>8);          //发送高8位地址
  62.     SI2CIsAck();                 //等待应答
  63.     SI2C_Send(addr%256);         //发送低8位地址
  64.     SI2CIsAck();                 //等待应答       
  65.         for(i=0; i<size; i++){
  66.         SI2C_Send(buff[i]);      //发送数据
  67.         SI2CIsAck();             //等待应答
  68.     }
  69.         SI2C_Stop();                 //结束I2C通讯
  70.     delay_us(4);
  71. }

  72. /*************************************************************
  73. * 函数名:  at24cxx_Page_Read(uint8_t addr)
  74. * 输入参数:addr = 要读取的地址
  75. * 输出参数:data = 读出的数据
  76. *************************************************************/
  77. uint8_t at24cxx_Page_Rea(uint16_t addr,uint8_t size)// 读指定起始地址Addr里的数据到buff
  78. {
  79.     uint8_t i,buff[size];
  80.    
  81.     SI2C_Start();                //开始I2C通讯
  82.     SI2C_Send(0xA0);             //发送EEPROM器件地址
  83.     SI2CIsAck();                 //等待应答
  84.     SI2C_Send(addr>>8);          //发送高8位地址
  85.     SI2CIsAck();                 //等待应答
  86.     SI2C_Send(addr%256);         //发送低8位地址
  87.     SI2CIsAck();                 //等待应答

  88.     SI2C_Start();
  89.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址
  90.     SI2CIsAck();
  91.     for(i=0; i<size; i++){
  92.         buff[i] = SI2C_Receive();//读一字节数据
  93.         SI2CDoAck();
  94.     }
  95.         SI2C_Stop();
  96.     delay_us(4);
  97.     return *buff;
  98. }
复制代码

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

qazplm3218 回答时间:2020-7-11 11:18:12
hujjj 发表于 2020-7-11 09:34
如果不是使用硬件I2C的话,不光是读写地址要改成16位的,写地址的代码也要相应变动,改成写两个字节。 ...

你好,帮我看下,这个代码哪里错误,要怎么修改?谢谢
void at24c1024_response(void)         //at24c1024应答响应信号;SCL高电平下,如果at24c1024收到数据,则会SDA拉低
{
  unsigned int x=0;
  at24c1024_scl_set();
  systick_delay_us(5);
  while((at24c1024_sda_io())&&(x<5000))x++;   //等待是否有应答,如果一段时间应答不成功,则默认为应答成功
  at24c1024_scl_clr();
  systick_delay_us(5);
}

unsigned char at24c1024_read_byte(void)    //从at24c1024读出数据
{
unsigned char x,y;
at24c1024_scl_clr();
systick_delay_us(5);
at24c1024_sda_set();
systick_delay_us(5);
for(x=0;x<8;x++)
{
  at24c1024_scl_clr();
  systick_delay_us(5);
  y=(y<<1)|at24c1024_sda_io();
  systick_delay_us(5);
  at24c1024_scl_set();
  systick_delay_us(5);
}
return y;
}

void at24c1024_write_byte1(unsigned int byte)    //向at24c1024写入数据
{
unsigned int x,y;
for(x=0;x<16;x++)
{
  y=byte&0x8000;
  at24c1024_scl_clr();
  systick_delay_us(5);
  if(y==0){at24c1024_sda_clr();}
  else{at24c1024_sda_set();}
  systick_delay_us(5);
  at24c1024_scl_set();
  systick_delay_us(5);
  byte=byte<<1;
  systick_delay_us(5);
}
at24c1024_scl_clr();
systick_delay_us(5);
at24c1024_sda_clr();
systick_delay_us(5);
}

void at24c1024_write_data(unsigned char add,unsigned char data)    //给at24c1024指定地址写入数据
{       
at24c1024_start();
at24c1024_write_byte(0xA0);                        //0xA0:写数据,0xA1:读数据;
at24c1024_response();
at24c1024_write_byte1(add);
at24c1024_response();
at24c1024_write_byte1(data);
at24c1024_response();
at24c1024_stop();
systick_delay_ms(10);
}

unsigned char at24c1024_read_data(unsigned char add)    //从A24C1024指定地址中读出数据
{//0xA0:写数据,0xA1:读数据;
unsigned int data;
at24c1024_start();
at24c1024_write_byte1(0xA0);                       
at24c1024_response();
at24c1024_write_byte1(add);
at24c1024_response();

at24c1024_start();
at24c1024_write_byte1(0xA1);                       
at24c1024_response();
data=at24c1024_read_byte();
at24c1024_stop();
systick_delay_ms(10);
return data;
}
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位地址改如何处理?
谢谢!
陌路夕颜 回答时间:2020-7-10 08:42:40
他俩肯定不能直接用,地址的位数不一样,看看24C1024的手册

评分

参与人数 1蝴蝶豆 +4 收起 理由
STMCU + 4

查看全部评分

qazplm3218 回答时间:2020-7-10 09:09:54
陌路夕颜 发表于 2020-7-10 08:42
他俩肯定不能直接用,地址的位数不一样,看看24C1024的手册

你好,我知道地址的个数不一样,但是写0x01地址是不是一样的?
网络孤客 回答时间:2020-7-10 09:14:02
24c02是8bit地址
24c1024是16bit地址,地址0x01应改为0x0001

无标题.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

李康1202 回答时间:2020-7-10 11:05:30
地址长度不一样吧
西点钟灵毓秀 回答时间:2020-7-10 11:10:04
1024  好贵吧
qazplm3218 回答时间:2020-7-10 12:40:59
ldptest 发表于 2020-7-10 09:14
24c02是8bit地址
24c1024是16bit地址,地址0x01应改为0x0001

谢谢您,晚上回去地址改成0x0001试试
qazplm3218 回答时间:2020-7-10 12:43:08
ldptest 发表于 2020-7-10 09:14
24c02是8bit地址
24c1024是16bit地址,地址0x01应改为0x0001

谢谢,晚上回去地址改成0x0001试试
老牛洋车 回答时间:2020-7-11 09:34:31
如果不是使用硬件I2C的话,不光是读写地址要改成16位的,写地址的代码也要相应变动,改成写两个字节。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

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

这个是在24C02的基础上修改的
小小超 回答时间:2020-7-11 12:50:16
除了地址长度不一致,其它读写方法都是相同的
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
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版