【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS

这篇具有很好参考价值的文章主要介绍了【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

by xusiwei1236

本文将会分别介绍——使用软件I2C和硬件I2C在PSoC开发板上点亮OLED屏,并进行屏幕刷新率对比测试,最后还会在硬件I2C的基础上继续优化屏幕刷新率。本文实验使用的OLED屏尺寸为0.96寸,分辨率为128x64,驱动芯片为SSD1306。本文使用的开发环境为RT-Thread Studio,设备上运行的是RT-Thread实时系统。本文主旨在于,介绍如何在PSoC开发板上使用软件I2C和硬件硬件I2C驱动外设,以及对于屏幕刷新率优化的一些思路。

一、准备工作

开始之前,需要准备实验所需的硬件和软件,接下来分别介绍。

1.1 硬件准备

本次实验需要用到的硬件有:

  • RTT&英飞凌PSoC6评估板
  • 0.96寸OLED屏(驱动芯片SSD1306)
  • 杜邦线4根
  • USB Type-C数据线
  • 个人电脑(Windows 10)

1.2 软件准备

本次实验需要使用的软件主要为:

  • RT-Thread Studio
  • MobaXterm(其他串口调试工具也可以)

假设你已经成功在电脑上安装了以上这些软件。

1.3 硬件连接

硬件连接分为两部分,一部分是PC和开发板,通过USB Type-C线连接;这个没啥难度,不做过多介绍;需要注意的是,开发板一端接DAP口;否则无法正常下载程序。

另外一部分是,开发板和OLED屏幕之间的连接,具体如下表所示:

OLED屏引脚 开发板引脚
SDA SDA
SCL SCL
GND GND
VCC 3V3

开发板和OLED屏幕之间的硬件连接,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

二、原理分析

这么连接之后,如果主控芯片使用软件I2C驱动OLED屏,那么什么限制,对应管脚只需要使用GPIO模拟I2C时序即可。如果想要让主控芯片使用硬件I2C驱动OLED屏,则需要检查一下主控芯片对应引脚可以设置为硬件I2C功能,接下来即为检查的过程。

2.1 开发板原理图

首先,检查开发板原理图的Arduino接口部分:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

这里只能看到标号,看不到主控芯片的引脚名称。

所以,还需要继续搜索这两个引脚的标号,找到主控芯片对应的引脚标号:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

对照这两处可以知道——Arduino接口I2C引脚和主控芯片直接的连接关系为:

  • SCL:P8.0
  • SDA:P8.1

2.2 芯片数据手册

《PSoC 6 MCU: CY8C62x8, CY8C62xA Datasheet》文档的 Pinouts 章节,Table 8. Multiple Alternate Functions 引脚功能服用表,可以查到P8.0和P8.1的功能有:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

可以看到,有scb[4].i2c_scl和scb[4].i2c_sda功能。

也就是说,P8.0和P8.1可以设置为硬件I2C功能。

三、软件I2C驱动OLED

接下来,将使用RT-Thread Studio创建项目,并通过添加软件包和修改配置的方式,实现使用软件I2C驱动OLED屏幕。

3.1 创建RT-Thread项目

在RT-Thread Studio中,打开“文件”→“新建”→”RT-Thread项目”菜单,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

在弹出的创建项目界面中,Project name中填入psoc6_oled,选中基于开发板的项目,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

点击“完成”,即可创建名为psoc6_oled的项目。

3.2 添加ssd1306软件包

创建项目后,双击项目资源管理器视图中,项目下方的“RT-Thread Settings”,主编辑区如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

点击其中的“添加软件包”,弹出的软件包搜索界面,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

按照图中标注的操作顺序,即可将ssd1306软件包添加到当前项目。

添加完成后,主编辑区如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

此时,按Ctrl+S快捷键,保存对项目配置的修改。如果网络通常,则会在控制台窗口中看到ssd1306软件包正常下载的日志:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

这样,ssd1306软件包就成功添加到项目中了,位于packages子目录下:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

3.3 配置软件I2C和ssd1306软件包

接下来,在RT-Thread Studio主编辑器,点击详细配置按钮,按钮位置如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

主编辑器将会显示详细配置:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

切换到“硬件”标签页,找到“Enable Software I2C”选项,并打开该选项,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

接着,打开“使能I2C1 BUS”,并将scl和sda中分别改为64和65,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

然后,在搜索框输入ssd1306,弹出悬浮菜单后,单击该悬浮菜单,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

