这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【CH582M】CH582M的I2C外设(2)-----主模式

共2条 1/1 1 跳转至页

【CH582M】CH582M的I2C外设(2)-----主模式

专家
2026-09-30 12:05:34     打赏

设置CH582M的I2C外设为主模式,需要按照以下方式处理。

1)在控制寄存器 2(R16_I2C_CTRL2)和时钟控制寄存器(R16_I2C_CKCFGR)中设置正确的时钟; 

2)在上升沿寄存器(R16_I2C_RTR)设置合适的上升沿; 

3)在控制寄存器(R16_I2C_CTRL1)中置 PE 位启动外设; 

4)在控制寄存器(R16_I2C_CTRL1)中置 START 位,产生起始事件。 

在置 START 位后,I2C 模块会自动切换到主模式,MSL 位会置位,产生起始事件,在产生起始事件后,SB 位会置位,如果 ITEVTEN 位(在 R16_I2C_CTRL2)被置位,则会产生中断。此时应该读取状态寄存器 1(R16_I2C_STAR1),写从地址到数据寄存器后,SB 位会自动清除; 

5)如果是使用 10 位地址模式,那么写数据寄存器发送头序列(头序列为 11110xx0b,其中的 xx 位是 10 位地址的最高两位)。

在发送完头序列之后,状态寄存器的 ADD10 位会被置位,如果 ITEVTEN 位已经置位,则会产生中断,此时应读取 R16_I2C_STAR1 寄存器后,写第二个地址字节到数据寄存器后,清除 ADD10 位。 然后写数据寄存器发送第二个地址字节,在发送完第二个地址字节后,状态寄存器的 ADDR 位会被置位,如果 ITEVTEN 位已经置位,则会产生中断,此时应读取 R16_I2C_STAR1 寄存器后再读一次R16_I2C_STAR2 寄存器以清除 ADDR 位; 

如果使用的是 7 位地址模式,那么写数据寄存器发送地址字节,在发送完地址字节后,状态寄存器的 ADDR 位会被置位,如果 ITEVTEN 位已经置位,则会产生中断,此时应读取 R16_I2C_STAR1 寄存器后再读一次 R16_I2C_STAR2 寄存器以清除 ADDR 位; 

在 7 位地址模式下,发送的第一个字节为地址字节,头 7 位代表的是目标从设备地址,第 8 位决定了后续报文的方向,0 代表是主设备写入数据到从设备,1 代表是主设备向从设备读取信息。 

在 10 位地址模式下,如下图所示,在发送地址阶段,第一个字节为 11110xx0,xx 为 10 位地址的最高 2 位,第二个字节为 10 位地址的低 8 位。若后续进入主设备发送模式,则继续发送数据;若后续准备进入主设备接收模式,则需要重新发送一个起始条件,跟随发送一个字节为 11110xx1,然后进入主设备接收模式。

image.png

6)发送模式时,主设备内部的移位寄存器将数据从数据寄存器发送到 SDA 线上,当主设备接收到 ACK时,状态寄存器 1(R16_I2C_STAR1)的 TxE 被置位,如果 ITEVTEN 和 ITBUFEN 被置位,还会产生中断。向数据寄存器写入数据将会清除 TxE 位。 

如果 TxE 位被置位且上次发送数据之前没有新的数据被写入数据寄存器,那么 BTF 位会被置位,在其被清除之前,SCL 将保持低电平,读 R16_I2C_STAR1 后,向数据寄存器写入数据将会清除 BTF 位。 

而在接收模式时,I2C 模块会从 SDA 线接收数据,通过移位寄存器写进数据寄存器。在每个字节之后,如果 ACK位被置位,那么 I2C 模块将会发出一个应答低电平,同时 RxNE 位会被置位,如果ITEVTEN和 ITBUFEN 被置位,还会产生中断。如果 RxNE 被置位且在新的数据被接收前,原有的数据没有被读出,则 BTF 位将被置位,在清除 BTF 之前,SCL 将保持低电平,读取 R16_I2C_STAR1 后,再读取数据寄存器将会清除 BTF 位。 

7)主设备在结束发送数据时,会主动发一个结束事件,即置 STOP 位。在接收模式时,主设备需要在最后一个数据位的应答位置 NAK。注意,产生 NAK 后,I2C 模块将会切换至从模式。 





关键词: CH582M     I2C    

专家
2026-10-09 20:21:29     打赏
2楼

目前手里I2C设备都是7位的。10位的话,不知道使用两块开发板模拟是否可行。


共2条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]