STM32 AT24CXX器件地址的理解(IIC通讯协议)

 if (EE_TYPE > AT24C16)      /* 24C16以上的型号, 分2个字节发送地址 */
    {
        iic_send_byte(0XA0);    /* 发送写命令, IIC规定最低位是0, 表示写入 */
        iic_wait_ack();         /* 每次发送完一个字节,都要等待ACK */
        iic_send_byte(addr >> 8);/* 发送高字节地址 */
    }
    else 
    {
        iic_send_byte(0XA0 + ((addr >> 8) << 1));   /* 发送器件 0XA0 + 高位a8/a9/a10地址,写数据 */
    }
    
    iic_wait_ack();             /* 每次发送完一个字节,都要等待ACK */
    iic_send_byte(addr % 256);  /* 发送低位地址 */
    iic_wait_ack();             /* 等待ACK, 此时地址发送完成了 */

 EETYPE为宏定义,具体如下

#define AT24C01     127
#define AT24C02     255
#define AT24C04     511
#define AT24C08     1023
#define AT24C16     2047
#define AT24C32     4095
#define AT24C64     8191
#define AT24C128    16383
#define AT24C256    32767

/* 开发板使用的是24c02,所以定义EE_TYPE为AT24C02 */

#define EE_TYPE     AT24C02

 根据尼使用得AT24C型号得不同,给EE_TYPE初始化不同的值。先讨论C16以下的

     *    对于24C01/02, 其器件地址格式(8bit)为: 1  0  1  0  A2  A1  A0  R/W
     *    对于24C04,    其器件地址格式(8bit)为: 1  0  1  0  A2  A1  a8  R/W
     *    对于24C08,    其器件地址格式(8bit)为: 1  0  1  0  A2  a9  a8  R/W
     *    对于24C16,    其器件地址格式(8bit)为: 1  0  1  0  a10 a9  a8  R/W

     R/W      : 读/写控制位 0,表示写; 1,表示读;
      A0/A1/A2 : 对应器件的1,2,3引脚(只有24C01/02/04/8有这些脚,16以上的芯片没设计这些脚)
     a8/a9/a10: 对应存储地址的高位。

比如24C04 有512byte(32page16byte),地址本质都是0 1这种二进制(经常我们看到的地址表示形式是0x00000008这种,是32位机下,四个二进制转换成一个十六进制形成的),一位二进制(2的一次方)能代表两个地址块,2位二进制(2的平方)能代表四个地址块,512个地址块就需要2的九次方,所以每个地址需要9位来表示来能把这521byte覆盖完。在发送时,只能一个字节一个字节的发送,你要一口气发九个字节,从机会领悟不到的,所以可以先把高位的1位弄成00000001发送,再发最后的八位,加上1  0  1  0  A2  A1  A0  R/W,一共要发三次才能确定要读或者写的地址,麻烦!!

所以我们把多出来的1位(第九位,这个最高位)放到1  0  1  0  A2  A1  A0  R/W的A0位去传输,这样只用传输两次即可。如果多了两位就把多的放在A1,和A0位去传输。


以上方法最多11bit地址,最多可以表示2048个位置,可以寻址24C16及以内的型号

针对C32以后的,不够用了,所以干脆就大大方方的先发1  0  1  0  A2  A1  A0  R/W,再分两次发送地址


iic_send_byte(0XA0 + ((addr >> 8) << 1));

