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

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

[复制链接]
wujique 发布时间:2018-5-11 12:21
上次发帖说要做一套能用的代码,感觉太自大了。
& N% E6 u' E0 y/ }- C还不如从小处做起。; t. V+ Z# B& c& l: `' t
这几天鼓捣了几个文件,实现了一些功能。: `. G! C( [. \
怎么实现的?有兴趣可以自己看代码,没时间的就等等,等稳定了我做个文档说明。8 b! K! ~9 |1 N( P$ e
/ s$ M7 \6 O8 _! B& S
现在,我先说说能干啥。
- v" d3 K- j9 D! F' _8 d& m* s8 _! z- d
1 有个COG LCD接在SPI接口上,现在要改一下CS脚# c+ T0 Y4 {/ \8 V
用了我这个代码,不用改驱动,只需要将原来的SPI通道定义的CS脚改改,OK* A9 Z, F* T; X" @6 w
  1. DevSpiCh DevSpi3CH2={
    , c/ H! N5 {4 g; i: |  _( N
  2.                 "SPI3_CH2",
    1 d, k- L$ f( m. g2 i3 A( F" t1 c
  3.                 "SPI3",
    : @+ T4 J6 U: t# z
  4.                 # T! A: Q6 H3 p. F" J
  5.                 MCU_PORT_G,
    8 f1 _" X; k0 _' A% k
  6.                 GPIO_Pin_15,
      D/ y: \" f. C3 f2 u9 H) T2 A7 N" p
  7.                
    / s3 K* A+ ~  \. |1 L
  8.         };
复制代码
2 你说不对,不是改CS,而是要多用一个CS脚控制LCD,原来的CS用做其他用处,SPI控制器还是一个
( u% _% t& A5 h& B: e好,我们加一个SPI通道
4 h8 P" E; ~% l" ~7 `
  1. DevSpiCh DevSpi3CH2={; D' ~3 P1 m- J5 O4 ]
  2.                 "SPI3_CH3",
    ( e* d/ i% D1 r: C& S6 d
  3.                 "SPI3",
    0 K* E! V8 o! y0 w, H  l+ p
  4.                 . O0 ^( }7 t- e9 t1 n  S6 B
  5.                 MCU_PORT_G,  i. D; s  P+ L! `" u
  6.                 GPIO_Pin_14,2 n# M6 [8 b+ C, P0 t
  7.                
    + e# b5 s& Z2 q7 S' ^
  8.         };
复制代码
再定义一个LCD接口,基于这个新的SPI通道上,) d8 l& R2 w" _# {
  1. DevLcdBus BusLcdSpi3={
    , ?& {' \6 \* I' N, M
  2.         .name = "BusLcdSpi3",
    1 N( X" g7 z1 ^2 h2 A
  3.         .type = LCD_BUS_SPI,) H8 R0 a4 X% h! U) a
  4.         .basebus = "SPI3_CH3",
    & |' n4 N2 I9 q' l4 Q

  5. ! S6 J3 ~6 _+ j* q$ S  O
  6.         .A0port = MCU_PORT_G,
    $ K$ S( K; E: |6 G; K: S1 s
  7.         .A0pin = GPIO_Pin_4,
    . q! `1 ~  H0 }& k" j4 r% q

  8. ) c1 z1 \+ }  r6 O" `" ~1 X" }
  9.         .rstport = MCU_PORT_G,3 f0 W, r( R3 x4 e9 D; a" }5 _
  10.         .rstpin = GPIO_Pin_7,
    - D8 h4 I& G, N; q9 M* N

  11. ) S* ?& ?0 |  j1 A( L8 A! Q; ?
  12.         .blport = MCU_PORT_G,
    + u  v0 P) ?% p* X. j: H% \
  13.         .blpin = GPIO_Pin_9,
    ( a+ r+ I. H9 A! _% }
  14. };
