OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6585|回复: 17

STM32操作AT24C16

[复制链接]

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
发表于 2018-10-17 10:04:10 | 显示全部楼层 |阅读模式
1金钱
使用例程操作AT24C16时只能读写0-255的数据,在写入255-2047时遇到问题,一直写不进去

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-10-17 11:07:48 | 显示全部楼层
这里的地址是在程序中给定的,A0 A1 A2引脚其实并不起作用:

1.png
也就是说,需要访问的地址,对于AT24C16来说一共有11位,其中低8位的给定方式和AT24C02相同;高3bit则对应于上图中的P2 P1 P0处。

可以参考数据手册:
AT24C16.pdf (444.98 KB, 下载次数: 64)
十六进制带我飞。
回复

使用道具 举报

1

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2872
金钱
2872
注册时间
2018-1-24
在线时间
258 小时
发表于 2018-10-17 14:12:09 | 显示全部楼层
你发地址时必须发送两个8位数据,也就是说写入数据的地址是16位的,这点你必须清楚
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 14:34:55 | 显示全部楼层
bebj2009 发表于 2018-10-17 14:12
你发地址时必须发送两个8位数据,也就是说写入数据的地址是16位的,这点你必须清楚

//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址   
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(WriteAddr>>8);//发送高地址
        }
    else
        {
                IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
        }         
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);     //发送字节                                                          
        IIC_Wait_Ack();                                
    IIC_Stop();//产生一个停止条件
        delay_ms(10);         
}
这是程序,我发送的是两个8位数据
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-17 15:21:24 | 显示全部楼层
u8 0~255,如果你想要发255-2047,为啥发不出去?这个说明你C语言基础不好。AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)中的u8 DataToWrite是u8类型的(占用一个字节内存),255-2047是占用两个字节的内存,将u16类型强制转化成u8类型的话,会舍弃高八位数据,取低八位发送过去。所以为啥发不过去你想要的数据是正常的。不过也有办法的,你可以把你u16的数据拆成两个 u8的数据,然后再发送过去。接受的时候,接收到两个u8的数据,然后将两个u8数据合成一个u16的数据。
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 15:32:04 | 显示全部楼层
jiangyy 发表于 2018-10-17 15:21
u8 0~255,如果你想要发255-2047,为啥发不出去?这个说明你C语言基础不好。AT24CXX_WriteOneByte(u16 Wr ...

我不是想要发256-2047数据,256-2047这是AT24C16的地址,2048*8bits,我想要问的问题是不能正常读写AT24C16的256-2047地址的数据
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-17 15:40:55 | 显示全部楼层
#define EE_TYPE AT24C02  改成   #define EE_TYPE AT24C16
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 15:42:02 | 显示全部楼层
jiangyy 发表于 2018-10-17 15:40
#define EE_TYPE AT24C02  改成   #define EE_TYPE AT24C16

这个已经改过了,没有用
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-17 15:47:11 | 显示全部楼层
上传代码
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 15:55:43 | 显示全部楼层

程序用的就是正点原子战舰STM32F103ZET6实验23 IIC实验的程序
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 15:57:09 | 显示全部楼层

程序对AT24C16的0-255地址的数据可以正常读写
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-17 16:18:30 | 显示全部楼层
鑫宇 发表于 2018-10-17 15:57
程序对AT24C16的0-255地址的数据可以正常读写

是不是买到假货了哦
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 16:21:09 | 显示全部楼层
jiangyy 发表于 2018-10-17 16:18
是不是买到假货了哦

不应该呀,这是别的开发板,测试两个都是这样
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-17 16:38:59 | 显示全部楼层
你用的是什么开发板?I2C用的是哪两个引脚?
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 16:40:42 | 显示全部楼层
jiangyy 发表于 2018-10-17 16:38
你用的是什么开发板?I2C用的是哪两个引脚?

这是我们自己的一个板子,IIC使用的是PG0和PG1
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2106
金钱
2106
注册时间
2017-2-11
在线时间
307 小时
发表于 2018-10-17 16:43:02 | 显示全部楼层
你用STM32F103的小板子试试看,你用的是STM32F407的吗?
回复

使用道具 举报

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-10-17
在线时间
13 小时
 楼主| 发表于 2018-10-17 17:09:13 | 显示全部楼层
jiangyy 发表于 2018-10-17 16:43
你用STM32F103的小板子试试看,你用的是STM32F407的吗?

我用的是STM32F103ZET6
回复

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2017-7-28
在线时间
37 小时
发表于 2018-10-20 10:26:28 | 显示全部楼层
看你的描述的问题好几遍,才理解写入地址0x00ff-0x07ff时写不了,在你调用void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)时,确定你传入的地址是一个字长度,建议你直接 AT24CXX_WriteOneByte(0x0100,1),能否写入
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 10:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表