勾选“Enable debug log output”和“Enable ssd1306 sample”,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

最后,按Ctrl+S保存对所有配置项的修改。

3.4 编译和下载程序

首先,点击工具栏的锤子图标,或者按Ctrl+B快捷键,触发项目构建(全部编译):

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

项目构建完成后,可以在控制台窗口看到生成了elf文件,以及预计Flash和RAM占用情况:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

接着,点击工具栏上的下载图标,或者Ctrl+Alt+D快捷键,触发下载程序二进制文件到开发板上,如下图:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

下载过程中以及下载完成后,控制台窗都可以看到日志输出:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

PS:开始下载之前,需要确认开发板以及和PC正确连接了(开发板要连在DAP口上,并能够正常识别)。

3.5 运行和测试程序

为了方便在串口中进行命令控制,运行之前,需要先打开MobaXterm(或者其他串口调试工具):

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

如上图所示,选中对应的COM号,串口参数设置为:

  • 波特率 115200
  • 数据位 8
  • 停止位 1
  • 校验 None
  • 流控 None

之后,点OK确认连接。

连接成功后,按开发板的复位键,可以看到串口连接中输出:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

此时输入help命令并回车:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

可以看到,有ssd1306_TestAll命令。

输入ssd1306_TestAll命令并回车,如无意外,将会看到OLED屏幕上已经有画面显示了:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

但是此时的帧率较低,测试显示仅有2帧每秒:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

四、硬件I2C驱动OLED

方便起见,接下来将不再创建新项目,而是在刚刚创建的RT-Thread Studio项目上进行修改,通过修改配置的方式,实现使用硬件I2C驱动OLED屏幕。

4.1 增加I2C4配置和代码

RT-Thread Studio默认创建的项目不支持I2C4,不能实现硬件I2C驱动OLED。因此,需要先添加I2C4配置和代码,才能进行后续操作。

首先,修改 board/Kconfig 文件,在config BSP_USING_HW_I2C6之前添加如下代码行:

            config BSP_USING_HW_I2C4
                bool "Enable I2C4 Bus (Arduino I2C)"
                default n
                if BSP_USING_HW_I2C4
                    comment "Notice: P8_0 --> 64; P8_1 --> 65"
                    config BSP_I2C4_SCL_PIN
                        int "i2c4 SCL pin number"
                        range 1 113
                        default 64
                    config BSP_I2C4_SDA_PIN
                        int "i2c4 SDA pin number"
                        range 1 113
                        default 65
                endif

接着,修改 libraries/HAL_Drivers/SConscript 文件,找到 src += [‘drv_i2c.c’] 前一行,添加一个条件:

if GetDepend('BSP_USING_HW_I2C3') or GetDepend('BSP_USING_HW_I2C4') or GetDepend('BSP_USING_HW_I2C6'):

最后,修改 libraries/HAL_Drivers/drv_i2c.c 文件,具体修改内容为:

--- a/libraries/HAL_Drivers/drv_i2c.c
+++ b/libraries/HAL_Drivers/drv_i2c.c
@@ -11,7 +11,7 @@
 #include "board.h"

 #if defined(RT_USING_I2C)
-#if defined(BSP_USING_HW_I2C3) || defined(BSP_USING_HW_I2C6)
+#if defined(BSP_USING_HW_I2C3) || defined(BSP_USING_HW_I2C4) || defined(BSP_USING_HW_I2C6)
 #include <rtdevice.h>

 #ifndef I2C3_CONFIG
@@ -22,7 +22,16 @@
         .sda_pin = BSP_I2C3_SDA_PIN, \
     }
 #endif /* I2C3_CONFIG */
-#endif
+
+#ifndef I2C4_CONFIG
+#define I2C4_CONFIG                  \
+    {                                \
+        .name = "i2c4",              \
+        .scl_pin = BSP_I2C4_SCL_PIN, \
+        .sda_pin = BSP_I2C4_SDA_PIN, \
+    }
+#endif /* I2C4_CONFIG */
+
 #ifndef I2C6_CONFIG
 #define I2C6_CONFIG                  \
     {                                \
@@ -32,11 +41,16 @@
     }
 #endif /* I2C6_CONFIG */

