你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

能用的SPI、I2C、SPI FLASH、LCD代码

[复制链接]
wujique 发布时间:2018-5-11 12:21
上次发帖说要做一套能用的代码,感觉太自大了。
/ R/ T4 g$ y- x" T! R1 [还不如从小处做起。; R9 h5 P/ [# c+ T+ g6 v
这几天鼓捣了几个文件,实现了一些功能。* _4 ]8 A2 G0 J) y4 R
怎么实现的?有兴趣可以自己看代码,没时间的就等等,等稳定了我做个文档说明。
6 `5 i1 h: y3 J" N3 ]: p. b$ G& Y, l( @+ z/ y
现在,我先说说能干啥。
  i$ J7 m3 L& |" u1 h. ^, B: v
' n5 q( ^1 }& m! Y. U- t! d/ r1 有个COG LCD接在SPI接口上,现在要改一下CS脚- f, f. L2 P6 j8 |+ G* W
用了我这个代码,不用改驱动,只需要将原来的SPI通道定义的CS脚改改,OK
' J1 R6 N) l& |$ u# Y
  1. DevSpiCh DevSpi3CH2={' g* K% [0 O+ q, P5 x
  2.                 "SPI3_CH2",
    ! I# [5 l5 i4 C! s. M2 k6 h3 u
  3.                 "SPI3",
    + M( l  z9 o( G' F; v4 q4 s1 {
  4.                
    7 ?2 p! v; l! T* O( k
  5.                 MCU_PORT_G,
    0 i5 J6 {& y8 z7 \2 n) Q' o
  6.                 GPIO_Pin_15,8 ^* ?$ h, w$ C: a
  7.                
    ; C* t5 \, M3 H6 e
  8.         };
复制代码
2 你说不对,不是改CS,而是要多用一个CS脚控制LCD,原来的CS用做其他用处,SPI控制器还是一个
: R7 V  ]. ^3 I. W; Z: v: _好,我们加一个SPI通道" ?$ W1 w1 Y3 C6 }4 V
  1. DevSpiCh DevSpi3CH2={0 N4 q) m8 ?: E% ]* |  R2 k
  2.                 "SPI3_CH3",- k+ p: h+ V8 t0 C, o0 c: q
  3.                 "SPI3",
    6 o# U3 O  i6 R* }
  4.                
    . G- c% L9 G$ e$ U/ z- M# [
  5.                 MCU_PORT_G,$ v0 e1 G: k: r) O0 Q" t; }
  6.                 GPIO_Pin_14,1 X( d  g% J! r. Y/ }/ d0 E
  7.                
    7 U4 V+ u' [$ D$ \- A2 a" K3 G
  8.         };
复制代码
再定义一个LCD接口,基于这个新的SPI通道上,
7 K4 G, n# z0 f$ }
  1. DevLcdBus BusLcdSpi3={
    7 x, x9 {& }. X$ R' ^2 T, Z# U0 p
  2.         .name = "BusLcdSpi3",
    - S$ X, |0 N. Y: C
  3.         .type = LCD_BUS_SPI,6 Q) {$ z/ i" c
  4.         .basebus = "SPI3_CH3"," `) W9 I" r2 p" p- J2 y- J0 W0 _
  5. 7 w8 L$ Y. b4 ^8 O
  6.         .A0port = MCU_PORT_G,+ k3 l3 v0 B& Q9 B6 G: h0 {
  7.         .A0pin = GPIO_Pin_4,
    7 k9 K+ m0 `3 L3 X

  8. * R6 ~$ N  e7 W$ T0 G( O: Y4 x7 s
  9.         .rstport = MCU_PORT_G,7 F' z9 b+ e8 C! |
  10.         .rstpin = GPIO_Pin_7,  k3 n) H! e5 |4 d# L

  11. / P% f5 N/ W* Y3 n8 U* |. W. o
  12.         .blport = MCU_PORT_G,
    - Z2 R8 V/ t. Y
  13.         .blpin = GPIO_Pin_9,
    8 {0 U! |1 G2 u. x9 R
  14. };
复制代码
再将LCD挂在这个新的LCD通道上,
. \2 e8 ?) k! v# k/ T# I
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X7565};
复制代码
3 老板今天画饼,说要卖100万台,但是要讲LCD改改,换为高大尚的OLED。
+ Z, j- ?, _- o' H- s你暗地想:完了,要改多少代码啊?$ }1 P  C9 s8 i9 l5 S
别担心,. c+ l  T, r. D1 B) t9 b+ W8 O
将原来的LCD定义改改,也就是改一下驱动ID,接口还是SPI
6 O* E5 j: S: l. x
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X1315};
复制代码
SSD1315其实除了初始化跟STR7565不一样外,其他都差不多,根据7565的驱动,造一套驱动,除了初始化不一样,其他都一样,这就叫造。, Y5 I$ ~2 u: p8 Y
  1. _lcd_drv OledLcdSSD1615rv = {
    + c. J' M* a3 @- V. G$ C
  2.                                                         .id = 0X1315,
    ' M) Q* ?4 L/ e# Q

  3. . k9 K6 h5 r" d5 d% S
  4.                                                         .init = drv_ssd1615_init,3 L) {; h7 c" F, ^7 i1 l
  5.                                                         .draw_point = drv_ST7565_drawpoint,: y3 n+ e! q' X. D
  6.                                                         .color_fill = drv_ST7565_color_fill,
    4 }2 q  v1 K% a/ g( h  E8 a
  7.                                                         .fill = drv_ST7565_fill,; p) k2 v9 n: N7 R: x
  8.                                                         .onoff = drv_ssd1615_display_onoff,
    6 x0 O8 |8 M; j
  9.                                                         .prepare_display = drv_ST7565_prepare_display,
    1 U; V* v" d3 J2 O9 j7 _6 z
  10.                                                         .set_dir = drv_ST7565_scan_dir,2 c% v7 _! o( X6 w& C# H
  11.                                                         .backlight = drv_ST7565_lcd_bl& V+ v: G; O. }/ T" E
  12.                                                         };
    5 T: X( p4 E9 @6 ?; D
复制代码
好像搞定了?(建议不要这么轻易做完,老板跟项目经理会认为太简单了,你有多少价值?哈哈)1 j% l7 e, r- g# Z! B3 H4 [1 u
4 硬件工程师说IO口不够额,要换I2C的OLED屏,你是不是想说:你不去死?
( F& [" f: _& n/ E  Y# u7 a: s  i% |不急,$ a6 o* u- l4 S5 m, p
定义一条I2C通道7 C8 U6 v/ {* V. s" }
  1. DevI2c DevVi2c1={
    * n# B" Z1 R( \- W+ Q& _, U
  2.                 .name = "VI2C1",
    3 A! M7 @3 r4 f: }+ r
  3.                
    6 S4 T. U9 v$ f: z  P
  4.                 .sclport = MCU_PORT_D,
    . }- G! n- V( m5 O
  5.                 .sclpin = GPIO_Pin_6,
    $ M; a4 z' j% k" _
  6. 1 l  ~0 z$ r4 ^9 p+ V1 {+ U* J
  7.                 .sdaport = MCU_PORT_D,2 z& K- f: C9 ~9 t
  8.                 .sdapin = GPIO_Pin_7," `7 _- S4 E# }0 q1 m( O2 n
  9.                 };
