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

F103的SPI2与ILI9341显示屏控制器通信

[复制链接]
wfy680 发布时间:2018-6-10 15:26
本帖最后由 wfy680 于 2018-6-10 15:30 编辑
) Z. f/ o+ W7 k
+ K2 Q8 o. q/ L: D  X$ q* G3 ^原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下:
2 E% y6 c1 o: [( h8 ^* d2 ~#define SPI_MASTER_NSS           GPIO_Pin_122 Z" w0 v' n  ~1 @
#define SPI_MASTER_SCK           GPIO_Pin_13
& H: H9 [4 e) C( r* E. a#define SPI_MASTER_MI            GPIO_Pin_14
5 j$ Y! h- [0 _#define SPI_MASTER_MO            GPIO_Pin_15# N, h" c0 O  K  V% b- }1 q

0 p: T! Z9 \4 Fvoid OLED_Init(void)- S. u/ ]/ Z) J/ i$ G
{
. }% t( G& i  D3 E4 ^  GPIO_InitTypeDef  GPIO_InitStructure;, N& t; u) ]; E+ W5 p7 ]2 ?) n
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);          
& i+ y2 z" k+ n. d& X+ `' M  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 ;          //D/C   BLK   RST% x  d: S- H' D' e  h3 `( u* o5 j
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽输出
; A, S" n: k! u  `' [, L  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz; ^0 o# C( D( ~, i3 Y$ X: }
  GPIO_Init(GPIOA, &GPIO_InitStructure);              " V4 q3 K# H; K; Y, H
  GPIO_SetBits(GPIOA , GPIO_Pin_9);       // 背光,高电平亮
( i- t& |1 x. ~* I- ~  i1 ~" @  OLED_RST_Clr(); // 复位7 N2 d, j& t( g3 v) U7 {
  Delay_ms(2);9 y1 W) G. c+ `
  OLED_RST_Set();
! M4 ?# v- P( M9 u6 Q$ A4 Z( m  Delay_ms(5);* c+ W' @( m8 G) }! c" B5 u' K
0 \1 d& P9 I$ r8 `& P: E3 i; X/ Y. u
  SPI2_UserInit();
  ?3 c5 L9 K8 W9 @3 {- r/ t9 u5 R4 E: R1 y0 X' p, G
//************* Start Initial Sequence **********// 5 a8 h5 r8 e2 p3 n2 t% [" b
  LCD_WR_REG(0xCF);  / o8 e& B( n$ f
  LCD_WR_DATA8(0x00);
: s* z# p' p5 b+ p6 s' o' `4 ?/ ]  LCD_WR_DATA8(0xD9);
6 }- v$ |9 ^. \* x4 i- O  LCD_WR_DATA8(0X30); : p& L/ b0 l4 W. p( h

0 y8 w9 K5 M. j  LCD_WR_REG(0xED);  ' }4 S# J7 h$ t$ s  q
  LCD_WR_DATA8(0x64);
, E: i2 j3 Z0 u* e$ V1 s/ z  LCD_WR_DATA8(0x03);
/ {2 q: j7 k" d9 y  LCD_WR_DATA8(0X12);
9 V& B; k" H2 }2 {  LCD_WR_DATA8(0X81); 5 V  m7 k6 |+ H; A. ]8 X' n4 |" c

! ]$ i% O% F- r. o7 s6 \  LCD_WR_REG(0xE8);  3 y; K9 _# d: \
  LCD_WR_DATA8(0x85); ! P- r# v  ?; p0 l' ^# _: D
  LCD_WR_DATA8(0x10); 0 y0 U+ F; u' U) ?* ]: [
  LCD_WR_DATA8(0x78); 0 V) E9 q$ |$ H1 R3 x7 Y7 b

0 P0 P) n/ y" x& A# \: s, Q  LCD_WR_REG(0xCB);  - l. ~) N4 T+ A: t7 v2 z
  LCD_WR_DATA8(0x39); ) v" f1 h# w+ Z/ L2 C
  LCD_WR_DATA8(0x2C); , R5 ?% U, b$ K/ A( Q# ]) S+ o
  LCD_WR_DATA8(0x00);
8 Q& [- G0 O/ F. ~* e  LCD_WR_DATA8(0x34);
$ n+ b5 ?3 U: p0 p2 G0 t  LCD_WR_DATA8(0x02); % X+ L. i7 M3 g' Y" n+ S' Z: i

+ ]# R  s# M8 A$ r  LCD_WR_REG(0xF7);  
* d: b; ?; u* K) o3 Q& d8 J  LCD_WR_DATA8(0x20);
- P8 B) a3 ?/ ~9 M& ?( n/ c" S. N! H9 L
  LCD_WR_REG(0xEA);  ; V: q" K" |. r
  LCD_WR_DATA8(0x00);
0 v# I2 {7 X4 F  LCD_WR_DATA8(0x00); 7 J, o8 L. _5 b" [" T1 E
% g2 c1 ~; r. Q3 l) |
  LCD_WR_REG(0xC0);    //Power control
