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

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

[复制链接]
wfy680 发布时间:2018-6-10 15:26
本帖最后由 wfy680 于 2018-6-10 15:30 编辑
6 b2 Z: F5 x  N3 g$ p, x9 c0 P3 Q6 U) s$ a
原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下:
/ T1 E8 Z% R) U; j#define SPI_MASTER_NSS           GPIO_Pin_12
5 z: Z5 A; L' W+ A$ J" @. o#define SPI_MASTER_SCK           GPIO_Pin_13
; b$ ?. U. h* V5 x: |: Y$ E2 _4 O#define SPI_MASTER_MI            GPIO_Pin_14" D5 y4 U. S8 S' Y8 c
#define SPI_MASTER_MO            GPIO_Pin_15
- p; B" x5 i) G& S( J- O1 Z2 q1 s
9 r$ |3 @! e% W9 P; P* }7 M9 bvoid OLED_Init(void)& g; U7 C. g3 x: v
{
6 W! x3 {8 ~* F- C6 r  GPIO_InitTypeDef  GPIO_InitStructure;
: h* a8 I9 Q; q: d8 R  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);          , P* z6 `# r: t1 }) ?2 }0 [
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 ;          //D/C   BLK   RST" w' B$ D2 N( h' ?; \. y
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽输出" p' N9 y+ e6 o; y  b
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz
3 S8 s- j& `5 H" N+ t  GPIO_Init(GPIOA, &GPIO_InitStructure);              / |( G+ X& [. F# W% p
  GPIO_SetBits(GPIOA , GPIO_Pin_9);       // 背光,高电平亮
2 k% ^& {+ V  ^% t6 h8 @  OLED_RST_Clr(); // 复位. }9 Y- ^( {, Z0 f* I" ]' ]3 W
  Delay_ms(2);/ E1 }* ?& C) o" P5 g
  OLED_RST_Set();* ^- K! B0 H' O7 F5 I4 B( u/ v
  Delay_ms(5);+ p  B4 m: n+ x. o) R8 d
9 R' U1 F; V% S. F8 x
  SPI2_UserInit();
