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

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

[复制链接]
wujique 发布时间:2018-5-11 12:21
上次发帖说要做一套能用的代码,感觉太自大了。
- X$ I6 Y- m& n# I还不如从小处做起。& ?7 v+ s' \" b5 E1 B! I+ `
这几天鼓捣了几个文件,实现了一些功能。
6 |8 a& W& e  `6 G3 ?. n怎么实现的?有兴趣可以自己看代码,没时间的就等等,等稳定了我做个文档说明。
0 p. r6 {) X. e8 n2 O
7 a  N' q) r% c& w) q4 O2 U现在,我先说说能干啥。2 h. o5 }& {( e$ B1 {; t7 _( w: j

) M& Y$ {$ m/ J" S1 [1 有个COG LCD接在SPI接口上,现在要改一下CS脚
( Q1 i  |9 k( v4 X% o' _$ B用了我这个代码,不用改驱动,只需要将原来的SPI通道定义的CS脚改改,OK
8 r7 s5 K0 B, a5 f0 w- G
  1. DevSpiCh DevSpi3CH2={
    . |8 x/ K/ }, w- a) w
  2.                 "SPI3_CH2",
    - k( U6 q; A; u
  3.                 "SPI3",
    9 h( E  N* ]- z. H1 P# o/ X. R! P
  4.                
    # e5 M, j1 V$ ?" d) X* g
  5.                 MCU_PORT_G,
    4 y# N1 e. I9 i" o) u% }5 a
  6.                 GPIO_Pin_15,
    1 s3 ~5 G8 J$ q' C8 j
  7.                 . F$ b$ [' e. L3 j7 c8 w
  8.         };
复制代码
2 你说不对,不是改CS,而是要多用一个CS脚控制LCD,原来的CS用做其他用处,SPI控制器还是一个& o9 r8 T/ I( }3 G- ]4 l
好,我们加一个SPI通道
; V: A, `* U3 D3 ^
  1. DevSpiCh DevSpi3CH2={$ u6 x! v. J- V0 r
  2.                 "SPI3_CH3",- Y& P4 V3 W2 b/ I7 a2 l
  3.                 "SPI3",4 {' x! N9 K0 x; I& w
  4.                 ' G7 R- ~# M% E( _
  5.                 MCU_PORT_G,
    , T3 J) K; f' L5 f9 D
  6.                 GPIO_Pin_14,: O$ I% a# L. n4 Z( m
  7.                
    + q1 m4 H. x% b
  8.         };
