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

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

[复制链接]
wujique 发布时间:2018-5-11 12:21
上次发帖说要做一套能用的代码,感觉太自大了。, U1 Q" i6 M3 A, V" A7 ]& B
还不如从小处做起。
( m! f2 W' K: Z! k0 l* _这几天鼓捣了几个文件,实现了一些功能。, y: @2 J  k' {
怎么实现的?有兴趣可以自己看代码,没时间的就等等,等稳定了我做个文档说明。
: t& U% e3 r" `4 p0 b; y. T& e
8 K" H7 _! a9 ?6 G" {6 Z: g4 m! {, s现在,我先说说能干啥。
) A% K: h) g" y# y* W$ m' b
, Z  ~( @: m& J* g" x$ Y5 Z, U: J1 有个COG LCD接在SPI接口上,现在要改一下CS脚( H* S9 r9 j/ J+ j
用了我这个代码,不用改驱动,只需要将原来的SPI通道定义的CS脚改改,OK, q+ L9 y# J5 s, ~7 U. T" ~% J
  1. DevSpiCh DevSpi3CH2={
    0 d% t% R. _5 t9 v! p' M% S# n
  2.                 "SPI3_CH2",
    , u( R3 H( z6 u6 P5 `9 G# {
  3.                 "SPI3",! g  o' P( e( e" P* Z  ^8 ~3 T
  4.                 ) i. @/ m+ J6 W7 k* l2 }2 d4 O
  5.                 MCU_PORT_G,- I: E! O& T# i( y
  6.                 GPIO_Pin_15,
    2 R+ ~; |1 u$ l8 c0 S' ~4 t2 c+ |
  7.                 & u* R+ [% h& }) @9 C4 U( `# m8 Z6 L0 B
  8.         };
复制代码
2 你说不对,不是改CS,而是要多用一个CS脚控制LCD,原来的CS用做其他用处,SPI控制器还是一个
9 Q7 t2 `, _1 `) C好,我们加一个SPI通道
# w9 D2 W$ Y) o: Y
  1. DevSpiCh DevSpi3CH2={
    ( d2 o, v: ?$ ~! t( y
  2.                 "SPI3_CH3",- q- _0 D: a/ C; E9 t; ^. j1 g6 v
  3.                 "SPI3",, v; h2 M: r  Z* W8 p: `# ?
  4.                
    ' L8 \# W6 I  A
  5.                 MCU_PORT_G,8 O6 `" H0 B) g- X6 I3 Y
  6.                 GPIO_Pin_14,
    5 G- t7 e! \5 _7 U/ v# ~. f
  7.                
    6 K) @- v2 T2 _3 y9 h* F
  8.         };
复制代码
再定义一个LCD接口,基于这个新的SPI通道上,2 b+ q' b" k6 s. w7 w: S8 G: c
  1. DevLcdBus BusLcdSpi3={
    8 n. U0 \) m6 i1 N- z
  2.         .name = "BusLcdSpi3",# d$ O* _$ `, T8 X2 T: N
  3.         .type = LCD_BUS_SPI,
    ! s( Q: _5 Z/ O* W
  4.         .basebus = "SPI3_CH3",: D+ ^* ?8 a( T$ b$ g; u

  5. 8 d$ C: y: A4 d4 Y6 [7 v+ o
  6.         .A0port = MCU_PORT_G,
    . P. N: H2 Z0 O+ N; d
  7.         .A0pin = GPIO_Pin_4,# C; J, g5 I( n/ m  e# s
  8. " [9 P' f8 [2 S1 L. t% F
  9.         .rstport = MCU_PORT_G,
    % c+ o. }! G1 C
  10.         .rstpin = GPIO_Pin_7,7 @( d! h( C; W, U( p+ B3 X. ]
  11. : n6 V. o+ z8 L) a& U4 I* O; n# K( o& D
  12.         .blport = MCU_PORT_G,
    " T/ ]8 M. k! l# \' i8 u
  13.         .blpin = GPIO_Pin_9,* y/ `7 C" K" x! W2 t9 c% r
  14. };
复制代码
再将LCD挂在这个新的LCD通道上,0 B( V$ H8 r' d% a0 ?+ T
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X7565};
复制代码
3 老板今天画饼,说要卖100万台,但是要讲LCD改改,换为高大尚的OLED。
3 `% v- ^! j6 z$ O你暗地想:完了,要改多少代码啊?
& I! f7 g+ K! U  K# Z% @别担心,( _' a! r  X7 e, R
将原来的LCD定义改改,也就是改一下驱动ID,接口还是SPI
: Y4 B1 S+ j  B
  1. DevLcd DevLcdCOG1        =        {"spicoglcd",         "BusLcdSpi3",         0X1315};
复制代码
SSD1315其实除了初始化跟STR7565不一样外,其他都差不多,根据7565的驱动,造一套驱动,除了初始化不一样,其他都一样,这就叫造。
0 n2 @6 V) o4 O! z2 C: ]
  1. _lcd_drv OledLcdSSD1615rv = {
    7 i$ n# c: G; }9 F% ~; m
  2.                                                         .id = 0X1315,3 Q% a6 u, f+ B7 `; e: Y% r
  3. 8 A! X# O0 e8 W
  4.                                                         .init = drv_ssd1615_init,% u7 z# a5 V# H; y8 P% Z, _' k( g
  5.                                                         .draw_point = drv_ST7565_drawpoint,- n3 s& h- l: z
  6.                                                         .color_fill = drv_ST7565_color_fill,
    9 {& ?0 }) k4 K; i' I
  7.                                                         .fill = drv_ST7565_fill,8 L- ^+ U  x7 P1 a; f2 u% T
  8.                                                         .onoff = drv_ssd1615_display_onoff,
    7 R7 Z+ A! H: t* x* M% p6 U
  9.                                                         .prepare_display = drv_ST7565_prepare_display,' g1 w/ x) Q  a, B7 F6 g* M
  10.                                                         .set_dir = drv_ST7565_scan_dir,/ G1 F# r0 q; W2 `: C
  11.                                                         .backlight = drv_ST7565_lcd_bl
    # e+ u9 k3 N/ J3 n( T
  12.                                                         };" P0 _$ [# p) M6 J: C1 ?; M2 {
复制代码
好像搞定了?(建议不要这么轻易做完,老板跟项目经理会认为太简单了,你有多少价值?哈哈): @' z# l+ u$ }  o1 t6 n; ~0 {; K
4 硬件工程师说IO口不够额,要换I2C的OLED屏,你是不是想说:你不去死?9 W. r' }. V8 r4 W% f/ C
不急,( I" l) ]1 f# M: z0 A, T! G
定义一条I2C通道. s# s: k! b( Y# ~) t
  1. DevI2c DevVi2c1={
    + p/ }7 n, c  z% P8 X4 b/ R
  2.                 .name = "VI2C1",0 L9 |5 r( }7 C0 |6 f& D
  3.                 & ~% u+ @# Q1 }0 j
  4.                 .sclport = MCU_PORT_D,
    . ^6 X9 l& E8 b: I0 r1 i
  5.                 .sclpin = GPIO_Pin_6,; L& F; e% M9 e9 [( a! T8 f; z0 M8 M
  6. 6 u  N# \& X" [* y
  7.                 .sdaport = MCU_PORT_D,
    - Q/ H1 h$ l; _( e, H+ B7 Y: O
  8.                 .sdapin = GPIO_Pin_7,
    7 g; v  X/ u. X5 y
  9.                 };
复制代码
将LCD BUS接口改一下,I2C接口的LCD不用什么A0,背光控制,确实能省3根IO
& C! x( B7 U6 i2 M+ n
  1. DevLcdBus BusLcdI2C1={
    * s9 }( @3 P$ Q% \: @; N, i3 }
  2.         .name = "BusLcdI2C1",
    ! k5 a& ]7 f1 ]2 @1 m  g* N( T
  3.         .type = LCD_BUS_I2C,8 L" E3 B! K6 G# U. A
  4.         .basebus = "VI2C1",; @: y3 r/ I5 K+ |; _
  5. , |& L( W0 `% L) w1 l/ _1 ^
  6.         /*I2C接口的LCD总线,不需要其他IO*/) }+ [% R. H( [  `- ~

  7. + k! C* z( p4 ^0 T/ p( b' A
  8. };
复制代码
把LCD挂到这个LCD接口上去! }% |3 k% A. W
  1. DevLcd DevLcdCOG1        =        {"spicoglcd", "BusLcdI2C1", 0X1315};
复制代码
又搞定了。
+ w  L2 U7 x5 k8 Q/ n4 h) S/ ]1 C' s: y4 P  I
额?好像名字一直都是spiclglcd,要不要改一下?无所谓了,这样命名不好,我们应该命名为“main_display_lcd”,名字跟设备无关,应用就不用改名字。否则我们底层改为OLEDLCD,应用又要跟着改,实在不好,会被应用工程师吐槽的。
: X/ k- W2 w3 c$ }. H8 y6 C" W
+ m4 m4 ^1 O* c2 W1 c5 麻蛋,STM32用的好好的,为啥要换芯片?底层要改死额
! ^" V- _$ ~! n; d' p没事,至少I2C,SPI ,LCD 不用怎么改,
, v' S1 y& B$ n7 U' N& h只需要把mcu_spi_stm32.c里面的接口实现就OK。有哪些接口?就几个IO口基本操作而已。) w2 B/ ^9 f' }0 j! p! B
  1. extern void mcu_io_config_in(MCU_PORT port, u16 pin);$ [* \$ h! [% K
  2. extern void mcu_io_config_out(MCU_PORT port, u16 pin);- ?' T) `0 w2 h( A0 D8 N  J# r5 \
  3. extern void mcu_io_output_setbit(MCU_PORT port, u16 pin);# Z  V( k. D- G
  4. extern void mcu_io_output_resetbit(MCU_PORT port, u16 pin);
    $ l1 t9 ?7 O9 |1 g+ V8 c4 q+ y
  5. extern u8 mcu_io_input_readbit(MCU_PORT port, u16 pin);
复制代码

" K& u* g+ |9 b& ~- Z
% C, J2 _0 D) Z3 P: _) [( J' C有意思吗?
8 ~1 e3 {6 ^/ L# y9 t3 T2 O* }, J简单的,玩玩的,教程,觉得这是脱裤子放屁,搞复杂了。
6 o- [) e+ T- ^8 t6 n2 E8 E4 N" o9 F7 ^* h+ z; {% _/ B
但是如果你做过设备多一点的项目,可能会觉得有点意思。
! q  _( M1 X) {4 w% k# c因为你有可能遇到过:: t8 [% ?' G, ]1 k" O7 y
1 怎么花屏了?查了半天,发现是在刷屏的时候,有可能操作SPI FLASH,CS管脚没控制好,没做好互斥。
6 d7 G: }5 X+ k/ T" S4 l) N2 老板说设备要加个小屏幕,驱动IC跟原来的大屏一样,怎么办?复制粘贴原来的代码,所有函数、变量加一个后缀-2,痛苦不?$ t* B* g$ }& t$ C( Q
# T* U+ e7 N9 }$ @6 _
有兴趣的自行下载附件。: @* h& w  x; i; _8 @

5 k" m9 Y# k, W5 G代码在github托管:http://github.com/wujique/stm32f407/tree/sw_arch
3 q! q/ `" U. X- \. ~* {4 m" T3 E6 o
代码是整个系统的,包含了很多其他代码,
$ U' D3 H/ M) F8 J上面说的内容,主要在:
3 ~' J; U5 }. {& o1 c
  1. mcu_bsp_stm32.c   IO口操作封装% }+ }& s9 g1 r. x7 z5 s
  2. mcu_i2c.c   I2C核心代码: z. \) w! Y( s/ y/ y& f
  3. mcu_spi.c     SPI控制器和SPI通道核心代码: k6 I" z' R0 R8 Q' o: x1 i
  4. dev_ILI9341.c  彩屏驱动
    ' D$ o& ]* [: M, g) b" q* K
  5. dev_lcdbus.c    封装LCD硬件接口1 c3 F1 P, N! v, Q# E
  6. dev_lcd.c       LCD统一对上层接口
    ! Z/ [# o" t2 X
  7. dev_str7565.c   COG LCD 、OLED LCD驱动
    + F0 {* i! W6 b1 ~9 _; Y  i! o
  8. dev_spiflash.c   spi flash 驱动
复制代码

# o# B" R9 U; l% ?. D& k6 \, m$ D

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
) O5 G% A& K" q; |2 d; D, g6 }请问你的GitHub网址是多少?

+ F/ e* L/ k) G2 t. z2 T; v, e. c( qhttp://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
谢谢分享,很不错
9 L( v+ V* X( G3 q
wujique 回答时间:2019-2-26 16:15:38
sincomaster 发表于 2019-2-25 10:52
3 j3 r+ w4 v& e0 o+ J# k3 _& j谢谢分享,很不错

) O/ z  a- e. Y! ^: |3 Y觉得可以的话,欢迎关注github获取最新代码

所属标签

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