数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2166|回复: 50

[C51] 硬件SPI驱动TM1640

[复制链接]
发表于 2023-5-7 17:38:22 | 显示全部楼层 |阅读模式
TM1640 是一种LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 驱动等电路。本产品性能优良,质量可靠。主要应用于电子产品LED显示屏驱动。采用SOP28的封装形式。

本文仅以驱动TM1640为例,实际上,知道原理后,很容易扩展到其它类似芯片,如TM1668、TM1621等。

TM1640连续写时序如下图:
01-TM1640时序图.png
02-TM1640时序特性.png

这个时序既不是I2C,也不是SPI,但是,一部分像I2C,有Start、Stop,一部分像SPI。
要实现这个控制时序,有2个要点:数据在时钟低电平时改变;时钟高电平时间至少维持1μS。控制这种芯片,一般做法是纯软件照时序图控制,但是,那样会消耗很多CPU时间。

对于有硬件SPI接口的芯片来说,只要简单变通一下,就可以用软硬结合的办法控制TM1640,大大减少CPU时间占用。

大部分芯片SPI时序图是这样,只需控制通讯速率就能满足TM1640控制时序。
03-SPI时序图-CPOL=1_CPHA=1.png

不过,有的芯片SPI时序是这样,需要硬件上处理一下才能满足TM1640控制时序。
04-SPI时序图-CPOL=0_CPHA=1.png

控制要点:
(1)确保数据在时钟低电平时改变数据,对于那些SPI接口在时钟高电平时改变数据的芯片,在时钟线加RC积分电路把时钟上升沿推后,确保数据在时钟低电平时改变。
05-SCLK加RC积分电路.png

部分RC参数测试结果如下:
RC积分电路参数.png

(2)初始化时不使能SPI,只需用一般GPIO方式控制MOSI和SCLK输出高电平。
(3)开始发送数据时,用一般GPIO方式控制MOSI和SCLK输出高电平输出一个启动信号(MOSI输出电平一会后SCLK输出低电平)。
(4)SPI接口初始化配置为:先发送数据低位、CPOL=0、CPHA=1(空闲时时钟=低电平,数据在第二个边沿采样),使能SPI,使能SPI中断(数据量不多,DMA意义不大),发送Command1:设置数据。
(5)在SPI中断服务程序中禁用SPI,用一般GPIO方式控制MOSI和SCLK输出一个停止信号和一个启动信号,然后使能SPI,发送Command2:设置地址。
(6)中断方式继续发送数据直到显示数据发送完成。
(7)最后一个字节显示数据发送完成后的SPI中断禁用SPI,用一般GPIO方式控制MOSI和SCLK输出一个停止信号和一个启动信号,然后使能SPI,发送Command3:控制显示。
(8)发送Command3后的SPI中断禁用SPI,用一般GPIO方式控制MOSI和SCLK输出一个停止信号,一次显示数据输出完成。

上述处理信号时序如下:
07-硬件SPI驱动TM1640逻辑图.png

实际信号如下:
08-硬件SPI加RC驱动TM1640信号图.png

扩展应用
对像TM1668那样多了STB通讯线的芯片,只需在输出STB信号的地方禁用SPI,输出STB信号,然后使能SPI继续通讯即可。
09-扩展应用1.png

对需要一个前导位+8数据位的SPI通讯,只需禁用SPI,输出前导位,然后再使能SPI发送8位数据即可。
10-扩展应用2.png

22楼更新代码:

打赏

参与人数 5家元 +100 收起 理由
jf201006 + 20 謝謝分享
hongo + 20 原創內容
cushion + 20 優秀文章
aping365 + 20 優秀文章
慕名而来 + 20 優秀文章

查看全部打赏

发表于 2023-5-7 17:53:15 | 显示全部楼层
LZ高手,研究的狗透彻
回复 支持 反对

使用道具 举报

发表于 2023-5-7 18:03:23 | 显示全部楼层
这才是真正研究到位的!赞!!
回复 支持 反对

使用道具 举报