复制代码
再定义一个LCD接口,基于这个新的SPI通道上,
0 n0 j7 g2 D$ I; f' A
  1. DevLcdBus BusLcdSpi3={& U# h+ D4 k1 H* S0 n) f' W  ]1 w- C
  2.         .name = "BusLcdSpi3",1 E9 z6 _: K0 G' D
  3.         .type = LCD_BUS_SPI,
    8 N2 E# Z4 Y( ]6 _
  4.         .basebus = "SPI3_CH3",- D  q4 L+ k% Z& Z' q7 a: ^- V3 O
  5. ( Z: M( C1 O# o* ]$ G
  6.         .A0port = MCU_PORT_G,
    6 t  f) |# n; d$ h( u  e
  7.         .A0pin = GPIO_Pin_4,4 M) f- [' i9 p2 t8 h

  8. 5 J" i. Z; w9 ~" j* m' i! ~% V5 B
  9.         .rstport = MCU_PORT_G,, k6 h. R/ Y& V! V& a. ~8 m. A$ x6 c
  10.         .rstpin = GPIO_Pin_7,; a+ d% j- x$ W/ t* G/ g
  11. $ o0 j$ o2 G! ^! I: _/ A7 f5 Y
  12.         .blport = MCU_PORT_G,
    8 D0 y6 D' _0 Q
  13.         .blpin = GPIO_Pin_9,4 I. H8 Z$ D, Z. j5 A- k) [( m
  14. };
复制代码
再将LCD挂在这个新的LCD通道上,
2 p' O3 c: b8 H8 c: C
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X7565};
复制代码
3 老板今天画饼,说要卖100万台,但是要讲LCD改改,换为高大尚的OLED。
. g- z* x  A, h$ z你暗地想:完了,要改多少代码啊?0 X1 f( ]0 t! a; M, u" q0 y8 Q) ]
别担心,* V7 d  X( f% L" L$ X6 J
将原来的LCD定义改改,也就是改一下驱动ID,接口还是SPI
2 c" {* p  n! k5 x1 j" J
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X1315};
复制代码
SSD1315其实除了初始化跟STR7565不一样外,其他都差不多,根据7565的驱动,造一套驱动,除了初始化不一样,其他都一样,这就叫造。
6 i0 H  B" e' V  [7 f
  1. _lcd_drv OledLcdSSD1615rv = {
    0 F$ v4 o6 i* R/ M. [
  2.                                                         .id = 0X1315,
    8 c. Q" S& v% j1 G3 s; Q; ~" i
  3. ( S# V; N% L1 @0 J
  4.                                                         .init = drv_ssd1615_init,
    & p7 o9 E: L; @! s0 A- `' L
  5.                                                         .draw_point = drv_ST7565_drawpoint,4 `8 C: k* X' S' [# o
  6.                                                         .color_fill = drv_ST7565_color_fill,
    8 Z. ]9 W# K" y) I! L
  7.                                                         .fill = drv_ST7565_fill,
    ; h/ ~% Q: T1 A" a" D8 L
  8.                                                         .onoff = drv_ssd1615_display_onoff,, T( n, w' V3 F
  9.                                                         .prepare_display = drv_ST7565_prepare_display,2 K  r/ `! F4 L8 Z) V/ R% c" {
  10.                                                         .set_dir = drv_ST7565_scan_dir,
    / u, i) D4 F# }' s$ E: i! k
  11.                                                         .backlight = drv_ST7565_lcd_bl
      q, W( D# _! O7 v( ~3 V' p
  12.                                                         };
    ' I; h6 f( j2 e$ o
复制代码
好像搞定了?(建议不要这么轻易做完,老板跟项目经理会认为太简单了,你有多少价值?哈哈)5 j* B3 m) }' W" X, a
4 硬件工程师说IO口不够额,要换I2C的OLED屏,你是不是想说:你不去死?4 k* k9 Y8 V/ x- T2 J5 \. t. o6 t, h
不急,) z3 Z0 A9 l$ }' \" h9 B
定义一条I2C通道$ c" Y* h* l4 b  y: m7 f
  1. DevI2c DevVi2c1={
      M+ s; y6 H: F
  2.                 .name = "VI2C1",
    $ L" x6 H2 H/ n5 q
  3.                
    + m2 q( Y9 a" i, [  S
  4.                 .sclport = MCU_PORT_D,. J# r# @8 T/ {: b/ f9 P
  5.                 .sclpin = GPIO_Pin_6,
    ( u2 N+ _. ]7 u

  6. 0 B% g4 W/ u; h# r1 I
  7.                 .sdaport = MCU_PORT_D,1 b8 W, j' \0 p4 h
  8.                 .sdapin = GPIO_Pin_7,
    9 A% z3 E, t1 Y; e& N% ?
  9.                 };
复制代码
将LCD BUS接口改一下,I2C接口的LCD不用什么A0,背光控制,确实能省3根IO# x# B% d$ i) ?3 Z' v7 h
  1. DevLcdBus BusLcdI2C1={0 Y/ z) z4 X- [, }
  2.         .name = "BusLcdI2C1",3 z* [1 p8 q  I: O7 s
  3.         .type = LCD_BUS_I2C,
    # s! C! Z+ @- V) {& c& s& o. x! \
  4.         .basebus = "VI2C1",
    4 b, C6 F8 _" I* [" r* B

  5. & G  b5 ]/ ]( u1 c  o  i
  6.         /*I2C接口的LCD总线,不需要其他IO*/
    * O! W' [6 |' P

  7. - e: M  j/ {: z, x! T
  8. };
复制代码
把LCD挂到这个LCD接口上去  \  C9 T% q+ H1 R1 e7 l2 V# s8 F" u
  1. DevLcd DevLcdCOG1        =        {"spicoglcd", "BusLcdI2C1", 0X1315};
复制代码
又搞定了。
$ W# x$ j' Q' w% h2 z% e! c/ V$ @" A$ H: R: d
额?好像名字一直都是spiclglcd,要不要改一下?无所谓了,这样命名不好,我们应该命名为“main_display_lcd”,名字跟设备无关,应用就不用改名字。否则我们底层改为OLEDLCD,应用又要跟着改,实在不好,会被应用工程师吐槽的。& r# Q) q  O& z3 ^3 S3 v9 Y1 q

& d, T4 O2 w6 N/ `5 麻蛋,STM32用的好好的,为啥要换芯片?底层要改死额4 G" i% }+ o+ T4 @5 {
没事,至少I2C,SPI ,LCD 不用怎么改,6 C+ U5 l4 Q. M* b
只需要把mcu_spi_stm32.c里面的接口实现就OK。有哪些接口?就几个IO口基本操作而已。
( z% p. U8 M0 E5 n
  1. extern void mcu_io_config_in(MCU_PORT port, u16 pin);
    7 g; ]1 j7 K7 o: |4 m
  2. extern void mcu_io_config_out(MCU_PORT port, u16 pin);
      S2 b* ~2 j8 W2 f, v
  3. extern void mcu_io_output_setbit(MCU_PORT port, u16 pin);
    7 n3 n  s: I9 _. ^$ x) K% s
  4. extern void mcu_io_output_resetbit(MCU_PORT port, u16 pin);
    " A5 M% W0 f* Q  A0 n8 I
  5. extern u8 mcu_io_input_readbit(MCU_PORT port, u16 pin);
复制代码
+ d0 e$ w( r: m

4 h1 i7 }+ N/ ]- T有意思吗?! m5 m( `2 F! q- \0 f; C/ h
简单的,玩玩的,教程,觉得这是脱裤子放屁,搞复杂了。
; F5 D. C, o0 }. G' j
. l7 c* D/ c1 R* A/ _7 a9 M但是如果你做过设备多一点的项目,可能会觉得有点意思。
6 J! U) K; v, m# D/ A/ p8 g因为你有可能遇到过:9 b5 u' V& t/ N1 b0 w& N8 q+ n% Y
1 怎么花屏了?查了半天,发现是在刷屏的时候,有可能操作SPI FLASH,CS管脚没控制好,没做好互斥。4 O' |) q3 F2 W# S- {) h0 s
2 老板说设备要加个小屏幕,驱动IC跟原来的大屏一样,怎么办?复制粘贴原来的代码,所有函数、变量加一个后缀-2,痛苦不?
) G/ J  P' _1 O4 M$ m8 j" k. ~- k/ k8 \* F
有兴趣的自行下载附件。
6 L8 i) B& [% I: W9 J# q) [; H
$ Z  X- p7 C, M3 i" P# @代码在github托管:http://github.com/wujique/stm32f407/tree/sw_arch
4 R# \& w$ k; }4 t. b* D2 a0 R; [6 q$ q9 N4 R
代码是整个系统的,包含了很多其他代码,/ ]6 i  O- g( c/ p0 [( v
上面说的内容,主要在:) }& @; F2 [, }% X7 S/ b' ?
  1. mcu_bsp_stm32.c   IO口操作封装' G8 F4 g3 K! q: m
  2. mcu_i2c.c   I2C核心代码3 D. H2 R( f4 t/ D0 c9 ?$ L
  3. mcu_spi.c     SPI控制器和SPI通道核心代码
    0 j" B8 b: T+ y! q/ C
  4. dev_ILI9341.c  彩屏驱动
    2 Y5 R0 h7 p  D( b( c. |; ?
  5. dev_lcdbus.c    封装LCD硬件接口
    * R2 h- k6 C  p% L9 ?' a
  6. dev_lcd.c       LCD统一对上层接口
    / l9 a. N' W  X' l" }
  7. dev_str7565.c   COG LCD 、OLED LCD驱动
    / Q/ O! {! v4 b2 }- }
  8. dev_spiflash.c   spi flash 驱动
复制代码
% i2 h0 b, }9 F! W+ Z- m

9 M8 B7 c! P( T7 h9 M0 ?" m1 A! N5 S

stm32f407.rar

下载

4.93 MB, 下载次数: 85

评分

参与人数 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
( K5 c& t. u) T- F. k2 ^请问你的GitHub网址是多少?
; {! p% x0 _) q/ ?2 b
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
谢谢分享,很不错
6 ]5 ]! D& o$ W( T- I
wujique 回答时间:2019-2-26 16:15:38
sincomaster 发表于 2019-2-25 10:52; z3 V+ ?+ h, F5 P! F* J
谢谢分享,很不错
& R5 L% Y% E" v3 l  I  b
觉得可以的话,欢迎关注github获取最新代码

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版