复制代码
再将LCD挂在这个新的LCD通道上,
. O6 F( ]" W: U5 C
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X7565};
复制代码
3 老板今天画饼,说要卖100万台,但是要讲LCD改改,换为高大尚的OLED。
5 a6 a* \, b+ ]+ I# G你暗地想:完了,要改多少代码啊?+ K+ `3 A/ U* R$ q6 m0 Z
别担心,* D0 X" @, H8 P) p9 ?5 j, F
将原来的LCD定义改改,也就是改一下驱动ID,接口还是SPI1 i- [4 C2 b& u2 P: e' O* Y
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X1315};
复制代码
SSD1315其实除了初始化跟STR7565不一样外,其他都差不多,根据7565的驱动,造一套驱动,除了初始化不一样,其他都一样,这就叫造。2 U3 C# h& ?5 y1 j
  1. _lcd_drv OledLcdSSD1615rv = {! X0 v* g# Y; R9 C
  2.                                                         .id = 0X1315,1 W9 `6 C6 x4 F5 Q# v

  3. + X! v+ d  W  u* F2 E5 T
  4.                                                         .init = drv_ssd1615_init,
    ) p8 c  F; L- x( K6 n; ~% Z7 m
  5.                                                         .draw_point = drv_ST7565_drawpoint,
    2 h' m0 T! Q* ?* i; F& z
  6.                                                         .color_fill = drv_ST7565_color_fill,
    - V7 R* |: N) [5 d' b
  7.                                                         .fill = drv_ST7565_fill,) L* ^3 V1 F; g! Q/ F$ ]! T$ l: n
  8.                                                         .onoff = drv_ssd1615_display_onoff,
    2 y  H4 G5 ]2 b, \& |% Z
  9.                                                         .prepare_display = drv_ST7565_prepare_display,
    7 q0 t& x+ e1 g" y
  10.                                                         .set_dir = drv_ST7565_scan_dir,9 d" E' X. u2 B
  11.                                                         .backlight = drv_ST7565_lcd_bl) Z( H9 k+ P+ ~7 R% Z
  12.                                                         };
    # Q! a0 P- Y0 \- R! Y  p
复制代码
好像搞定了?(建议不要这么轻易做完,老板跟项目经理会认为太简单了,你有多少价值?哈哈)3 w3 |3 h( G# a( C1 X3 \5 ?3 }
4 硬件工程师说IO口不够额,要换I2C的OLED屏,你是不是想说:你不去死?4 d7 t8 S- ?5 X
不急,% c* u7 B/ s* Y
定义一条I2C通道
9 N! p: H- ?5 V( G
  1. DevI2c DevVi2c1={
    ) d& X! [4 {& h+ t
  2.                 .name = "VI2C1",& M" u9 a5 i- z7 {- F
  3.                 % r2 j; y4 W  i' n9 @) j& `
  4.                 .sclport = MCU_PORT_D,) V( m- R# C4 Q' m5 o0 }8 G
  5.                 .sclpin = GPIO_Pin_6,
    , Q1 e7 q5 P9 z9 q0 Q3 b6 o+ ^6 q
  6. 9 h# A- }2 ^, T+ S% s
  7.                 .sdaport = MCU_PORT_D,
    * F( O+ C0 b! ?1 S" Q/ m( q
  8.                 .sdapin = GPIO_Pin_7,
    ( t" u2 D, J6 Q1 v  |# u
  9.                 };
复制代码
将LCD BUS接口改一下,I2C接口的LCD不用什么A0,背光控制,确实能省3根IO; B) P! Q" g! C8 L+ q. ~* b
  1. DevLcdBus BusLcdI2C1={; Q9 W- X0 _' @" `& Q3 j
  2.         .name = "BusLcdI2C1",
    & D( e1 K! a* q3 N4 M5 c$ o
  3.         .type = LCD_BUS_I2C,
    6 j3 A" P0 `& |4 P& @! Y3 y
  4.         .basebus = "VI2C1",, |- X# ]4 `6 Z, J
  5. ! S2 `* }1 q- `, B
  6.         /*I2C接口的LCD总线,不需要其他IO*/# L, i% b5 w' k3 G+ b- z

  7.   X8 H2 ]) h8 Y& y
  8. };
