打印
[MM32硬件]

灵动MCU的I2C从站模式配置

[复制链接]
273|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OKAKAKO|  楼主 | 2023-9-27 10:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
 初始化配置
1) 写 0 到 I2C_ENR.ENABLE(位 0)以禁止 I2C
2) 通过配置 I2C_SAR 寄存器指定从地址(该地址为 I2C 接口所响应的地址)
3) 通过配置 I2C_CR.SLAVE10 (位 3)指定地址格式(7 位或 10 位地址);写 0 到
I2C_CR.DISSLAVE(位 6)和 I2C_CR.MASTER(位 0)
4) 置位 I2C_ENR.ENABLE(位 0),使能 I2C 接口模块
 从发送的单字节操作
I2C 接口被其他 I2C 主器件寻址并请求数据时,I2C 接口工作在从发送模式,工作流程如下:
1) 其他 I2C 主器件发起 I2C 传输,发送地址与 I2C_SAR 寄存器的从地址匹配
2) I2C 接口响应发送的地址,识别传输方向以表明其工作在从发送模式
3) I2C 接口产生 RD_REQ 中断(I2C_RAWISR 位 5),并将 SCL 线拉低;总线一直处于等待状
态直到软件响应。若 R D _ R E Q 中断被屏蔽( I 2 C _ I M R 位 5 为 0),建议 C P U 定期查询
I2C_RAWISR 寄存器:
a. 读到 I2C_RAWISR.RD_REQ(位 5)为 1 等效于产生了 RD_REQ 中断
b. 软件必须采取行动以满足 I2C 传输的要求
c. 时间间隔通常在 10 个 SCL 时钟周期左右(例如,400kbps 的时间间隔是 25us)
4 ) 如 果 在 接 收 到 读 请 求 前 T X F I F O 中 仍 有 数 据 , I 2 C 接 口 会 产 生 T X _ A B R T 中 断
(I2C_RAWISR 位 6),以清空 TX FIFO 中的数据(I2C_CR.SLV_TX_ ABRT_DIS 为 0 时)
因此,在试图写入 TX FIFO 前,软件有必要通过读取 I2C_TX_ABRT 寄存器来清除 TX_ABRT 中
断。若 TX_ABRT 中断被屏蔽(I2C_IMR 位 6 为 0),建议 CPU 定期查询 I2C_RAWISR 寄存器。读
到 I2C_RAWISR.TX_ABRT(位 6)为 1 等效于产生了 TX_ABRT 中断。
5) 软件写数据到 I2C_DR 寄存器(其中位 8 设置为 0)
6) 软件必须先清除 I2C_RAWISR.RD_REQ(位 5)和 I2C_RAWISR.TX_ABRT(位 6)中断
7) I2C 接口释放 SCL,并发送数据字节
8) 主器件发送重复起始条件控制总线,或发送停止条件释放总线
 从接收的单字节操作
其他主器件寻址 I2C 接口并发送数据时,I2C 接口工作在从接收模式,工作流程如下:
1) 其他 I2C 主器件发起 I2C 传输,发送地址与 I2C_SAR 寄存器的从地址匹配
2) I2C 接口响应发送的地址,识别传输方向以表明其工作在从接收模式
3) I2C 接口接收主器件发送的数据并将其存储在接收缓冲中
4) I2C 接口产生 RX_FULL 中断(I2C_RAWISR 位 2)
若 RX_FULL 中断被屏蔽(I2C_IMR 位 2 为 0),建议 CPU 定期查询 I2C_SR 寄存器。读到
I2C_SR.RFNE(位 3)为 1 等效于产生了 RX_FULL 中断
5) 软件通过读 I2C_DR 寄存器(位 7:0)来获得接收到的数据
6) 主器件发送重复起始条件控制总线,或发送停止条件释放总线

使用特权

评论回复
沙发
OKAKAKO|  楼主 | 2023-9-27 10:01 | 只看该作者

使用特权

评论回复
板凳
OKAKAKO|  楼主 | 2023-9-27 10:02 | 只看该作者
 从器件的块传输操作
标准 I2C 协议中,所有的数据处理都是单字节的处理,程序通过写一个字节到从器件的 TX FIFO
来响应主器件的读请求。当从器件(从发送)接收到主器件(主接收)的读请求(RD_REQ)时,至少
应在从发送的 TX FIFO 中放置一个数据。I2C 接口模块可以处理 TX FIFO 中的多个数据,因此,后续
的读请求无需再产生中断来获取数据。这极大地减少了因每次数据中断而导致的等待时间。
此模式仅适用于 I2C 接口作为从发送器的情况。如果接收到主器件发送的 ACK,从器件的 TX
FIFO 中没有数据,I2C 接口将拉低总线的 SCL 线直到读请求中断(RD_REQ)产生并且 TX FIFO 的数
据准备好后才释放 SCL 线。
如果 RX_REQ 中断被屏蔽(I2C_ISR 位 5 为 0),软件可以定期查询 I2C_RAWISR 寄存器。读
到 I2C_RAWISR. RX_REQ(位 5)为 1 等效于产生了 RX_REQ 中断。
RD_REQ 中断由读请求产生,和中断一样必须在退出中断服务程序(ISR)时清除。在中断服务程
序中(ISR)可以写一个或多个字节的数据到 TX FIFO。在将这些字节传输给主器件的过程中,如果主器
件响应了最后一个字节,则说明主器件正在要求更多的数据,那么从器件必须再次产生 RD_REQ 中断请
求。
如果主器件要从 I2C 接口接收 n 个字节,但程序写到 TX FIFO 中的数据个数大于 n,那么从器件
在发送完要求的 n 个字节数据后,将会清空 TX FIFO 并忽略额外的字节。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

168

主题

1248

帖子

3

粉丝