STM32基于CubeMX与Simulink的模块开发——IIC官方例程学习

模块学习

IIC Controller Write

image-20241023171238214

帮助:I2C 控制器写入 - 将数据写入 I2C 外围设备或 I2C 外围设备 注册 - Simulink - MathWorks 中国

输入

Data:写入的数据内容

输出

status:输出的状态(uint8_t)

Output error status开启时才能使用

image-20241023175015009

参数

I2C module:使用I2C哪个端口(I2C1|I2C2…)

Peripheral byte orde: 外围字节顺序

  • BigEndian(默认) - 最高有效字节首先通过I2C总线
  • LittleEndian - 最低有效字节首先通过I2C总线

Peripheral address via :选择外设地址写入方式

  • Dialog(默认): 内置对话框输入
  • inport:外部输入框

Peripheral address:外设地址

Enable register access address mode:启用寄存器访问地址模式

当启用的时候:

image-20241023173201421

未启用的时候:

image-20241023173259952

Peripheral register address寄存器地址 (uint8_t)

以8位无符号整数或十六进制格式指定此地址。要用8位无符号整数指定地址,请使用uint8(),例如“uint8”(20)。要以十六进制格式指定地址,请使用hex2dec(),例如’hex2dec’(‘20’)’。

I2C寄存器读/写帮助:支持 I2C 通信 - MATLAB & Simulink - MathWorks 中国

Remove stop bit at the end of data transfer (Repeated start)

如果未选择该参数,则数据块会发送 STOP 条件。这条件表示该块已终止数据传输, I2C 总线可供任何其他 I2C 控制器模块启动 新的读/写操作。

当您选择此参数时,模块会发送另一个 START 条件 后跟 Address 和 Read/Write bit。该区块发送任意数量的 以递归方式启动条件。这种重复的 START 条件允许写入操作到外围设备,而无需释放总线。没有其他 控制器块中断操作。

Send no acknowledgement at the end of the transfer

当您选择此参数时,I2C控制器读取块会向外围设备发送一个带有最后字节的NACK(不确认)位。

当外围设备接收到NACK时,它会等待来自I2C控制器块的STOP条件。控制器块生成STOP条件以中止传输,或生成重复的START条件以开始新的传输。

当您取消选择此参数时,I2C控制器读取块会在每个字节的末尾向外围设备发送一个ACK(确认)位。ACK表示I2C控制器读取块已准备好从外围设备读取下一个字节。

IIC Controller Read

image-20241023175312700

模块帮助:I2C Controller Read - Read data from I2C peripheral device or I2C peripheral device register - Simulink - MathWorks 中国

基本上与IIC Controller Write 差不多,就不过多讲解了

官方例程

链接:使用 I2C 将数据读取和写入 STM32 处理器板上的加速度计 - MATLAB & Simulink - MathWorks 中国

确定读/写设备地址:基于 I2C 的加速度计的默认地址为 7 位 0011001b,所以我们配置为七位外设地址。

image-20241023175914218

实际上地址为:读:0X33 写:0X32 ,但是在 STM32 Embedded Coder I2C 控制器读写模块中,R/W 位由驱动程序模块管理。因此,您应该使用 7 位外设地址(例如,0011001b 或 0x19)。

模型学习

我们来看看stm32_Ex_i2c_read3AutoIncrement的模型

image-20241023181336111

写入数据部分

Initialize Function 模块:在发生模型初始化事件时执行子系统

模块帮助:Initialize Function - 在发生模型初始化事件时执行子系统 - Simulink - MathWorks 中国

image-20241023181707178

初始化设置:使用I2C,向设备地址0X19的寄存器地址0X20写入数据(01010111)

image-20241023234224905

通过数据手册可知0X20为CTRL_REG1_A的寄存器地址,在使用该模块前需要配置该寄存器才可使用

其功能为

输出数据速率(ODR位)

操作模式(CTRL_REG4_A中的LPen位和HR位)

启用/禁用单个轴。(Xen、Yen和Zen比特)

大家了解一下就行,重点不在这里,不懂可以去看官方帮助!

