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

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

[复制链接]
wujique 发布时间:2018-5-11 12:21
上次发帖说要做一套能用的代码,感觉太自大了。
6 I6 q- m. y( ^% a7 W7 A还不如从小处做起。- M: h  A/ r8 ~4 k7 ^. i
这几天鼓捣了几个文件,实现了一些功能。) X, M& \+ [- {$ H* y! h5 y4 A
怎么实现的?有兴趣可以自己看代码,没时间的就等等,等稳定了我做个文档说明。
+ i1 ^" }: V8 G7 k, C8 M7 d  E/ I. o: J' B
现在,我先说说能干啥。, d+ i; V" [8 ]4 H  L* f

6 n1 Q+ M* i% }1 有个COG LCD接在SPI接口上,现在要改一下CS脚
  J$ `# h7 o$ |" h# w用了我这个代码,不用改驱动,只需要将原来的SPI通道定义的CS脚改改,OK  q* `. y4 L4 S8 i8 q
  1. DevSpiCh DevSpi3CH2={5 Q* D  u& `8 e/ t
  2.                 "SPI3_CH2",  f$ M- ^8 b$ f7 j4 i: |" f
  3.                 "SPI3",/ e0 t4 b. T8 m; o6 v) E. f
  4.                 0 v2 ]# O8 e( v8 h* A
  5.                 MCU_PORT_G,
    6 \) J! N  ~; ~0 @
  6.                 GPIO_Pin_15,; n% t9 i$ Y+ Z: k
  7.                
    : `/ J0 A, B; o3 |: W
  8.         };
复制代码
2 你说不对,不是改CS,而是要多用一个CS脚控制LCD,原来的CS用做其他用处,SPI控制器还是一个
6 `$ P$ x1 H- ]: i  y  r好,我们加一个SPI通道
  R- B) i6 D8 K4 v  `8 x' _
  1. DevSpiCh DevSpi3CH2={
    9 G: m: o; @% j/ N% {! F1 k
  2.                 "SPI3_CH3",
    ; M3 j7 o6 s6 @+ t+ q* t
  3.                 "SPI3",+ D8 q( N* k. F  H( _& ]. p
  4.                 1 w6 N0 g: M# j& g8 @/ g: k
  5.                 MCU_PORT_G,
    3 ~1 f% O! [7 u+ y) p
  6.                 GPIO_Pin_14,$ b: z6 a3 T* |  k* B% {1 a# U- [
  7.                 * {7 y0 P/ q" }1 u4 a
  8.         };
复制代码
再定义一个LCD接口,基于这个新的SPI通道上,
: e, k1 n7 L/ U% f/ ]
  1. DevLcdBus BusLcdSpi3={
    * Y& r- I/ d& P, ]/ R0 y
  2.         .name = "BusLcdSpi3",; n# U; d8 g/ P9 A  t! y
  3.         .type = LCD_BUS_SPI,
      y! I+ j, t' I: @0 o( d! i$ n0 D7 F
  4.         .basebus = "SPI3_CH3",
    & \. ^' R0 F# O4 _5 B( V- C
  5. ; {. K; _- W5 [6 C& `) j& l6 J
  6.         .A0port = MCU_PORT_G,( @$ B+ w" P! q+ l2 I9 K
  7.         .A0pin = GPIO_Pin_4,
    1 ]3 `- e2 S+ o# W. x$ Y. R

  8. % d* [# C' c- o7 C; W
  9.         .rstport = MCU_PORT_G,
    1 b! r  C0 K! e% s( a* z+ }
  10.         .rstpin = GPIO_Pin_7,
    $ S2 R7 t8 u4 {5 S& g2 O4 i5 l
  11. 3 }, Q: x. I8 D
  12.         .blport = MCU_PORT_G,5 n! V; K) i; g4 w+ @
  13.         .blpin = GPIO_Pin_9,
    ! n4 {& O. h5 X  a' S5 f/ M$ r
  14. };
复制代码
再将LCD挂在这个新的LCD通道上,
# S& u" `" a/ t" ?7 `
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X7565};
复制代码
3 老板今天画饼,说要卖100万台,但是要讲LCD改改,换为高大尚的OLED。" N+ L9 @; G4 [" {+ s9 {
你暗地想:完了,要改多少代码啊?
; S. K9 n! q, a# k6 C别担心,% m  O5 Y7 r! g* f- y
将原来的LCD定义改改,也就是改一下驱动ID,接口还是SPI
! S5 w$ C6 ~% c( C0 j* S/ c' P
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X1315};
复制代码
SSD1315其实除了初始化跟STR7565不一样外,其他都差不多,根据7565的驱动,造一套驱动,除了初始化不一样,其他都一样,这就叫造。
1 P1 r8 Q% Z6 B5 Y7 m0 D
  1. _lcd_drv OledLcdSSD1615rv = {
    - `, g" I3 F- \) X; ?6 G
  2.                                                         .id = 0X1315,
    , ?4 [+ \* J8 i
  3. # {, W! s3 }5 Q8 w  W
  4.                                                         .init = drv_ssd1615_init,
    ' J- Y$ y; u4 b6 g
  5.                                                         .draw_point = drv_ST7565_drawpoint,
    : C# U( Y$ `* x, v9 o: i2 r, Z/ }) Q
  6.                                                         .color_fill = drv_ST7565_color_fill,7 f; F5 L$ Z' R* t" E
  7.                                                         .fill = drv_ST7565_fill,
    4 w/ P" G: R# ?, ~4 ]7 j: Q  K
  8.                                                         .onoff = drv_ssd1615_display_onoff,  s. ]8 j" x  m1 J) E  I1 M% M
  9.                                                         .prepare_display = drv_ST7565_prepare_display,/ k5 I0 m9 X7 _, S. ^( f
  10.                                                         .set_dir = drv_ST7565_scan_dir,7 T; _; T" Y3 h
  11.                                                         .backlight = drv_ST7565_lcd_bl7 ~$ u1 T# p/ z: z+ h+ o! Q" h
  12.                                                         };4 ]9 F! \, h, U, |; C
复制代码
好像搞定了?(建议不要这么轻易做完,老板跟项目经理会认为太简单了,你有多少价值?哈哈)
1 i" }1 j0 V8 Y  l4 硬件工程师说IO口不够额,要换I2C的OLED屏,你是不是想说:你不去死?
6 v- v2 |- y6 _& a1 e4 z& g不急,7 v4 K4 L" k. B. u4 c4 `% E
定义一条I2C通道
! L6 w: b3 x+ h$ t% o
  1. DevI2c DevVi2c1={
    ) j% ]/ A- W- H9 _  _8 J
  2.                 .name = "VI2C1",4 m4 O/ M& `- h1 S
  3.                 , d9 `  i$ ~, f/ n2 ^2 T4 a
  4.                 .sclport = MCU_PORT_D,
    ! ?& m6 X+ O6 P; h5 \
  5.                 .sclpin = GPIO_Pin_6,0 j9 a4 F1 J. z
  6. 6 D6 h2 \/ I. v- H) X6 z) y! N
  7.                 .sdaport = MCU_PORT_D,. v5 t" f3 M% x( ?, B6 [3 r
  8.                 .sdapin = GPIO_Pin_7,
    + t9 E. |. U) V+ \/ k
  9.                 };
