STM32 I2C写入驱动数码管显示实验

描述

实验环境

Matlab版本: 2021b

操作系统 :Win10专业版

硬件平台 :YF-STM32-ALPHA 1R4

实验内容 :I2C驱动数码管芯片显示‘0’~‘A’字符

模型与原理图

本次实验所用到的simulink模型如图5.2所示,电路原理图如图5.3所示,实验效果为数码管从‘0’~‘A’轮流显示,如图5.1所示。

Simulink

图5.1 数码管驱动显示实验效果

Simulink

图5.2 数码管显示I2C驱动模型

Simulink

图5.3 CH422G共阴数码管电路连接

基础模型介绍与分析

1、数码管简介

数码管简单来说就是将多个LED有规律的排列在一起,实验中用到的数码管外观如图5.4所示,其型号为:FJ3461AH,三维尺寸:30.00mmx14.00mmx7.20mm,数码管内部为共阴极,内部电路原理和引脚定义如图5.5图所示。

Simulink

图5.4 数码管实物外观

Simulink

图5.5 数码管尺寸及内部电路原理图

2、CH422G芯片介绍

数码管驱动芯片CH422引脚分布如图5.6所示,引脚定义解释参考表5.1。

Simulink

图5.6 数码管驱动芯片

表5.1 CH422G芯片引脚功能说明

引脚号引脚名称类型引脚说明
14VCC电源正电源,持续电流不小于 100mA
7GND电源公共接地,持续电流不小于 100mA
1~4、12、13、15、16、SEG0~SEG7三态输出及输入数码管的段驱动,高电平有效,双向输入输出,内置弱上拉电阻
8~11DIG0~DIG3推挽或开漏输出数码管的字驱动,低电平有效,通用输出,可选开漏输出,低电平有效
5SDA开漏输出及输入2 线串行接口的数据输入和输出,内置上拉电阻
6SCL输入2 线串行接口的数据时钟

3、simulink模型分析

本次实验中只用到I2C写模型,写I2C数据核心模型如图5.7所示,其参数设置如图5.8所示,其中“I2C module”用于设置选用哪个I2C,即STM32中常说的I2C0,I2C1,I2C2,实验中用到的I2C芯片连接在I2C2(PB10->SCL,PB11->SDA)上,"Slave address"用于设置I2C器件地址,图中为了便于理解,使用了一个hex2dec('24')模型转换函数,“Slave register addr”用于设置寄存器地址,参数设置基本就介绍这些,后面用到其它方式再逐一介绍,这里面的具体参数含义稍后为大家解答。

Simulink

图5.7 I2C向寄存器写数据模型

Simulink

图5.8 I2C写模型参数设置

在驱动CH422芯片前,我们首先要知道进行哪些参数设置和数据写入才能使数码管正常工作,如下代码所示,先对芯片进行设置(读者朋友对着操作即可,此代码为官方提供的参考代码,官方手册上只有0x48和0x46有简要说明),我们只需往0x48,0x44,0x46地址中写入固定数据,最后往0x60地址中写如要显示的数据即可。

/* 共阴数码管编码表 0~F */
unsigned char BCD_decode_tab[ 0x10 ] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 };   //0--9数码管数字




CH422_Write(0x48,0x01);  /* 设置输出引脚 DIG0~DIG3 开漏输出使能  */
CH422_Write(0x44,0x00);  /* 设置低8位开漏输出命令,默认方式 */
CH422_Write(0x46,0x00);  /* DIG0~DIG3使引脚输出低电平 */


CH422_Write(0x60,BCD_decode_tab[i]); /* 设置双向输入输出命令,显示数据用 */

这里作者首先用C语言方式正常驱动数码管工作,如图5.9所示,这是参数设置过程正确时逻辑分析仪捕获到的I2C波形,图5.10为正常显示数字过程中捕获到的I2C波形。

Simulink

图5.9 C语言方式正常设置数码管波形

Simulink

图5.10 C语言方式正常显示数字波形

为了实现上述相同的效果,我们需要在simulink对参数进行设置来达到上述效果,0x48,0x44,0x46参数设置如图5.11~5.13所示,细心的读者应该有发现,器件地址与C语言写的地址不一样,这里作者暂时没找到原因,但是好在还有一定的规律可循,最终得到的波形如图5.14所示,与C语言驱动的还是有点不一样,只代表其能工作,图中首次出现一个脉冲符号样式,"Enable"模型它是作为子模型的使能用,另外就是每一个写入模型都是放在一个子模型中,方便对数据进行控制操作。

Simulink

图5.11 simulink中"0x48"写入“0x01”

Simulink

图5.12 simulink中"0x44"写入“0x00”

Simulink

图5.13 simulink中"0x46"写入“0x00”

Simulink

图5.14 使用simulink模型初始化数码管I2C波形

数码管显示数据显示模型如图5.15所示,地址部分还是一样的问题,只是寄存器部分数据可以正常使用编码表中的十六进制数据,最终的波形如图5.16所示。

Simulink

图5.15 simulink中"0x60"写入“0x3F”

Simulink

图5.16 simulink模型“0x60”显示字母'A'指令波形

最后我们来看下整个模型,参考图5.2中,除最后一个显示模型,其它所有的I2C写入模型都是顺序执行,且都只执行一次,最终停留在在显示字符'A'处。

实验代码统一放在码云上,有问题欢迎给我留言!!

总结

本节实验中实现了一个基本I2C驱动数码管显示实验,模型中初步做到了参数初始化和数据显示写入,但是这里有个问题,我们无法使用硬件在环修改参数达到同步修改数码管数据的效果,这里读者朋友可以研究研究下。另外本节中还有个问题就是数据显示不是循环显示,大家也可以修改模型实现循环滚动显示。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分