读取数据部分

设备的加速度分为X Y Z三轴,分别在以下寄存器中:

image-20241023235821721

将其从各个寄存器读出再组合将获得值

image-20241023235926705

1.单个寄存器读取

分别从各个寄存器中读取数据,再组合成各个轴的数据

image-20241024000158182

image-20241024000212721

image-20241024000225175

具体配置如图:无符号单字节,1个字节的数据长度

image-20241024000406355

2.多个寄存器一起读取

前面几节中的示例模型使用了 7 位 output register address。例如,OUT_X_L_A 的地址为 **0b010 1000(0x28)。**当最高有效位 (MSB) 设置为 1 时。此设置使地址能够自动递增。7 个最低有效位代表实际的寄存器地址,而最高有效位使能地址自动递增。

该模型将寄存器地址设置为 **0b1010 1000 (0xA8),**使能自增。在此模式下,寄存器地址自动增加,以允许从连续的内存地址读取多个字节。根据要读取的字节数,您可以在 I2C 控制器读取块中设置数据类型和数据长度值。

image-20241023234631256

读取外设地址0X19的寄存器地址0XA8的值,读取3个16位的数据

image-20241024001001117

多字节读取其实位Burst模式

【STM32】软件I2C(支持多字节)_stm32i2c接口配置-优快云博客

image-20241024001759049

看了一些教程其中并未“提到当最高有效位 (MSB) 设置为 1 时。此设置使地址能够自动递增”这一说法

可能是这个芯片独有的功能!!!!

CubeMX配置

目前网上很多配置CubeMX的教程,其实配置和软件开发一样,不一样的在第一节新建工程也提到过,大家可以去看一下

STM32 I2C通信协议+CubeMx配置_cubemx配置i2c-优快云博客

img

时钟标准模式(Standard Mode,100000Hz)\ 时钟快速模式(Fast Mode,400000Hz)

【STM32】HAL库 STM32CubeMX教程十二—IIC(读取AT24C02 )_hal iic-优快云博客

image-20241024002828519

一般配置这些即可

image-20241024002630153

总结

我们先在 Initialize Function 模块中配置一下设备的初始化功能,再读取基本的数据,读取数据可分单字节和多字节连续读取。

但是通过学习IIC的通讯协议发现多字节读取的流程应该是

1.发送从机地址+写功能

2.发送寄存器地址

3.发送从机地址+读功能

image-20241024003444484

但是官方例程中并不是这种读法!!!!
IIC多字节读取_i2c读多个字节-优快云博客

看到一张图

img

其中的随机读取和有序读取并不一样,上述为随机读取,而官方例程位顺序读取。

基础通信协议之 IIC详细讲解 - 知乎中做了详细的讲解

IIC有三种读取方法:读取当前,随机读,有序写

I2C协议 读数据的时候为啥要发送几次地址 (Dummy Write 哑写) - Doreen的FPGA自留地 - 博客园中对随机读取做出了解释

随机读取:这里存在一个叫做哑写(Dummy Write )的操作,目的是为了 更新 I2C 从设备的微控制器 的内部字节地址计数器( internal address counter)。

为什么会有哑写的操作呢?跟字节地址计数器有什么关系?

这就要先了解I2C 从设备的一些特性。有些设备支持当前地址读和随即地址读, 以及 连续读操作 这三种模式。 I2C 从设备的微控制器 的内部字节地址计数器 会根据每读一个数据或者写一个数据就累加1,直到累加到31(写操作) 或者是累加到页尾(读操作)。

如果直接发送器件地址(也就是进行当前地址读),那么它读出来的是当前计数器所指的地址:(因为只要不断电,the internal address counter 就会保持之前的值, 比如之前先对计数器0指的地址写了一个数据,此时计数器会累加到1, 然后接着进行当前地址读操作,此时读出的数据将是计数器1所指的地址的数据。)

总的来说就是:连续两次读取同一个寄存器的值,第二次读到的是下一位寄存器的值,所以如果需要连续多次读取相同寄存器的值,需要此操作清除内部地址计数器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值