复制代码
把LCD挂到这个LCD接口上去/ I- ^; x) l* a% J3 [7 J
  1. DevLcd DevLcdCOG1        =        {"spicoglcd", "BusLcdI2C1", 0X1315};
复制代码
又搞定了。& @3 H! l- k# L: i8 ~- ?( S/ U3 B
2 Z4 C. Z$ R5 _
额?好像名字一直都是spiclglcd,要不要改一下?无所谓了,这样命名不好,我们应该命名为“main_display_lcd”,名字跟设备无关,应用就不用改名字。否则我们底层改为OLEDLCD,应用又要跟着改,实在不好,会被应用工程师吐槽的。
0 j' Y6 ?4 k1 o  f- r
, I! A$ H7 k7 W% [5 麻蛋,STM32用的好好的,为啥要换芯片?底层要改死额
& @9 T% u1 ?1 ?" |5 c没事,至少I2C,SPI ,LCD 不用怎么改,
5 H% J0 H4 _# h; [: O9 w3 O  `只需要把mcu_spi_stm32.c里面的接口实现就OK。有哪些接口?就几个IO口基本操作而已。5 A* m9 W% i! G  o/ |
  1. extern void mcu_io_config_in(MCU_PORT port, u16 pin);8 w9 n, K: @( P5 ]* t& C  U, Z
  2. extern void mcu_io_config_out(MCU_PORT port, u16 pin);- E# E! G  I6 m  a" i+ j% F" W
  3. extern void mcu_io_output_setbit(MCU_PORT port, u16 pin);
    : S" l( ^" J+ w! b; R& R0 I
  4. extern void mcu_io_output_resetbit(MCU_PORT port, u16 pin);: \+ q' a2 q7 [2 O. S
  5. extern u8 mcu_io_input_readbit(MCU_PORT port, u16 pin);
复制代码
; d+ h7 J! R( Z+ V7 S  ~4 U: j# i
9 p- |! N( a! ?  K0 {: b
有意思吗?
6 q5 c" U. B6 M. u* Y9 U3 E0 U/ m简单的,玩玩的,教程,觉得这是脱裤子放屁,搞复杂了。+ d: D; E7 |& S/ F2 |2 b

% m1 K7 P1 B# }* @但是如果你做过设备多一点的项目,可能会觉得有点意思。: i+ }8 m" t; N1 t3 C' Z, E
因为你有可能遇到过:0 [) V9 G% f% n$ E  L% ~) V0 K: ?  s" f
1 怎么花屏了?查了半天,发现是在刷屏的时候,有可能操作SPI FLASH,CS管脚没控制好,没做好互斥。
, P' d: v& s8 }+ z9 w8 l/ ?2 老板说设备要加个小屏幕,驱动IC跟原来的大屏一样,怎么办?复制粘贴原来的代码,所有函数、变量加一个后缀-2,痛苦不?
7 L9 i( W- A: ]2 C# g3 ?; N' B6 E& \0 ?7 p8 M6 G4 i# ~( i% M
有兴趣的自行下载附件。
$ u1 E6 ?2 @" U! r0 r3 u, d. S! a3 V6 K) L3 D
代码在github托管:http://github.com/wujique/stm32f407/tree/sw_arch8 N( d* S, \& Y( \& f! A4 z

$ R5 ]* |- ~1 Q+ o- K1 ]代码是整个系统的,包含了很多其他代码,& z" |7 l3 ?% J+ ]$ X5 b- a  N
上面说的内容,主要在:2 P; G" g0 ]3 ~! q
  1. mcu_bsp_stm32.c   IO口操作封装
    ( H5 k1 s3 I8 a3 q3 [3 K
  2. mcu_i2c.c   I2C核心代码$ [" H" P5 n9 I- Y% o
  3. mcu_spi.c     SPI控制器和SPI通道核心代码. _( Q- [4 ~! h  G+ E
  4. dev_ILI9341.c  彩屏驱动  ^, Q  v, J7 E; C; s6 E3 P4 @
  5. dev_lcdbus.c    封装LCD硬件接口
    " O! a, ?: S1 t3 {% `
  6. dev_lcd.c       LCD统一对上层接口5 H9 ]: {) g8 {; E& }
  7. dev_str7565.c   COG LCD 、OLED LCD驱动$ V6 g: ]+ |/ D" T
  8. dev_spiflash.c   spi flash 驱动
复制代码
$ Q: z, r7 l) j* I! P, Z$ [

3 _+ u/ N2 D+ d# x( E8 ~( z# k9 `

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
2 D- I9 x7 v+ R8 p' k; v& V请问你的GitHub网址是多少?

. N% V. o& d% K# |( F7 \8 I" ~3 Yhttp://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
谢谢分享,很不错: J6 Q- t( x) w! ?' A5 M- Z* ^4 c+ x. O
wujique 回答时间:2019-2-26 16:15:38
sincomaster 发表于 2019-2-25 10:52( r+ K  o6 J7 D7 k$ `
谢谢分享,很不错

1 V# t" T0 z/ D( B! e9 D! z3 r觉得可以的话,欢迎关注github获取最新代码

所属标签

相似分享

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