+#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) */
+
 enum
 {
 #ifdef BSP_USING_HW_I2C3
     I2C3_INDEX,
 #endif
+#ifdef BSP_USING_HW_I2C4
+    I2C4_INDEX,
+#endif
 #ifdef BSP_USING_HW_I2C6
     I2C6_INDEX,
 #endif
@@ -63,6 +77,10 @@ static struct ifx_i2c_config i2c_config[] =
         I2C3_CONFIG,
 #endif

+#ifdef BSP_USING_HW_I2C4
+        I2C4_CONFIG,
+#endif
+
 #ifdef BSP_USING_HW_I2C6
         I2C6_CONFIG,
 #endif
@@ -145,8 +163,7 @@ void HAL_I2C_Init(struct ifx_i2c *obj)

 int rt_hw_i2c_init(void)
 {
-    rt_err_t result;
-    cyhal_i2c_t mI2C;
+    rt_err_t result = RT_EOK;

     for (int i = 0; i < sizeof(i2c_config) / sizeof(i2c_config[0]); i++)
     {
@@ -157,8 +174,6 @@ int rt_hw_i2c_init(void)
         i2c_objs[i].mI2C_cfg.address = 0;
         i2c_objs[i].mI2C_cfg.frequencyhal_hz = (400000UL);

-        i2c_objs[i].mI2C = mI2C;
-
         i2c_objs[i].i2c_bus.ops = &i2c_ops;

         HAL_I2C_Init(&i2c_objs[i]);
@@ -171,4 +186,4 @@ int rt_hw_i2c_init(void)
 }
 INIT_DEVICE_EXPORT(rt_hw_i2c_init);

-#endif /* defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) */
+#endif /* RT_USING_I2C */

4.1 修改I2C和ssd1306软件包配置

首先,打开RT-Thread Settings的详细配置,切换到硬件标签页,关闭“Enable Software I2C Bus”配置项,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

接着,打开“Enable Hardware I2C Bus”配置项,再打开其中的“Enable I2C4 Bus (Arduino I2C)”配置项,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

最后,再次搜索ssd1306,点击悬浮菜单,跳回到ssd1306配置,修改I2C bus name为 i2c4 ,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

完成修改后,按Ctrl+S保存配置。

4.2 编译、下载、运行

重新Ctrl+B编译,Ctrl+Alt+D下载,按RESET键复位之后,重新运行 ssd1306_TestAll 命令,可以看到,OLED屏幕成功显示画面了。

并且,这一次测得的帧率为7fps,如下图所示:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

这次显示画面快了很多,之前只有2fps,现在已经7fps了;但还是不够高,还可以继续优化。

接下来继续优化,提高帧率,提高帧率的思路:

  • 提高I2C时钟信号频率
  • 减少一帧画面发送数据量

4.3 提高I2C时钟信号频率

接下来,分别从这两方面尝试提升帧率。

首先是提升I2C频率,默认的速度写在drv_i2c.c代码里面:

i2c_objs[i].mI2C_cfg.frequencyhal_hz = (400000UL); // 400K

查阅芯片手册,可以知道CY8C624ABZI芯片I2C最高支持1Mbps:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

将drv_i2c.c里面的默认I2C频率改为1M之后,测试显示的帧率为12fps:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

4.5 减少一帧画面发送数据量

查看ssd1306.c文件,发现可以优化的代码:

// Send data
void ssd1306_WriteData(uint8_t* buffer, size_t buff_size) 
{
#if PKG_USING_SSD1306_HW_I2C
    HAL_I2C_Mem_Write(&SSD1306_I2C_PORT, SSD1306_I2C_ADDR, 0x40, 1, buffer, buff_size, HAL_MAX_DELAY);
#else
   for (int i = 0; i < buff_size; i++)
   {
       uint8_t buf[2] = {SSD1306_CTRL_DATA, buffer[i]};
       rt_i2c_master_send(i2c_bus, SSD1306_I2C_ADDR, RT_I2C_WR, buf, 2);
   }
#endif
}

这段代码中,PKG_USING_SSD1306_HW_I2C 宏内部的分支是STM32的代码,不用关系,主要看下面的分支;

下面的分支,使用了一个for循环,调用rt_i2c_master_send接口,每次却只发送两个字节,存在重复的大量的SSD1306_CTRL_DATA字节。

查询SSD1306数据手册,可以知道,它是支持在一个数据标记字节之后,连续发送数据的:

相应的可以优化为:

// Send data
void ssd1306_WriteData(uint8_t* buffer, size_t buff_size) 
{
    uint32_t len = buff_size + 1;
    uint8_t* data = rt_malloc(len); // 申请一个更大的缓冲
    RT_ASSERT(data);

    // 准备数据
    data[0] = SSD1306_CTRL_DATA;
    rt_memcpy(&data[1], buffer, buff_size);

    // 发送
    rt_i2c_master_send(i2c_bus, SSD1306_I2C_ADDR, RT_I2C_WR, data, len);

    rt_free(data); // 释放
}

这段代码修改之后,再次运行,测得帧率为45fps:

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

更进一步检查,发现还有优化空间:

void ssd1306_UpdateScreen(void) 
{
    // Write data to each page of RAM. Number of pages
    // depends on the screen height:
    //
    //  * 32px   ==  4 pages
    //  * 64px   ==  8 pages
    //  * 128px  ==  16 pages
    for(uint8_t i = 0; i < SSD1306_HEIGHT/8; i++) 
    {
        ssd1306_WriteCommand(0xB0 + i); // Set the current RAM page address.
        ssd1306_WriteCommand(0x00);
        ssd1306_WriteCommand(0x10);
        ssd1306_WriteData(&SSD1306_Buffer[SSD1306_WIDTH*i],SSD1306_WIDTH);
    }
}

这个函数里面,从注释可以知道,对于128x64分辨率的屏,会分为8页进行发送;每个页面发送开始的时候,会调用三次ssd1306_WriteCommand函数。

实际上可以不需要重复调用ssd1306_WriteCommand函数:

void ssd1306_UpdateScreen(void) 
{
    uint8_t cmd[] = {
        0X21,   // 设置列起始和结束地址
        0X00,   // 列起始地址 0
        0X7F,   // 列终止地址 127
        0X22,   // 设置页起始和结束地址
        0X00,   // 页起始地址 0
        0X07,   // 页终止地址 7
    };
    uint32_t count = 0;
    uint8_t data[2 * sizeof(cmd) + 1 + SSD1306_BUFFER_SIZE ] = {};

    // copy cmd
    for (uint32_t i = 0; i < sizeof(cmd)/sizeof(cmd[0]); i++) {
        data[count++] = SSD1306_CTRL_CMD | SSD1306_MASK_CONT;
        data[count++] = cmd[i];
    }

    // copy frame data
    data[count++] = SSD1306_CTRL_DATA;
    memcpy(&data[count], SSD1306_Buffer, sizeof(SSD1306_Buffer));
    count += sizeof(SSD1306_Buffer);

    // send to i2c bus
    rt_i2c_master_send(i2c_bus, SSD1306_I2C_ADDR, RT_I2C_WR, data, count);
}

【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS,MCU,I2C,OLED,SSD1306,PSoC,英飞凌,嵌入式

非常快了,已经是最初2fps的25倍。

最终达到的帧率并没有达到OLED屏幕的物理极限,可能还存在一些优化空间,感兴趣的读者还可以在此基础上继续探索。

文章就到这里,感谢阅读,下次再会~文章来源地址https://www.toymoban.com/news/detail-599815.html

五、参考链接

  1. RTT PSoC开发板原理图:IFX-PSoC6-RT-Thread-sch.pdf (gitee.com)
  2. CY8C624A 芯片数据手册:Infineon-PSOC_6_MCU_CY8C62X8_CY8C62XA-DataSheet-v18_00-EN.pdf
  3. CY8C624A 架构参考手册: Infineon-PSoC_6_MCU_CY8C6xx8_CY8C6xxA_Architecture_Technical_Reference_Manual_(TRM)-AdditionalTechnicalInformation-v08_00-EN.pdf
  4. CY8C624A 寄存器参考手册: Infineon-PSoC_6_MCU_CY8C62x8_CY8C62xA_Registers_Technical_Reference_Manual-AdditionalTechnicalInformation-v06_00-EN.pdf
  5. Cypress HAL接口参考: Redirecting to Infineon GitHub (cypresssemiconductorco.github.io)

到了这里,关于【英飞凌PSoC 6】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32硬件I2C通信外设

    本文主要介绍stm32自带的I2C通信外设,对比与软件模拟I2C,硬件I2C可以自动生成时序,时序的操作更加及时规范,可以实现更加高性能的IIC通信。 本文内容与I2C软件通信有诸多类似之处,I2C软件通信可见:https://blog.csdn.net/qq_53922901/article/details/136662006?spm=1001.2014.3001.5501 在8位指

    2024年04月08日
    浏览(95)
  • 基于英飞凌MCU PSoC™ 6的 Matter智能家居解决方案

    本文转载自:英飞凌官微 2019年底,中国已成为全球最大的物联网市场,全球15亿台蜂窝网络连接设备中9.6亿台来自中国,占比64%。国内智能家居产品和解决方案的普及程度不断提高,消费者对智能家居设备的需求也不断增加。根据预测,到2025年,中国智能家居市场的规模将

    2024年01月19日
    浏览(35)
  • 【科普贴】I2C接口详解——偏硬件解析

    I2C最早是Philips公司开发的一款简单的双向总线,实现有效的IC控制。把这个总线写成Inter IC 简称IIC或I2C(PS:说白了2就是两个“I”的意思。) I2C总线一些特征: 1、 只有两根线分别是串行数据线(SDA),串行时钟线(SCL)。 2、 每个连接到总线的器件有唯一一个地址。 3、

    2024年02月07日
    浏览(47)
  • Hi3861 硬件 i2c 驱动 oled

    最近想用 3861 做个有意思的东西,记录一下开发过程。今天使用 3861 的硬件 i2c 驱动 oled。 硬件平台:Bearpi-Nano 软件SDK:润和sdk 我之前写过一篇基于 stm32cubemx 快速使用 iic 接口 oled 的过程,里面有现成的 oled 接口,我们只要直接拿过来替换掉底层接口就行。  STM32CubeMX驱动4脚

    2023年04月23日
    浏览(45)
  • 【文末福利】我用英飞凌的PSoC™ 62搞了点智能家居的创意

    概要 本文给大家介绍一个Infineon和ChatGPT的人工智能语音小管家项目,该项目是博主架构师李肯参加由RT-Thread与英飞凌联合举办的2023英飞凌创意创客大赛的参赛项目,旨在探索智能硬件+智能音箱+ChatGPT的超级组合在C端市场的潜在应用,希望能给大家带来帮助和启发。 如今,智

    2024年02月16日
    浏览(39)
  • 【STM32】入门(七):I2C硬件控制方式

    之所以叫“I2C硬件控制方式”是与“软件控制方式”相对。I2C软件控制,就是写程序直接操作两个GPIO引脚,分别作为时钟线SCL和数据线SDA,按照I2C协议的时序要求,操作GPIO输入、输出、高电平、低电平。 听着就很复杂,好在STM32中有I2C的硬件实现,即通过简单的操作寄存器

    2023年04月08日
    浏览(46)
  • STM32F407系列硬件I2C笔记

    STM32F407系列有3个硬件I2C: I2C1:该接口位于GPIOB引脚上,包括PB6(I2C1_SCL)和PB7(I2C1_SDA)。 I2C2:该接口位于GPIOB引脚上,包括PB10(I2C2_SCL)和PB11(I2C2_SDA)。 I2C3:该接口位于GPIOA和GPIOC引脚上,包括PA8(I2C3_SCL)和PC9(I2C3_SDA)。   硬件I2C的速度比软件I2C更快,硬件I2C通常可以

    2024年02月04日
    浏览(45)
  • GD32 单片机 硬件I2C死锁解决方法

    在I2C恢复函数下个断点(检测到I2C多次超时之后,应该能跳转到I2C恢复函数) 使用镊子,将SCL与SDA短接,很快就能看到程序停到恢复函数的断点上,此时再执行恢复函数,看能否正常走出(可在回复函数中写个死循环,只有I2C正常才跳出,检测I2C正常的办法,可以读从设备的

    2024年02月05日
    浏览(60)
  • 【STM32】软件I2C的使用 —— 看这一篇就够了(附代码)

    欢迎来到我的博客。今天我想向大家介绍一下STM32软件I2C功能。 首先,让我们来了解一下I2C(Inter-Integrated Circuit)总线。I2C是一种串行通信总线,最初由Philips公司开发。它允许多个设备使用同一条总线进行通信,并且每个设备都有唯一的地址。I2C通常用于连接微控制器、传感

    2024年02月06日
    浏览(38)
  • STM32F030硬件I2C代码及解析

    刚接触STM32的时候,第一个学习的就是I2C,当时去网上学习别人写得I2C代码,虽然能用,但是当时并不理解为什么要这么配置,特别希望有人把代码掰碎了讲讲看,今天突然想起来,就把以前写的I2C代码拿出来掰碎了捋捋,希望对新手有些帮助。 先说说STM32的I2C: ST的M3系列还

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包