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接口配置-CSDN博客

    image-20241024001759049

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

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

    CubeMX配置

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

    STM32 I2C通信协议+CubeMx配置_cubemx配置i2c-CSDN博客

    img

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

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

    image-20241024002828519

    一般配置这些即可

    image-20241024002630153

    总结

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

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

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

    2.发送寄存器地址

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

    image-20241024003444484

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

    看到一张图

    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所指的地址的数据。)

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

    作者:实验室的看门人

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32基于CubeMX与Simulink的模块开发——IIC官方例程学习

    发表回复