这句代码的理解:addr >> 8左移八位,把八位之后的东西留下来再左移一位后与0XA0相加,左移这一位相当于是给R/W腾了个位置,通过这句代码,把地址的高x位取出来了,然后随着1  0  1  0  A2  A1  A0  R/W发送出去。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32AT24CXX程序案例是指在STM32开发板上使用AT24CXX系列I2C EEPROM芯片的示例程序。AT24CXX系列芯片是一种非易失性存储器,通过I2C总线与微控制器通信。以下是一个简单的示例程序: 首先,需要在STM32的开发环境中创建一个新的工程。然后,根据开发板上的引脚配置连接AT24CXX芯片与STM32开发板。常用的引脚连接如下: - SDA引脚连接到STM32的SDA引脚 - SCL引脚连接到STM32的SCL引脚 - VCC引脚连接到STM32的3.3V电源 - GND引脚连接到STM32的地 在示例程序中,首先需要包含I2C库的头文件,以便能够使用相关的函数和变量。然后,在主程序中,初始化I2C总线并设置AT24CXX芯片的地址。 接下来,可以使用I2C库提供的函数来读写AT24CXX芯片的数据。例如,可以使用函数往芯片中写入数据,如WriteByte函数,它接收芯片的地址、要写入的数据和数据长度作为参数。 同时,还可以使用相应的函数来从芯片中读取数据,如ReadByte函数,它接收芯片的地址和要读取的数据长度作为参数,并返回读取到的数据。 用户可以根据自己的需求,使用不同的函数来实现对AT24CXX芯片的读写操作。在示例程序中,可以先往芯片中写入一些数据,然后再从芯片中读取出来进行验证。 最后,记得释放I2C总线资源,关闭芯片的访问。 这只是一个简单的基于STM32AT24CXX程序案例,实际上,在实际应用中可能会更复杂,需要根据具体情况进行修改和调试。希望这个简单的示例能够对您有所帮助! ### 回答2: AT24CXX是一种串行EEPROM芯片,常用于存储一些不经常变化的数据,如配置参数、历史记录等。STM32是一款微控制器,具有丰富的外设和高性能,适用于各种应用场景,包括AT24CXX的应用。 基于STM32AT24CXX程序案例可以实现以下功能:读取和写入AT24CXX芯片的数据。 首先,需要进行初始化设置。通过I2C总线连接STM32AT24CXX,设置I2C引脚并配置I2C的工作频率。 然后,可以进行数据读取和写入操作。对于读取操作,先发送I2C启动信号,然后发送AT24CXX地址和读取命令,再读取数据并通过串口打印出来。对于写入操作,先发送I2C启动信号,然后发送AT24CXX地址和写入命令,再将要写入的数据发送给AT24CXX。 最后,需要释放I2C总线资源。发送I2C停止信号,完成读取或写入操作后,释放I2C总线。 总结起来,基于STM32AT24CXX程序案例主要包括初始化设置、数据读取、数据写入和I2C总线资源释放。通过该程序可以轻松实现与AT24CXX芯片的通信,实现对数据的读写操作。这样的程序案例可以被广泛应用于各种需要使用AT24CXX芯片存储数据的应用中。 ### 回答3: 基于STM32AT24CXX是一种常见的串行EEPROM(电可擦除可编程只读存储器),在许多应用中被用于存储较小的数据。下面是一个基于STM32AT24CXX程序案例的简要说明。 首先,我们需要在STM32上连接AT24CXX芯片。AT24CXX有不同的型号,如AT24C02、AT24C08等,具有不同的存储容量。我们需要根据芯片型号选择正确的硬件连接方式,通常是通过I2C总线连接。 在项目中,我们需要引入STM32开发环境,并准备好相应的库文件。在主程序中,首先初始化I2C总线,并配置相关的引脚和时钟。 接下来,我们需要编写读写AT24CXX的函数。例如,我们可以编写一个函数来向AT24CXX芯片中写入数据,该函数接收一个地址和一个数据字节作为参数。函数首先发送起始信号,然后发送设备地址和写入命令,再发送数据地址,最后发送数据字节。函数最后发送停止信号来结束整个传输过程。 同样,我们也需要编写一个函数来从AT24CXX芯片中读取数据。该函数也需要接收一个地址参数,并返回读取到的数据字节。同样,函数首先发送起始信号,然后发送设备地址和读取命令,再发送数据地址。最后,函数接收从芯片返回的数据字节,并发送停止信号。 在主程序中,我们可以使用这些函数来实现我们的需求。例如,我们可以编写一个函数来向AT24CXX芯片中写入一串数据,并编写另一个函数来从芯片中读取该数据,并在串口终端上打印出来。 总的来说,基于STM32AT24CXX程序案例涉及到初始化I2C总线、写入和读取AT24CXX芯片的函数。开发者可以根据自己的需求和芯片型号编写相应的代码。这样,我们可以成功在STM32上实现对AT24CXX芯片的读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值