STM32入门学习笔记之EEPROM存储实验3

2024-04-03  

16.3.5 自身地址寄存器1:I2Cx_OAR1

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ADDMODE - ADD[9:8] ADD[7:1] ADD0










Bit 15:寻址模式(从模式)

0:7位从地址(不响应10位地址)


1:10位从地址(不响应7位地址)

Bit 9~Bit 8:接口地址

7位地址模式时不用关心

10位地址模式时为地址的9~8位

Bit 7Bit 1:接口地址,地址的71位

Bit 0:接口地址

7位地址模式时不用关心

10位地址模式时为地址第0位

16.3.6 自身地址寄存器2:I2Cx_OAR2

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- ADD2[7:1] ENDUAL












Bit 7Bit 1:接口地址,在双地址模式下地址的71位

Bit 0:双地址模式使能位

0:在7位地址模式下,只有OAR1被识别

1:在7位地址模式下,OAR1和OAR2都被识别

16.3.7 状态寄存器1:I2Cx_SR1

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SMBALERT TIMEOUT - PECERR OVR AF ARL0 BERR TXE RXNE - STOPF ADD10 BTF ADDR SB

Bit 15: SMBus提醒

在SMBus主机模式下:

0:无SMBus提醒

1:在引脚上产生SMBAlert提醒事件

在SMBus从机模式下:

0:没有SMBAlert响应地址头序列

1:收到SMBAlert响应地址头序列至SMBAlert变低

Bit 14:超时或Tlow错误

0:无超时错误

1:SCL低电平达到25ms;或主机低电平累积时间超过10ms;或从设备低电平累积时间超过25ms

Bit 12:在接收时发生PEC错误

0:无PEC错误:接收到PEC后接收器返回ACK(如果ACK=1)

1:有PEC错误:接收到PEC后接收器返回NACK(不管ACK是什么值)

Bit 11:过载/欠载

0:无过载/欠载

1:出现过载/欠载

Bit 10:应答失败

0:没有应答失败

1:应答失败

Bit 9:仲裁丢失(主模式)

0:没有检测到仲裁丢失

1:检测到仲裁丢失

Bit 8:总线出错

0:无起始或停止条件出错

1:起始或停止条件出错

Bit 7:数据寄存器为空(发送时)

0:数据寄存器非空

1:数据寄存器空

Bit 6:数据寄存器非空(接收时)

0:数据寄存器为空

1:数据寄存器非空

Bit 4:停止条件检测位(从模式)

0:没有检测到停止条件

1:检测到停止条件

Bit 3:10位头序列已发送(主模式)

0:没有ADD10事件发生

1:主设备已经将第一个地址字节发送出去

Bit 2:字节发送结束

0:字节发送未完成

1:字节发送结束

Bit 1:地址已被发送(主模式)/地址匹配(从模式)

地址匹配(从模式)

0:地址不匹配或没有收到地址

1:收到的地址匹配Bit 1:

地址发送标志(主模式)

0:地址发送没有结束

1:地址发送结束

10位地址模式时,当收到地址的第二个字节的ACK后该位被置1

7位地址模式时,当收到地址的ACK后该位被置1

Bit 0:起始位(主模式)

0:未发送起始条件

1:起始条件已发送

16.3.8 状态寄存器2:I2Cx_SR2

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
PEC[7:0] DUALF SMBHOST SMBDEFAULT GENCALL - TRA BUSY MSL






Bit 15~Bit 8:数据包出错检测,当ENPEC=1时,PEC[7:0]存放内部的PEC的值

Bit 7:双标志(从模式)

0:接收到的地址与OAR1内的内容相匹配

1:接收到的地址与OAR2内的内容相匹配

Bit 6:SMBus主机头系列(从模式)

0:未收到SMBus主机的地址

1:当SMBTYPE=1且ENARP=1时,收到SMBus主机地址

Bit 5:SMBus设备默认地址(从模式)

0:未收到SMBus设备的默认地址

1:当ENARP=1时,收到SMBus设备的默认地址

Bit 4:广播呼叫地址(从模式)

0:未收到广播呼叫地址

1:当ENGC=1时,收到广播呼叫的地址

Bit 2:发送/接收

0:接收到数据

1:数据已发送

Bit 1:总线忙,在检测到SDA或SCl为低电平时,硬件将该位1

0:在总线上无数据通讯

1:在总线上正在进行数据通讯

Bit 0:主从模式

0:从模式

1:主模式

16.3.9 数据寄存器:I2Cx_DR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- DR[7:0]













Bit 7~Bit 0:8位数据寄存器,用于存放接收到的数据或放置用于发送到总线的数据

发送器模式:当写一个字节至DR寄存器时,自动启动数据传输。一旦传输开始,如果能及时把下一个需传输的数据写入DR寄存器,I2C模块将保持连续的数据流

接收器模式:接收到的字节被拷贝到DR寄存器。在接收到下一个字节之前读出数据寄存器,即可实现连续的数据传送

注1:在从模式下,地址不会被拷贝进数据寄存器DR

注2:硬件不管理写冲突(如果TxE=0,仍能写入数据寄存器)

注3:如果在处理ACK脉冲时发生ARLO事件,接收到的字节不会被拷贝到数据寄存器里,因此不能读到它


16.4 实验例程

16.4.1 软件模拟IIC控制

(1)创建at24cxx.h文件,并输入以下代码。


/*********************************************************************************************************

                EEPROM    驱    动    文    件

*********************************************************************************************************/

#ifndef _AT24Cxx_H_

#define _AT24Cxx_H_



#include "sys.h"

/*********************************************************************************************************

                硬    件    端    口    定    义

*********************************************************************************************************/

#define IIC_SCL      PBout( 6 )

#define IIC_SDA      PBout( 7 )

#define IIC_SDA_READ  PBin( 7 )

/*********************************************************************************************************

                    函    数    列    表

*********************************************************************************************************/

void AT24Cxx_Init( void ) ;                                        //AT24C初始化

void AT24Cxx_Write_Data( u16 Address, u8 Data ) ;                            //写入1个数据

void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len ) ;                      //写入n个数据

void AT24Cxx_Read_Data( u16 Address, u8 *Data ) ;                            //读取1个数据

void AT24Cxx_Read_nData( u16 Address, u8 *Buffer, u16 Len ) ;                      //读取n个数据



#endif


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。