复制代码
将LCD BUS接口改一下,I2C接口的LCD不用什么A0,背光控制,确实能省3根IO
4 R0 P6 {8 B" P3 t2 p9 ?
  1. DevLcdBus BusLcdI2C1={4 r) L$ W6 [4 p: i% ~' R, g
  2.         .name = "BusLcdI2C1",  v: ^7 |8 L+ Z2 C% y1 L& }# J3 o
  3.         .type = LCD_BUS_I2C,
    ; Z' N" Y- z' U9 o+ Y  @! }* C& d
  4.         .basebus = "VI2C1",
    ; w# N8 R; o4 M! M

  5. ! G, h" A+ O: T
  6.         /*I2C接口的LCD总线,不需要其他IO*/% f: i) Y$ M. ?7 r! I6 {

  7. / O5 ^. H) n% T: q4 k5 d! W& n; m
  8. };
复制代码
把LCD挂到这个LCD接口上去
; L& B7 k' x* O3 j3 y
  1. DevLcd DevLcdCOG1        =        {"spicoglcd", "BusLcdI2C1", 0X1315};
复制代码
又搞定了。& s7 l; O* |- t  Y! Z3 Y
5 G. Y. d2 f$ ?( Q+ \6 [& ]
额?好像名字一直都是spiclglcd,要不要改一下?无所谓了,这样命名不好,我们应该命名为“main_display_lcd”,名字跟设备无关,应用就不用改名字。否则我们底层改为OLEDLCD,应用又要跟着改,实在不好,会被应用工程师吐槽的。9 b$ B" c+ ?" [0 X7 D
  F" I+ a7 G7 ]" B# ^! X
5 麻蛋,STM32用的好好的,为啥要换芯片?底层要改死额( r$ U( Y8 A* m/ |
没事,至少I2C,SPI ,LCD 不用怎么改,
0 h# y& C2 _& u- w7 \- \只需要把mcu_spi_stm32.c里面的接口实现就OK。有哪些接口?就几个IO口基本操作而已。
3 S( o1 m" U# f4 l. @
  1. extern void mcu_io_config_in(MCU_PORT port, u16 pin);
    1 i$ p9 u7 k% R- Z! }# P' n: H
  2. extern void mcu_io_config_out(MCU_PORT port, u16 pin);
    % k& I, k2 Q2 X% [% d1 ^. u2 m% t. B
  3. extern void mcu_io_output_setbit(MCU_PORT port, u16 pin);) N7 u$ @2 Q5 `( \6 v
  4. extern void mcu_io_output_resetbit(MCU_PORT port, u16 pin);1 B8 y5 H2 ^" g7 ^
  5. extern u8 mcu_io_input_readbit(MCU_PORT port, u16 pin);
复制代码

6 l+ J. ]& ?+ d- v2 C0 b* s" P7 h) q  @2 g0 }
有意思吗?
  u0 W# f8 O6 W( N& I0 ?简单的,玩玩的,教程,觉得这是脱裤子放屁,搞复杂了。
# X! _* p3 F% U' o$ D3 s7 L2 i
8 u: P  }( Q  ~但是如果你做过设备多一点的项目,可能会觉得有点意思。& O- @! h' `) q' Z' {4 Q5 U
因为你有可能遇到过:
( `) M2 l  I5 F. z0 S" c8 _$ C* u1 怎么花屏了?查了半天,发现是在刷屏的时候,有可能操作SPI FLASH,CS管脚没控制好,没做好互斥。9 I- b5 W0 C: n3 z0 n5 q
2 老板说设备要加个小屏幕,驱动IC跟原来的大屏一样,怎么办?复制粘贴原来的代码,所有函数、变量加一个后缀-2,痛苦不?4 i  g6 ?& R) I5 |% O- f9 x

6 {3 i; X3 T( K有兴趣的自行下载附件。
" A" ~' `+ \1 J: j
5 L! l4 G9 q( S8 c8 e* \代码在github托管:http://github.com/wujique/stm32f407/tree/sw_arch, e% }6 S& ^0 I
% X) J& e0 K) ~6 }
代码是整个系统的,包含了很多其他代码,6 E0 R# |5 _' H2 R: T8 e
上面说的内容,主要在:. t) n% S& t) O- v3 ?' m0 H' {
  1. mcu_bsp_stm32.c   IO口操作封装
    ! X  w7 `. h$ J7 T) c
  2. mcu_i2c.c   I2C核心代码
    9 |0 U% H+ y9 l8 V; I: f" S
  3. mcu_spi.c     SPI控制器和SPI通道核心代码
      D. ^2 P" o# Z6 N9 V$ m: ~
  4. dev_ILI9341.c  彩屏驱动
    $ x8 p9 d; M  U9 n9 c& R  Z
  5. dev_lcdbus.c    封装LCD硬件接口
    $ }+ E/ Z1 j- G$ I- }) S
  6. dev_lcd.c       LCD统一对上层接口
    * Q3 Q- t6 D0 |$ B) t
  7. dev_str7565.c   COG LCD 、OLED LCD驱动
    6 C: o6 {( w- f- O+ t0 x" E* k/ v% P
  8. dev_spiflash.c   spi flash 驱动
复制代码

6 L$ t: k4 Z4 i' V* e/ b9 R, H$ `0 U: j0 w- A) l3 X

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
5 U3 k6 M; c1 M6 _7 a请问你的GitHub网址是多少?

5 i; e1 W. W6 x1 N7 d8 p/ w  I" fhttp://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
谢谢分享,很不错! H0 r5 q# Z7 D- d: q9 X
wujique 回答时间:2019-2-26 16:15:38
sincomaster 发表于 2019-2-25 10:52
* s) S( S" A3 d+ o- ]4 Z9 B$ j谢谢分享,很不错

# ~0 f1 A( p  z5 G- X2 m觉得可以的话,欢迎关注github获取最新代码
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版