" ^# _- }% J+ b/ i$ Q  LCD_WR_DATA8(0x21);   //VRH[5:0] 5 s; f; A; Y3 v7 a

( O% b! N4 L7 u! N( V  LCD_WR_REG(0xC1);    //Power control ! X& e" E% X- F% P8 \; r  V0 x! Z
  LCD_WR_DATA8(0x12);   //SAP[2:0];BT[3:0]
) Y5 E/ W: l" B( s# ?% ]# k( i  T, V0 P
  LCD_WR_REG(0xC5);    //VCM control ! E# h: r, H+ _6 }* C3 G$ W
  LCD_WR_DATA8(0x32);
  z1 E' J! J+ V6 c5 ~; B  LCD_WR_DATA8(0x3C);
6 x) T& |7 R* C) c1 i
4 _* x) ^0 l6 K# ]. n5 S3 ^- ^  LCD_WR_REG(0xC7);    //VCM control2
$ }6 Z8 {, Z* N! a& E: W  LCD_WR_DATA8(0XC1); ' ^& [0 y  X; G. a) j4 E6 ~
6 P% I/ e7 H( N5 h$ N) N
  LCD_WR_REG(0x36);    // Memory Access Control 9 Y8 w, f8 d+ O! D" D- x
  LCD_WR_DATA8(0x08);  // BGR顺序- f, A2 K1 |/ {, V: Q* J
0 e+ a7 v& T/ _) H3 F% }
  LCD_WR_REG(0x3A);     // 16位像素3 Y. H. ?( ~1 R- k' O4 d
  LCD_WR_DATA8(0x55); , z( t% Q9 E7 z* B; B& \( n. k

5 n- j  C3 t! l- J7 \  LCD_WR_REG(0xB1);   //帧速率控制& t" v$ s' X9 K+ ]
  LCD_WR_DATA8(0x00);   
6 {& s4 r% I& t+ N% K3 @; L  LCD_WR_DATA8(0x18); 3 ~- Z' [( f. v! X& q0 [$ H" R

0 A" c, i- u: C+ F3 H" `0 Z  LCD_WR_REG(0xB6);    // Display Function Control " ~; a8 a, M- R# }
  LCD_WR_DATA8(0x0A); % \% J0 P9 q. P0 o* S/ @9 X5 t
  LCD_WR_DATA8(0xA2);
9 s( b9 f& A8 {) D& S0 M7 g& k8 d
* }; [; b: S) P6 s& b
6 l  ~4 v; ^' a: H! k7 P, W) S
" Y' j! x/ Q# }  LCD_WR_REG(0xF2);    // 3Gamma Function Disable " n9 ?( n" p9 m1 j
  LCD_WR_DATA8(0x00);
# e, [: n9 C& O
: K0 W$ F0 c7 z8 d4 S  LCD_WR_REG(0x26);    //Gamma curve selected
4 V3 V- L1 p& X% d/ k8 N2 H  LCD_WR_DATA8(0x01); ! S1 L) \+ O$ }1 x9 d
2 r# p' J8 ^% p9 D2 c5 |
  LCD_WR_REG(0xE0);    //Set Gamma : V' ^; t! s. N" Q' l) e
  LCD_WR_DATA8(0x0F); / V. J  d* [5 E' S6 j
  LCD_WR_DATA8(0x20); + `/ O- O$ b# V$ S, d& `
  LCD_WR_DATA8(0x1E); 9 |0 U# V- e/ B, w
  LCD_WR_DATA8(0x09);
4 X& H4 H) w6 k! R9 p' G; _  LCD_WR_DATA8(0x12);
* r# t" A! t7 B- B) N7 c6 W" _  LCD_WR_DATA8(0x0B);
& e0 Z) c9 D: \! w/ h) y# K  LCD_WR_DATA8(0x50);
* K1 @* @  u; y' u# Q  LCD_WR_DATA8(0XBA); - w- y2 r1 @) \% N+ h+ p+ s
  LCD_WR_DATA8(0x44); % X- y0 _) U9 f9 {4 c5 f# P
  LCD_WR_DATA8(0x09); 1 F" K, E+ t/ K/ P+ Z
  LCD_WR_DATA8(0x14); # [: S- H; c0 d$ f. X
  LCD_WR_DATA8(0x05);
) j  k2 @3 y% P; x8 Z, {  LCD_WR_DATA8(0x23); 7 }% F- Y+ j9 g9 N- r
  LCD_WR_DATA8(0x21); 6 o  R% G+ ]! p  S: ?
  LCD_WR_DATA8(0x00); 2 B# {7 a; @% Q' D; c