复制代码
将LCD BUS接口改一下,I2C接口的LCD不用什么A0,背光控制,确实能省3根IO
) ^) G! `) d& W) k
  1. DevLcdBus BusLcdI2C1={3 O$ [9 ]( p/ M
  2.         .name = "BusLcdI2C1",, F5 p0 F" _) z% }  C% d& g& |
  3.         .type = LCD_BUS_I2C,$ |- ]* t" ?% O
  4.         .basebus = "VI2C1",1 ^4 d! Q3 [4 x

  5. 5 ?( ~$ V; H2 j+ K& n
  6.         /*I2C接口的LCD总线,不需要其他IO*/" Y3 N! z  A$ A1 h. H5 i8 `% l# Y
  7. ; r& I) G) i, ?, d7 v
  8. };
复制代码
把LCD挂到这个LCD接口上去1 u. J3 V7 L" c9 O
  1. DevLcd DevLcdCOG1        =        {"spicoglcd", "BusLcdI2C1", 0X1315};
复制代码
又搞定了。
, r7 k7 i. F: T9 R: t' k) ]4 A
7 W3 l) K- ~  j" Z( Z& u  R8 G) M) K额?好像名字一直都是spiclglcd,要不要改一下?无所谓了,这样命名不好,我们应该命名为“main_display_lcd”,名字跟设备无关,应用就不用改名字。否则我们底层改为OLEDLCD,应用又要跟着改,实在不好,会被应用工程师吐槽的。
5 \% X# H1 _. {' [7 @
( M1 m( c2 T+ |# K5 麻蛋,STM32用的好好的,为啥要换芯片?底层要改死额! E$ |6 s; {9 M- U
没事,至少I2C,SPI ,LCD 不用怎么改,) L9 Q1 c( _3 k4 y: ?! ]
只需要把mcu_spi_stm32.c里面的接口实现就OK。有哪些接口?就几个IO口基本操作而已。
# I+ p% P- ^/ B3 A+ N1 E
  1. extern void mcu_io_config_in(MCU_PORT port, u16 pin);
    0 \$ \$ O! v1 {2 f5 f
  2. extern void mcu_io_config_out(MCU_PORT port, u16 pin);
    % }8 t, F# N$ G* w7 @
  3. extern void mcu_io_output_setbit(MCU_PORT port, u16 pin);3 r  o6 m4 n! E( h" {) _0 V
  4. extern void mcu_io_output_resetbit(MCU_PORT port, u16 pin);8 W5 i6 C# y' G- w
  5. extern u8 mcu_io_input_readbit(MCU_PORT port, u16 pin);
复制代码

& m$ P+ ^. m& n4 D2 X; G: |$ A" u
6 j$ ?% i0 U$ G1 l" i有意思吗?/ V; f5 a) F4 d: E6 \0 W2 g
简单的,玩玩的,教程,觉得这是脱裤子放屁,搞复杂了。/ D! w! Q( F2 U. Q) |

* \: X% j; ?- Q, s: ]) a; B* p. q但是如果你做过设备多一点的项目,可能会觉得有点意思。- ?6 ?* ~; Y; I" H9 `2 L- J
因为你有可能遇到过:) a5 L9 L3 ~) }
1 怎么花屏了?查了半天,发现是在刷屏的时候,有可能操作SPI FLASH,CS管脚没控制好,没做好互斥。% j- H- L* N' d" v
2 老板说设备要加个小屏幕,驱动IC跟原来的大屏一样,怎么办?复制粘贴原来的代码,所有函数、变量加一个后缀-2,痛苦不?8 J5 y: e' ?7 n4 n
- x/ A, \% L5 q$ B
有兴趣的自行下载附件。
$ i- R4 N) y9 R; t: k" R6 y9 F( A, D: ?% E
代码在github托管:http://github.com/wujique/stm32f407/tree/sw_arch
# l# Q3 a1 j5 c6 _: f" H* w
, L7 j1 F1 G3 k' v代码是整个系统的,包含了很多其他代码,6 R4 K) Y5 i/ i& I9 j( Y0 Z+ v1 @
上面说的内容,主要在:
2 v1 n6 M* Z! a# [9 c- k$ y
  1. mcu_bsp_stm32.c   IO口操作封装3 p9 `7 J8 n" }8 |- W3 S+ }  N8 W" Y9 R
  2. mcu_i2c.c   I2C核心代码
    ! B7 `' Y5 C8 b) j% C5 |
  3. mcu_spi.c     SPI控制器和SPI通道核心代码
    * _: e9 C; K1 i, ?
  4. dev_ILI9341.c  彩屏驱动& [% c, Y. _; u; a" u; B
  5. dev_lcdbus.c    封装LCD硬件接口! N1 Y5 {+ V) s
  6. dev_lcd.c       LCD统一对上层接口: ^2 j7 b; h2 T( r# M/ [& p. G
  7. dev_str7565.c   COG LCD 、OLED LCD驱动
    . i" ^3 `$ R+ Q9 v9 B6 M/ j7 w
  8. dev_spiflash.c   spi flash 驱动
复制代码
& _1 G, j0 C' ~" m$ A) P
2 F0 q6 ]0 }/ D& v! ]