5 L/ Z9 G( I7 z, D* Y* K- O
5 r9 l8 \% x& J! D0 f//************* Start Initial Sequence **********//
2 x" r0 F, ~! o% m  D$ n  LCD_WR_REG(0xCF);  
7 }; U' r, Q. v2 z1 Q  LCD_WR_DATA8(0x00);
" n& u7 \* P6 I) Y: k7 F2 X- |% z' I  LCD_WR_DATA8(0xD9); * C+ D. y/ D# o" S1 F
  LCD_WR_DATA8(0X30); . Q4 ~1 l; c; i8 {

! ~  d1 x7 _' G  LCD_WR_REG(0xED);  
8 X* i; H. R% f9 |1 L( q; O% ?; a  LCD_WR_DATA8(0x64);
' b( u/ S( ^! [' s7 a: o  X  LCD_WR_DATA8(0x03); . A0 i' I: X. X2 F. }: k
  LCD_WR_DATA8(0X12); 8 g) g+ G3 a* f
  LCD_WR_DATA8(0X81); 6 j# d8 ]- H% t6 u7 |

0 p; c8 ]: r' I5 l- i8 z  LCD_WR_REG(0xE8);  
# }& H' k8 p0 L( f& ^8 {  LCD_WR_DATA8(0x85);
. B* J% V) E" J: q# \9 x  LCD_WR_DATA8(0x10);
2 u6 ]& |/ m& T5 [; }2 h% [' T9 o  LCD_WR_DATA8(0x78);
7 b2 B2 S; L! h1 b' E" o8 Z+ A" P3 A
  LCD_WR_REG(0xCB);  
& }: T# f- s$ i; z  LCD_WR_DATA8(0x39);
* Z- q2 Q/ |* N) I2 E7 m( D  LCD_WR_DATA8(0x2C);
. Q! ~( p2 o' E7 r7 M) S/ k& y  LCD_WR_DATA8(0x00);   v7 H4 b5 H! `; ]
  LCD_WR_DATA8(0x34); 3 C( }' e# n* \+ P) c
  LCD_WR_DATA8(0x02); ; _- M, S& }9 y5 h4 r
; m9 O0 k6 P6 Y
  LCD_WR_REG(0xF7);  
, S. K6 K! A% K; A3 E  LCD_WR_DATA8(0x20); ) j. Q; }+ [/ t$ x- q2 X- H: o' P) ]
2 [$ ]- i4 _3 _( }9 p" A$ Y* o
  LCD_WR_REG(0xEA);  8 l' q" P+ z9 _! s2 ~' _+ i
  LCD_WR_DATA8(0x00); 2 ?+ Q) C# R5 k/ A% t
  LCD_WR_DATA8(0x00); * _& j- O" z$ W
) V+ V6 I- Y, x2 `3 q& b0 s* ?
  LCD_WR_REG(0xC0);    //Power control ; v. r2 p& C: d; J$ g2 w
  LCD_WR_DATA8(0x21);   //VRH[5:0] % l9 q& m& z) v9 Z) [( p7 e

7 b! k2 F/ N$ @/ p: G7 w+ p  LCD_WR_REG(0xC1);    //Power control # s/ m: O! ?  L) J
  LCD_WR_DATA8(0x12);   //SAP[2:0];BT[3:0]
3 w* P9 i' Z$ L) i9 F! k8 J! k1 X* Y+ r6 E: |% u
  LCD_WR_REG(0xC5);    //VCM control
$ e( s3 A& Z8 M5 D0 U% e  LCD_WR_DATA8(0x32);
$ F0 C: W+ q0 q  ]. S- J, l: g  LCD_WR_DATA8(0x3C);
& k* k# Q$ }: G, W! j0 f& V# d, D! Q' I$ {
  LCD_WR_REG(0xC7);    //VCM control2 0 T2 p+ m! `, X: m: ~
  LCD_WR_DATA8(0XC1); $ W; ^3 \* K. M& C: u* w
# ?0 o9 Z, A$ j. e9 H
  LCD_WR_REG(0x36);    // Memory Access Control 3 J" k" [% I( J% r! E" r5 b
  LCD_WR_DATA8(0x08);  // BGR顺序
! M2 p5 ^( ^* p  D  u
- t* i. r8 I7 _8 ]! z7 p  LCD_WR_REG(0x3A);     // 16位像素
& q1 X; R; d2 \, O9 k8 f  LCD_WR_DATA8(0x55); ( r  c  @* B3 O/ R2 R& u. u
- [1 ]1 @' t  k2 ?  k; \# l, ?" {
  LCD_WR_REG(0xB1);   //帧速率控制- y3 \; c* H" N
  LCD_WR_DATA8(0x00);   ) r! H, B" A) B0 }: I
  LCD_WR_DATA8(0x18); 4 {6 L6 T) ^) u" D* O