发表于 2023-5-7 21:04:41 | 显示全部楼层
楼主你好,关于本帖中的最后一个时序图片的实现,我曾经也想利用I/O模拟发送D/CX加硬件SPI的方式实现,但是用STC单片机弄了很久未能实现,因为想不到可以用阻容延时来改变起始电平状态所以一直未能实现,很希望楼主能贴一段STC单片机适用的关于这种type c时序的硬件SPI代码来学习一下,先谢了。
回复 支持 反对

使用道具 举报

发表于 2023-5-7 21:49:39 | 显示全部楼层
TM1640是好东西,我开始买了5片作验证,成功后又买了20片作备用。

看我的程序     https://www.mydigit.cn/thread-378745-1-1.html
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-7 22:20:34 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2023-5-7 21:04
楼主你好,关于本帖中的最后一个时序图片的实现,我曾经也想利用I/O模拟发送D/CX加硬件SPI的方式实现,但是 ...

如果要控制的设备也是SPI接口只是多一位数据的话,是不需要加RC延时的,只需程序上加一位数据即可。我手上没有需要9位格式的通讯的芯片,有空我写一段你试下能不能用。
回复 支持 反对

使用道具 举报

发表于 2023-5-7 23:27:03 | 显示全部楼层
其实还是io模拟更好,类似i2c, 这种读写数据量很小,也只有键盘扫描或者显示更新才会运行,基本不消耗什么资源, 大可不必简单问题复杂化

spi资源更珍贵,稍微做个复杂点的,spi口都不够用,64/100脚的stm32通常3个spi, 有些spi还会别的复用冲突
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-8 00:15:18 | 显示全部楼层
反复看了这个帖子,一直不明白用硬件SPI驱动TM1640的意义是什么,TM1640的数据量不大,对速度要求不高,任意单片机用IO模拟就完全可以了,本身就不是标准的IIC,也不是标准的SPI。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-8 01:43:33 来自手机浏览器 | 显示全部楼层
inthsunshine 发表于 2023-5-7 23:27
其实还是io模拟更好,类似i2c, 这种读写数据量很小,也只有键盘扫描或者显示更新才会运行,基本不消耗什么 ...

本文只是一种方法来讲,当SPI接口紧缺而且有更重要的用途,当然要取舍,如果空闲,为什么不用呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-8 01:54:38 来自手机浏览器 | 显示全部楼层
595953427@qq 发表于 2023-5-8 00:15
反复看了这个帖子,一直不明白用硬件SPI驱动TM1640的意义是什么,TM1640的数据量不大,对速度要求不高,任 ...

我个人的习惯是,能用硬件接口通讯就不用软件模拟,就这个TM1640来说,刚开始不加RC电路之前无法点亮,已用软件模拟方式点亮了,但这不是我想要的,于是,想出了这种方法。
回复 支持 反对

使用道具 举报

发表于 2023-5-8 08:30:30 来自手机浏览器 | 显示全部楼层
mmxx2015 发表于 2023-5-8 01:54
我个人的习惯是,能用硬件接口通讯就不用软件模拟,就这个TM1640来说,刚开始不加RC电路之前无法点亮,已 ...

我的看法完全相反,能用IO模拟解决的就不用硬件解决,除非数据量大,速度要快,要用DMA,否则就用IO模拟
回复 支持 反对

使用道具 举报

发表于 2023-5-8 09:38:20 | 显示全部楼层
mmxx2015 发表于 2023-5-8 01:43
本文只是一种方法来讲,当SPI接口紧缺而且有更重要的用途,当然要取舍,如果空闲,为什么不用呢? ...

不过从你的操作过程看,远比io模拟更复杂, 一会开中断一会关中断;IO模式一会复用,一会通用,硬件上还要加RC, RC取值还有讲究
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-8 10:00:21 来自手机浏览器 | 显示全部楼层
本帖最后由 mmxx2015 于 2023-5-8 10:01 编辑
inthsunshine 发表于 2023-5-8 09:38
不过从你的操作过程看,远比io模拟更复杂, 一会开中断一会关中断;IO模式一会复用,一会通用,硬件上还 ...


