TM1650芯片功能
TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。内部集成有 MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强,可适用于 24 小时长期连续工作的应用场合。TM1650 采用 2 线串行传输协议通讯(注意该数据传输协议不是标准的I2C协议)。该芯片只需要通过二个引脚与MCU通讯就可以完成数码管的驱动,可以节省MCU引脚资源,可以简化数码管显示电路的复杂度。可以在百度搜索“基于STM32的常用数码管芯片TM1650驱动”一文
TM1650芯片引脚

TM1650通讯协议
1:开始信号(START)/结束信号(STOP)
开始信号:保持 SCL 为“1”电平,SDA 从“1”跳“0”,认为是开始信号, 如(图 3)A 段;
结束信号:保持 SCL 为“1”电平,SDA 从“0”跳“1”,认为是结束信号, 如(图 3)E 段;
2:ACK 信号
如果本次通讯正常,芯片在串行通讯的第 8 个时钟下降沿后,TM1650 主动把 SDA 拉低。直到检测到 SCL 来了上升沿,SDA 释放为输入状态(对芯片而言),如(图 3)D 段。
3: 写“1”和写“0”。
写“1”:保持 SDA 为“1”电平,SCL 从“0”跳到“1”,再从“1”跳到“0”,则认为是写入“1” 如(图 3)B 段。
写“0”:保持 SDA 为“0”电平,SCL 从“0”跳到“1”,再从“1”跳到“0”,则认为是写入“0” 如(图 3) C 段。

4:一个字节数据传输格式
一个字节数据的传输格式如图 4,数据发送时 MSB 在前,LSB 在后。微处理器的数据通过两线总线接口和 TM1650 通信,在输入数据时当 SCL 是高电平时,SDA 上的信号必须保持不变;只有 SCL 上的时钟信号为低电平时,SDA 上的信号才能改变。数据输入的开始条件是 SCL 为高电平时,SDA 由高变低;结束条件是 SCL 为高时,SDA 由低电平变为高电平。
5:对显存地址写数据的时序:

MCU向TM1650发指令的过程:发START指令,写第1个字节数据,等待ACK确认信号,写第2个字节数据,等待ACK确认信号,发结束指令。
根据TM650的通讯协议,可以编写相关的低层驱动程序,可以通过网络查询到相关的代码,在此提供了相应的库函数。在具体项目中,只需要在I2C.h文件中修改对应的SCL、SDA引脚和所在端口,完成相关引脚的配置。在本项目中使用TM1650来驱动数码管,TM650的SDA引脚(数据线)与MCU的PB11引脚连接,SCL引脚(时钟线)与MCU的PB10引脚相连接。
TM1650使用电路

TM1650底层编程
根据TM650的通讯协议,可以编写相关的低层驱动程序,可以通过网络查询到相关的代码,在此提供了相应的库函数。在本项目中,通过GPIO口来完成TM650的通讯,在工程中直接添加I2C.c文件就可以关的函数进行通讯,另外需要在I2C.h文件中修改对应有SCL、SDA引脚和所在的端口,完成相关引脚的配置,具体代码如下:
#include "stm32f10x.h"
#define I2C_SCL GPIO_Pin_10 //定义I2C时钟线引脚
#define I2C_SDA GPIO_Pin_11 //定义I2C数据线引脚
#define GPIO_I2C GPIOB //定义I2C端口
#define I2C_SCL_H GPIO_SetBits(GPIO_I2C,I2C_SCL) //置指定端口位为高电平
#define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,I2C_SCL) //置指定端口位为低电平
#define I2C_SDA_H GPIO_SetBits(GPIO_I2C,I2C_SDA)
#define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,I2C_SDA) //置指定端口位为低电平
void I2C_Config(void); //自定义初始化I2C函数
void I2C_Start(void); //产生起始信号函数
void I2C_Stop(void); //产生停止信号函数
u8 I2C_Wait_Ack(void); //等待从机应答信号
void I2C_Send_Byte(u8 txd); //I2C 发送一个字节
void I2C_SDA_OUT_Config(void);
void I2C_SDA_IN_Config(void);
向TM1650发送指令编程
根据TM1650发送数据的时序,在TM1650.c中编写TM1650_Set函数,具体代码如下:
void TM1650_Set(u8 add,u8 dat) //数码管显示
{
I2C_Start();
I2C_Send_Byte(add); //第一个显存地址
I2C_Wait_Ack();
I2C_Send_Byte(dat);
I2C_Wait_Ack();
I2C_Stop();
}
该函数有二个参数,第一个是地址,通常用到5个地址,0x48地址用于设置亮度值,0x68地址用于设置四位数码管的左边起第一位,0x6A地址用于设置四位数码管的左边起第二位,0x6C地址用于设置四位数码管的左边起第三位,0x6E地址用于设置四位数码管的左边起第四位。第二个参数是设置的具体值,如果第一个参数是0x48,则为亮度值,如果第一个参数是0x68、0x6A、0x6C、0x6E,则为显示的数字(只能是0-9)。
本文详细介绍了TM1650芯片的功能,包括其键盘扫描接口、LED驱动特性,以及2线串行传输协议。通过分析TM1650的开始信号、结束信号、写入数据的时序,阐述了与MCU的通讯过程。同时,文中提到了TM1650在数码管驱动中的应用,并提供了低层驱动编程的概述。
1800

被折叠的 条评论
为什么被折叠?