8 F7 n' e4 n4 k9 u5 d4 j, |  LCD_WR_REG(0xB6);    // Display Function Control
; G5 ]* a/ V! [8 v( F+ f  LCD_WR_DATA8(0x0A);
: T1 Q5 |% U4 f2 b6 N  LCD_WR_DATA8(0xA2); % s$ v7 R' @* i9 i
" [; Y8 H! v  d1 w) o4 i
1 `% x1 H" ]" \/ O
( ?# S# T6 E+ \+ W: b0 ^* v
  LCD_WR_REG(0xF2);    // 3Gamma Function Disable ) Z! u' p$ n3 G" m
  LCD_WR_DATA8(0x00); % c7 D: V  G) [7 N# x/ i

9 }6 B5 J! p7 S- ~' D+ B! O  LCD_WR_REG(0x26);    //Gamma curve selected
8 w# S6 ~* D1 V2 d; j; Q& }  LCD_WR_DATA8(0x01); 6 n' n2 n4 b; B

$ f7 Q7 Z& w! [" }! z  LCD_WR_REG(0xE0);    //Set Gamma , m6 W4 l! d# m3 M% v9 [' \
  LCD_WR_DATA8(0x0F);
0 m/ U% m; J( M# i1 }/ y  LCD_WR_DATA8(0x20); + d/ Z: [* p3 G/ \% r- i
  LCD_WR_DATA8(0x1E);   k" @3 ]- \' w. \3 `3 X
  LCD_WR_DATA8(0x09); 6 J  z8 `6 O) s; }9 s( ^1 P# R
  LCD_WR_DATA8(0x12);
' k4 ], z. R9 T1 y; T1 D) h1 ^( I  LCD_WR_DATA8(0x0B); " `% ^  G+ [: L% o' e
  LCD_WR_DATA8(0x50);
& p$ H1 h: J; J: w( t8 E  LCD_WR_DATA8(0XBA); ' X7 N& l! D% R! V8 b$ }
  LCD_WR_DATA8(0x44);
+ M. \6 I1 G6 Q# J0 }  LCD_WR_DATA8(0x09);
$ d- }8 z5 H+ ?3 t9 z  LCD_WR_DATA8(0x14);
% h' W" A6 ~/ B2 r/ i5 z  LCD_WR_DATA8(0x05); # T% \/ Y9 C* H; e
  LCD_WR_DATA8(0x23);
4 [& ^4 \* ?6 I5 J5 j  LCD_WR_DATA8(0x21);
  l) L9 B; d) c; i' v  LCD_WR_DATA8(0x00); ! p* |" N9 W( @- j9 w0 m' K8 Q
+ b% m+ O, z! S8 K! c4 @! S0 L
  LCD_WR_REG(0XE1);    //Set Gamma
9 ^  l' E" V& T. D% L3 l  LCD_WR_DATA8(0x00); 2 Z8 K9 k$ `+ Z9 x" i* C" e
  LCD_WR_DATA8(0x19);
$ f$ t4 ^) [* F8 P, M0 [9 b, h& {  LCD_WR_DATA8(0x19);
* `& @3 c1 O' K) @  LCD_WR_DATA8(0x00); 9 w& s2 |* f7 p- d9 Z3 t
  LCD_WR_DATA8(0x12);
( A7 V  U1 S& M/ A( a# h  g  LCD_WR_DATA8(0x07); & V6 N$ M. e  ~5 W2 k" E7 u
  LCD_WR_DATA8(0x2D); * A$ X. ~& D: S6 k& ~
  LCD_WR_DATA8(0x28); 3 v+ F5 g. d. R
  LCD_WR_DATA8(0x3F);
9 k4 B7 W5 @& N, b# u6 ?  LCD_WR_DATA8(0x02); ; M& g4 c( V; W- V' B
  LCD_WR_DATA8(0x0A);
  b' o- m8 j7 \  LCD_WR_DATA8(0x08);
  c% t  _+ c- l, @! E" C2 \  LCD_WR_DATA8(0x25); 6 ^2 P/ I0 {: F
  LCD_WR_DATA8(0x2D);
! s5 k) I& b8 _, M5 d3 Q7 {  LCD_WR_DATA8(0x0F);
) b" x* ]2 C0 l( l, F7 C3 M, ?% `1 y0 T: y/ G
  LCD_WR_REG(0x11);    //Exit Sleep
- k; Z) \, |% S9 d4 ~8 j$ Y  Delay_ms(120); " z% S2 A. n: u+ k$ I0 E! s5 V
  LCD_WR_REG(0x29);    //Display on
/ ?8 i! K) L1 @, z& W; J( C: i( M, k% ^1 T& C
  LCD_DrawPoint(100,100,RED);  // ****设置一个红点验证 , 不成功!!1 T, j, T- o% {4 ?/ P
) C+ n0 q' o7 w/ t# U( M

( B, c/ P7 M. U+ I} + S; v, N. ^* P
& h$ ~( l3 |4 y; d, U' L
void LCD_DrawPoint(u16 x,u16 y,u16 Color)
2 J0 y9 ?1 B4 o- J4 c{) h9 x# q3 ~9 C% @' y0 Q0 y
        Address_set(x,y,x,y);//设置光标位置
( l/ e* S; @( j) v        LCD_WR_DATA(Color);             
% O+ i+ w8 _) G+ `. R}
6 A% \4 y1 J8 X! s$ b9 y6 A7 @5 {

! d$ i9 _* o* _9 w& o  ~& l
8 T  [: J( N: b6 \0 ivoid LCD_WR_DATA8(char da) // 写 8 bit 数据
+ h3 T5 y! N/ m( e( H. Z6 T{       
. G) m/ x+ \" P- [. z7 u/ u  OLED_DC_Set();   ; D& Y6 }  v4 C
  SPI2_Send(da);
% ^3 Y/ f* g0 x! ^+ E" ^! {}  2 ?. ~* u2 D2 s; m( \( }

4 U4 ~* g4 U. z6 z7 J' ?: }* g( l. J2 o4 M( r0 K1 L  X  d
void LCD_WR_REG(char da)  // 写 8 bit 指令 0 r# N, r) H" s) R- R! F
{               
# m/ H/ ^. ?( M  OLED_DC_Clr();   
9 ^, q% [& F% z& i6 m8 K! K  SPI2_Send(da);- a$ b- U$ O" `: b3 u& C- T# X7 @
}7 M/ R1 Y0 G& Q4 f
! e- e: i5 Y6 m8 H

8 P, {% E. Z3 b( `9 D7 D! V; p* f

- N: l  D7 a, fvoid LCD_WR_DATA(int da)  h+ o  {0 q1 X& U4 j1 o
{        + i/ J+ y: |# y$ D
  OLED_DC_Set();
$ X) r7 k- ], I& p' h+ t  R5 p  SPI2_Send(da>>8);
9 A( b3 n/ M) Z% i  SPI2_Send(da);
) l& U6 b/ s# t9 U}          
! G8 @/ m, m  }  B' T: a5 J8 {% U1 g( j1 i) f, I" W. d+ v

, S4 E1 S' ^) n6 ]6 v. e6 J5 J) evoid SPI2_UserInit( void )
- ?4 U' _# G( d6 }- h{
: A7 T' ~3 N8 z    GPIO_InitTypeDef GPIO_InitStructure;
1 f, h5 _0 J6 o8 A! d" C    SPI_InitTypeDef  SPI_InitStructure;
  p$ r& d& @4 |, A! P/ D% f3 r8 Y' D2 g% e
. k/ t4 ]6 ]& h- X! z* v0 N
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);//使能GPIOB时钟; q; |3 s4 [8 a+ S
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2
9 C# k: u/ c4 M+ F3 `( ^' F; V' R( T2 F- _! v8 s3 ]& P/ Y
    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_SCK | SPI_MASTER_MO;
4 B8 j6 _6 V5 w  @7 m) a; I& n4 X    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
( ~. ^0 g* W- L3 P( q    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" h9 R8 N7 Q7 ^$ T/ }" d6 `, Y    GPIO_Init(GPIOB, &GPIO_InitStructure);
/ p/ i% J5 E- v9 e5 p8 J  p, g% ?( f& a$ R/ a  _3 w4 I% G
    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI;
. D, D/ ^# s/ s! l$ d. Z    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;+ ~  a3 [6 Q4 O* ^3 J* }! k, A# I
    GPIO_Init(GPIOB, &GPIO_InitStructure);0 g1 d- G5 o1 d. I; R% e6 C

0 k- [& z+ J5 @    //GPIO_SetBits(GPIOB , SPI_MASTER_SCK | SPI_MASTER_MO |SPI_MASTER_MI);4 U1 H, @9 r$ d5 J" ]

8 F5 w# ^! Z: m7 m6 x) |
9 l0 Z  r- S4 q' d. |& }8 x9 E7 Z0 u: c* M% D5 }/ G
    /* SPI2 configuration ------------------------------------------------------*/  a9 Y+ K* O& c" D
    /* SPI2 configuration ------------------------------------------------------*/
: p5 y7 Y& s6 J  g, T+ o* j5 q    SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE
. a* j5 Q6 C+ p    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI_Direction_1Line_Tx , SPI_Direction_2Lines_FullDuplex8 l0 Y; l1 r6 o) x* u
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;! s8 t' s' m0 C+ c5 ^5 M& \2 d  b
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI_DataSize_16b   SPI_DataSize_8b:SPI数据大小:发送8位帧数据结构* F* ]& b$ f- C, X/ L# i
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;   // SCK    SPI_CPOL_Low ,  SPI_CPOL_High: //设备空闲状态时同步时钟SCK的状态,High
7 r4 Y/ O# L4 Y; ^0 a    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1:数据采样从第二个时钟沿开始   
3 l4 r, m& a( G9 D& @( X    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;    // NSS由软件控件片选   SPI_NSS_Hard   SPI_NSS_Soft
& Q2 F0 ]0 Q: d! M; F1 L    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // SPI_BaudRatePrescaler_8   SPI_BaudRatePrescaler_256
  H. ?# U7 j5 A7 c% p) U: o    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;   SPI_FirstBit_LSB
' d; o  n' n  R! o    SPI_InitStructure.SPI_CRCPolynomial = 7;
5 p' d: F+ _/ ~1 }2 |    SPI_Init(SPI2, &SPI_InitStructure);
( p, x0 ?3 |+ n1 D, _9 W) L; d" g5 k1 ?. |9 d
    SPI_Cmd(SPI2, ENABLE);
* {; C* e. o  P}/ l! C( P! J1 c6 D! D6 P8 `
: [: E" M9 ~. f3 J- K# o& |3 h

- u: T: H, Z: d% t2 F1 P7 Cvoid SPI2_Send(u8 data): g% |' I1 B$ |- N
{
! e6 _3 d7 N" j4 ]" C/ N3 ^    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);   /* Wait for SPI2 Tx buffer empty */
2 n$ ]1 u7 W! o1 w6 z( R    SPI_I2S_SendData(SPI2, data );1 n) s3 z5 K( F! _; ?; m* s
}
7 v  a3 a: i( C& Q7 r6 J3 T4 {$ |* u0 A9 x* k/ x
9 V+ ^( S8 _! P" q
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)  B' Y& }! p) H8 F( R" n
{
8 V: O% u3 C; z( k  LCD_WR_REG(0x2a);% [' Y' Q3 q3 }) `2 t9 d9 H
  LCD_WR_DATA8(x1>>8);, F9 C. R+ f7 V2 _3 T& S, _
  LCD_WR_DATA8(x1);" |3 R& g% r; e2 H' {- q
  LCD_WR_DATA8(x2>>8);# R2 u/ r( P" y' D3 V$ x- ]
  LCD_WR_DATA8(x2);  w9 M+ t5 d7 o1 k  a8 e0 o6 q. {

; t5 U# ~9 k: J) g7 x2 U  LCD_WR_REG(0x2b);
7 l4 F1 J. X* X3 q: k  LCD_WR_DATA8(y1>>8);
8 X" G, b0 q+ v2 g5 E  LCD_WR_DATA8(y1);
! A( ?' N# t3 H- I6 A: \: y1 v; w+ n  LCD_WR_DATA8(y2>>8);
4 t8 e) @, |- j$ k6 }8 g2 H  LCD_WR_DATA8(y2);
, h+ Z( |( E  R0 G" Y9 F
! z4 X1 Y6 D+ g2 K  LCD_WR_REG(0x2C);                                                                                          
: S% M8 m" N/ b2 m' h5 J3 d! r! Z}
& Y( T& ]- I/ z; ^8 q; G% K  u" i2 [6 x3 g, c8 e1 |
% @* i1 k; ]" ]4 ?( c5 F! T
收藏 评论0 发布时间:2018-6-10 15:26

举报

0个回答

所属标签

相似分享

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