不用关中断啊,只需在中断中禁用SPI,发完stop、start再使能SPI。
RC的值是可以大概计算的。
回复 支持 反对

使用道具 举报

发表于 2023-5-8 11:11:08 | 显示全部楼层
mmxx2015 发表于 2023-5-7 22:20
如果要控制的设备也是SPI接口只是多一位数据的话,是不需要加RC延时的,只需程序上加一位数据即可。我手 ...

多谢,期待看到你的代码,其实我的这个三线spi屏也已经驱动成功很久了,现在使用中的是通过可寻址位变量逐位输出模拟SPI的模式,用STC硬件驱动也测试成功了只是需要发送两次8位数据,一直想通过I/O模拟一位数据+8位SPI硬件的模式驱动却无法实现,看到你的实验又勾起了我的兴趣想再玩一玩。我现在用的代码如下,这个代码看似复杂其实效率是很高的,STC8H8K64TL单片机时钟频率超过22M就无法通讯了,这种C接口的屏幕貌似通讯速度快不起来的。

  1. voidwrite_data(u8 dat)
  2. {
  3. bitdata=dat;
  4. sda=1;
  5. scl=0;scl=1;//D/C=1写数据
  6. sda=bit7;
  7. scl=0;scl=1;
  8. sda=bit6;
  9. scl=0;scl=1;
  10. sda=bit5;
  11. scl=0;scl=1;
  12. sda=bit4;
  13. scl=0;scl=1;
  14. sda=bit3;
  15. scl=0;scl=1;
  16. sda=bit2;
  17. scl=0;scl=1;
  18. sda=bit1;
  19. scl=0;scl=1;
  20. sda=bit0;
  21. scl=0;scl=1;
  22. }
复制代码


回复 支持 反对

使用道具 举报

发表于 2023-5-8 14:00:22 | 显示全部楼层
STC8H4K64TL-45MHz-LQFP48,最高频率可以达到45M,放心使用。
回复 支持 反对

使用道具 举报

发表于 2023-5-8 18:27:06 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2023-5-8 11:11
多谢,期待看到你的代码,其实我的这个三线spi屏也已经驱动成功很久了,现在使用中的是通过可寻址位变量 ...

速度太快通迅异常,有没有可能是芯片IO口的速度跟不上CPU的速度?

一般SPI接口的液晶屏的接口速度是非常快的
回复 支持 反对

使用道具 举报

发表于 2023-5-8 21:23:16 | 显示全部楼层
595953427@qq 发表于 2023-5-8 18:27
速度太快通迅异常,有没有可能是芯片IO口的速度跟不上CPU的速度?

一般SPI接口的液晶屏的接口速度是非常 ...

这我就不太清楚了,我也只是能做到模拟时序实现基本驱动,如楼主那样清晰的分析原理我还做不来。
回复 支持 反对

使用道具 举报

发表于 2023-5-8 22:07:52 | 显示全部楼层
慕名而来 发表于 2023-5-8 21:23
这我就不太清楚了,我也只是能做到模拟时序实现基本驱动,如楼主那样清晰的分析原理我还做不来。 ...

一般的芯片都是CPU的速度比外设的速度快,比如STM32F103,CPU速度是72M,GPIO的速度最高只有50M,如果CPU不停的让IO输出高低电平,可能IO会反应不过来,导致实际输出的波形出错,然后导致通讯出错。
回复 支持 反对

使用道具 举报

发表于 2023-5-8 22:21:39 来自手机浏览器 | 显示全部楼层
大多情况下是cpu性能过剩,一般项目不会这么折腾,但有研究的意义
回复 支持 反对

使用道具 举报

发表于 2023-5-8 22:24:38 | 显示全部楼层
595953427@qq 发表于 2023-5-8 22:07
一般的芯片都是CPU的速度比外设的速度快,比如STM32F103,CPU速度是72M,GPIO的速度最高只有50M,如果CPU ...

明白了,找时间我用STM32再测试一下这段代码,谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2023-5-30 08:23 , Processed in 0.109200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表