% a# E) q' u, p4 L) y/ V; `
  LCD_WR_REG(0XE1);    //Set Gamma ( L1 N1 d8 E, m5 |: y& E3 u
  LCD_WR_DATA8(0x00); 3 p4 ?" Z  b5 R% m* _5 Y+ U# Q
  LCD_WR_DATA8(0x19);
1 s' M" G! v& m& ~  LCD_WR_DATA8(0x19);
2 l9 l1 e7 S! K! D9 M# A' z8 d  LCD_WR_DATA8(0x00); ' G3 q& A8 T. G3 t" G7 q
  LCD_WR_DATA8(0x12); 6 ~& u: i9 r) o8 K( w
  LCD_WR_DATA8(0x07);
! r" R+ ?4 V" ?+ @9 }  LCD_WR_DATA8(0x2D);
& o& ], R. Q* ~) a  LCD_WR_DATA8(0x28);
0 J- }# y+ Y& O; k# q  LCD_WR_DATA8(0x3F); - x" o" `! Y: _
  LCD_WR_DATA8(0x02);
1 e, Y/ W8 x0 P( w( e6 X* c  LCD_WR_DATA8(0x0A); # ?8 x  v8 r1 n; J- ~
  LCD_WR_DATA8(0x08); 6 C2 `) ?. V& A6 k! I
  LCD_WR_DATA8(0x25); ; C) h: M* a+ C, D" r/ J4 X
  LCD_WR_DATA8(0x2D);
+ B; b1 ]- I0 T: d' y- `+ Z1 e8 I  LCD_WR_DATA8(0x0F);
% p' z) `" O5 f9 @5 g
" _1 |3 r% _7 Y1 y1 ^* X1 q  LCD_WR_REG(0x11);    //Exit Sleep
# P0 g! ?6 z4 x/ o! z: i  Delay_ms(120); $ C' F+ S$ @  ]+ M  D. e
  LCD_WR_REG(0x29);    //Display on
: u+ l8 H" K9 V) H2 ]5 ^+ w1 B; I7 e
, p# `+ M3 _; S4 t  LCD_DrawPoint(100,100,RED);  // ****设置一个红点验证 , 不成功!!+ ?( }# t; P/ s' I+ V

9 Q7 i0 T0 W. k
/ c5 l) @" z0 `2 g}
6 t7 n# n; L- ^% R6 t& ]7 z+ s. _/ {5 Q. t: o+ A1 N
void LCD_DrawPoint(u16 x,u16 y,u16 Color)
6 [! J4 I: L7 d! E{
/ @$ l" w$ j) r) g" Y* M& d! i        Address_set(x,y,x,y);//设置光标位置
& U' l! C5 ]" u2 ^( M$ T+ O        LCD_WR_DATA(Color);             % ~$ e% `- n. C# q, Y
}
5 ~/ D$ e* F& Q* v5 a5 p& u; M6 K, X# W7 C
# t: `" Y0 R4 d1 E0 u; C
, T4 Z2 H  W2 m  j
void LCD_WR_DATA8(char da) // 写 8 bit 数据8 b' K0 ?2 v4 Y* u6 K
{       
# L# z5 ~5 y, {: w6 f6 M* }  OLED_DC_Set();   ; N$ D7 Q- h1 Y* D+ p/ J
  SPI2_Send(da);
: Y4 y" P+ B" j* E5 ]}  5 U3 q' K* I, v" P0 M
. W# [* b9 V# L
" y1 e- r7 i' Y3 N; ]' y; `. S
void LCD_WR_REG(char da)  // 写 8 bit 指令 7 Z& b8 `7 \2 B& q
{                6 @. a& O  h4 K4 W1 f+ l0 Z3 Q
  OLED_DC_Clr();   2 }6 Z( a% b/ d! D( Y
  SPI2_Send(da);) _1 O4 @% Y2 B  E
}
3 q7 R6 {$ B0 c4 O% A1 i& g  u% C; y! q$ p9 v5 p& w  H

# h  E8 K* P: m- ~/ C3 u3 ~( N) u* p/ O9 J" g

, G7 p; i( o( A  X) A; x4 Q+ X1 Tvoid LCD_WR_DATA(int da)8 s4 k$ k$ k4 ^: u+ [
{        5 L. [) \2 ?2 p( C# I
  OLED_DC_Set();
% t4 O6 p  l7 u+ L3 H  SPI2_Send(da>>8);9 J4 j/ [5 m  ~
  SPI2_Send(da);* \; t, Z9 G+ o+ r) ~
}           * n+ @7 f# Y' }& b
% L, Y! N, j# m
' Y  l. P* [* r
void SPI2_UserInit( void )
& q6 i) j$ E/ `; z# C3 R{. R9 Q  `( _4 Y- n5 H3 d+ Q* {
    GPIO_InitTypeDef GPIO_InitStructure;
. \$ Q) z6 Z3 ]' e    SPI_InitTypeDef  SPI_InitStructure;
  d) v- r; X, J# I& g3 b  a
6 j0 p2 ?8 w  T+ w7 g, j( Z- L& P7 V4 N8 [, R5 g) k
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);//使能GPIOB时钟" n. x7 e% i$ a. j# i( a( W( Y
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2. l" E8 |7 x' }2 J& Y
& ?8 p1 U9 i, P
    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_SCK | SPI_MASTER_MO;( @" S1 Y- \# w# V# }9 q
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
, ?" k5 m' A3 d; N4 D    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5 ~' v- c( i% H4 ~9 h    GPIO_Init(GPIOB, &GPIO_InitStructure);
6 E$ h7 W( M- @6 l7 C3 \
9 s- ^0 |5 V7 o0 G7 M# T    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI;
* \5 O7 p9 r2 n/ `( {4 w% ^9 k# a    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;6 }/ d' d6 [  S' @
    GPIO_Init(GPIOB, &GPIO_InitStructure);
9 h+ R$ }! q4 ?' C8 i3 q5 ^* {* v. N  v# w9 e! T. U$ _+ h
    //GPIO_SetBits(GPIOB , SPI_MASTER_SCK | SPI_MASTER_MO |SPI_MASTER_MI);" Q! E9 g3 X$ z' T- |  K: n6 Z
% R9 z) _% S; V0 V/ E

% D# g3 q0 r3 y- N: d# h" d0 `3 E& _/ {. y. [$ x
    /* SPI2 configuration ------------------------------------------------------*/
2 J% n  R3 Y% I3 j1 D7 M    /* SPI2 configuration ------------------------------------------------------*/
; x0 Y6 A% {! p. u# N: P, v    SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE; r! U( e6 j0 W/ q8 g0 n
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI_Direction_1Line_Tx , SPI_Direction_2Lines_FullDuplex0 }( i2 X5 y( N8 {! r$ E" z' h3 A
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  d0 h* I! E9 X
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI_DataSize_16b   SPI_DataSize_8b:SPI数据大小:发送8位帧数据结构
/ k. q" M7 I# H% _    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;   // SCK    SPI_CPOL_Low ,  SPI_CPOL_High: //设备空闲状态时同步时钟SCK的状态,High
' L% U. P! Y6 R. |: X3 d' U    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1:数据采样从第二个时钟沿开始   
9 P, k* k  @/ b( W$ u    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;    // NSS由软件控件片选   SPI_NSS_Hard   SPI_NSS_Soft# P5 C) [- y, J# G. s" b
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // SPI_BaudRatePrescaler_8   SPI_BaudRatePrescaler_2560 F( O1 k& h# g( D: \
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;   SPI_FirstBit_LSB
2 v1 \9 B3 I7 F+ ~+ J9 Y5 y6 o    SPI_InitStructure.SPI_CRCPolynomial = 7;! b* P" f" O* f- M
    SPI_Init(SPI2, &SPI_InitStructure);5 Q, j4 h' ]" h8 M
  j6 Z: g% @7 k; E
    SPI_Cmd(SPI2, ENABLE);
: g& F! }- g" A}
0 [( ~* n. w% B4 p" B& I* [8 d" g
4 L) E2 I2 m2 q
void SPI2_Send(u8 data)2 o8 E0 w3 P# C% n) V2 y
{* b, F& ?3 O3 D; k6 g. M& M9 L8 o
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);   /* Wait for SPI2 Tx buffer empty */0 `% ]! D1 C6 m) ]5 }$ N6 v) Y
    SPI_I2S_SendData(SPI2, data );
$ T2 c) d1 g  q* h3 x1 ]}
6 g' I- K1 N4 Z, S  d3 S5 |' [9 h# ]$ z7 g( a4 e
+ o" V7 P- m, G' E3 A
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
+ ^' m2 K" c6 D* [% K# u) t# B{
3 [& Z( h3 [7 u3 u/ x  LCD_WR_REG(0x2a);4 @# x! m% U, g3 v& F
  LCD_WR_DATA8(x1>>8);6 N: V6 m/ d3 i- o$ T7 ^8 h0 c4 f
  LCD_WR_DATA8(x1);
/ D2 \" ~" l# P6 g6 V: C! g/ U  LCD_WR_DATA8(x2>>8);
* C# @+ W; a& L2 C4 q  LCD_WR_DATA8(x2);: K# M0 H6 {& z) o* M
8 w% w8 N" \2 M, p5 s. z0 h$ x
  LCD_WR_REG(0x2b);! F9 F9 k: k: l# h+ ?# y, A: E
  LCD_WR_DATA8(y1>>8);6 J$ ?/ R2 V8 e  z7 a6 L
  LCD_WR_DATA8(y1);5 `7 V# N% ~% O) X
  LCD_WR_DATA8(y2>>8);+ R: c) p% E  Z' ~: Y1 w
  LCD_WR_DATA8(y2);; s/ ~( i/ x: z0 U! l+ z

' H& ]. u& P* C" f8 s  LCD_WR_REG(0x2C);                                                                                            {& R- V# T: H0 E# m
}
3 i6 s% o4 u' E& h3 T2 W
6 [2 `2 z2 A. |. c; {6 M) ?2 Y2 s2 W1 a2 a" }! I
收藏 评论0 发布时间:2018-6-10 15:26

举报

0个回答

所属标签

相似分享

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