stm32f407.rar

下载

4.93 MB, 下载次数: 83

评分

参与人数 1 ST金币 +8 收起 理由
五哥1 + 8 很给力!

查看全部评分

收藏 5 评论11 发布时间:2018-5-11 12:21

举报

11个回答
zero99 回答时间:2018-5-17 08:55:42
学习了
wujique 回答时间:2018-5-29 09:22:52
最新的代码请到github上获取,仓库会持续更新修正BUG优化性能
勿忘心安110 回答时间:2018-6-21 19:54:19
学习了
勿忘心安110 回答时间:2018-6-21 19:55:34
请问你的GitHub网址是多少?
wujique 回答时间:2018-6-21 23:35:00
勿忘心安110 发表于 2018-6-21 19:55, M+ v, O2 ^% P  J/ U$ n$ v
请问你的GitHub网址是多少?
" p  H& v3 u9 t; z% m8 C
http://github.com/wujique/stm32f407/tree/sw_arch
Kevin_G 回答时间:2019-2-21 10:03:03
很给力!
wdliming-222461 回答时间:2019-2-24 22:20:01
谢谢分享~~
caiyangan 回答时间:2019-2-25 02:14:44
感谢楼主学习一些
西点钟灵毓秀 回答时间:2019-2-25 09:29:58
能用的SPI、I2C、SPI FLASH、LCD代码
sincomaster 回答时间:2019-2-25 10:52:20
谢谢分享,很不错
! m0 _# d- i9 l. D
wujique 回答时间:2019-2-26 16:15:38
sincomaster 发表于 2019-2-25 10:52" d! q4 e) O9 x
谢谢分享,很不错

# M0 f# f0 J) d觉得可以的话,欢迎关注github获取最新代码

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版