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

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

[复制链接]
wfy680 发布时间:2018-6-10 15:26
本帖最后由 wfy680 于 2018-6-10 15:30 编辑 3 I; V& ?" R! \
; p% L9 m5 h1 J: s+ @+ O* c3 c4 c
原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下:$ Z( R. R: Z! A# c3 x
#define SPI_MASTER_NSS           GPIO_Pin_12* |! p& p# G$ ^( S' [- J
#define SPI_MASTER_SCK           GPIO_Pin_13
/ i' u1 u2 u$ Y* s9 c3 Q4 {) A#define SPI_MASTER_MI            GPIO_Pin_14; g8 a, z8 r& `! T3 S/ H
#define SPI_MASTER_MO            GPIO_Pin_15% N3 q# p$ S+ o% d

3 E) A7 @/ |+ Tvoid OLED_Init(void)
, w6 Y) {+ u4 x# ]{
* u2 s3 F; V) S1 w3 z! H3 X  GPIO_InitTypeDef  GPIO_InitStructure;- s4 z8 B) _2 T8 D2 E- d
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);          
8 f4 F9 P& E6 P% X  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 ;          //D/C   BLK   RST
( F% |. e6 K/ n6 j  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽输出% [, X( f4 F: s  N
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz
2 e- @0 j  g: u  c6 Q- ^) h  GPIO_Init(GPIOA, &GPIO_InitStructure);             
* p. S1 C" W0 U' _, G  GPIO_SetBits(GPIOA , GPIO_Pin_9);       // 背光,高电平亮' v2 c0 S! K. `" [3 S* M. C
  OLED_RST_Clr(); // 复位
# c8 v, [; T3 F, L  Delay_ms(2);
+ c4 |$ v! G( ~2 C9 w0 H  OLED_RST_Set();
: p. B( k& O4 f" h  Delay_ms(5);
* g; o8 Q9 d: w4 E6 [: B% c, U
8 F  O/ c) ~  e  }6 k6 M8 Z  SPI2_UserInit();
; j: ~5 z! Y* K- i" U% n. {
2 ]% [) w& G8 x, G//************* Start Initial Sequence **********// , @: k# P: ^: f( ~
  LCD_WR_REG(0xCF);  / j/ k' Q8 ^$ C' q/ M
  LCD_WR_DATA8(0x00);
# @: c% K6 b! p3 O2 E  LCD_WR_DATA8(0xD9); 3 J& w9 t0 J# y5 K
  LCD_WR_DATA8(0X30); . L# U/ A; u5 Y2 a

! l" Z. ]4 K: i5 g$ E7 @  LCD_WR_REG(0xED);  
: p1 s2 c9 L; O) f/ u* d6 E  LCD_WR_DATA8(0x64);
- J8 H- W% m% l2 t5 l  LCD_WR_DATA8(0x03); # a* T3 V* P8 ^+ r2 l3 C0 n/ ]
  LCD_WR_DATA8(0X12);
0 ~8 ?- Z* p4 d& o8 a) `  LCD_WR_DATA8(0X81);
& i# n8 t4 w" s% p6 C
( w; v* Q& F# Y7 t2 o# J, s7 I% a; n- o  LCD_WR_REG(0xE8);    o" j& l) ]0 H% C
  LCD_WR_DATA8(0x85); 7 ^9 r6 `. {, ^* y/ B, }
  LCD_WR_DATA8(0x10); ! u4 {. |1 Z& y9 u* A
  LCD_WR_DATA8(0x78); - t' C0 [- o0 y6 @2 g
& I6 I, q' l$ h% q4 ^
  LCD_WR_REG(0xCB);  
/ f! q& X" z0 x/ S' k  LCD_WR_DATA8(0x39);
. }2 G5 i) q9 m  Y  g, u  LCD_WR_DATA8(0x2C);
' k, J& E2 X. t7 s! L  LCD_WR_DATA8(0x00);
- V/ N- w( t$ q% D5 E  LCD_WR_DATA8(0x34); # a) V7 l. G6 E5 z0 u
  LCD_WR_DATA8(0x02); / G  L: b  t  D9 c/ N1 h

) U0 K7 {7 k8 ~: [7 c0 S/ ]  LCD_WR_REG(0xF7);  
% M0 {3 Q" K) [, g% K7 S  c4 b  LCD_WR_DATA8(0x20); , U2 C* x2 i6 N8 n7 l  r0 @

' |( w+ h1 f+ n" s0 D  LCD_WR_REG(0xEA);  
5 T) L7 d9 q1 ~4 A9 V7 T. x  LCD_WR_DATA8(0x00);
+ V2 t) H$ s% D  @  LCD_WR_DATA8(0x00);
9 m1 i% ^* ~+ X1 j8 Y! |) C" h
  LCD_WR_REG(0xC0);    //Power control ) p) p3 x5 d3 l! P  `
  LCD_WR_DATA8(0x21);   //VRH[5:0]
( P7 X4 B1 U) l; x6 ]& t( d% a+ R' a2 _: W
  LCD_WR_REG(0xC1);    //Power control 8 @% p7 X6 d, [7 b; m
  LCD_WR_DATA8(0x12);   //SAP[2:0];BT[3:0] 2 Z7 ~0 R; j5 W9 E
' s& V' ]& k1 C6 g! s! z" E
  LCD_WR_REG(0xC5);    //VCM control . Y0 ?4 p9 ]) P, B. N/ c
  LCD_WR_DATA8(0x32);
# L5 b2 l, h9 A. j7 h+ H  LCD_WR_DATA8(0x3C); , v3 ^! ^0 l  J. f! e; P
$ i. w8 b/ i) K* W
  LCD_WR_REG(0xC7);    //VCM control2 6 J: p  @; F1 Y9 F
  LCD_WR_DATA8(0XC1);
+ {; e" i  l: `  d. [$ y8 }; x( ^/ L7 N3 M  ?5 N6 S" R
  LCD_WR_REG(0x36);    // Memory Access Control
. H# S9 @( F; i( w5 N% Q- |  LCD_WR_DATA8(0x08);  // BGR顺序+ [7 ]; w5 y9 e# S, h6 x

% w3 p" F. ]; j  LCD_WR_REG(0x3A);     // 16位像素8 v% S# S# ?: T8 a, h( |& a0 @4 \
  LCD_WR_DATA8(0x55); $ b5 y. ^1 c* A

. ^7 I6 y$ ~: Y& `  LCD_WR_REG(0xB1);   //帧速率控制
2 `& t" v) j) c1 p' A3 M$ g5 v  LCD_WR_DATA8(0x00);   
& [1 q* x" s8 V  C! P" u  LCD_WR_DATA8(0x18);
! h- f8 \8 n2 T& J6 O7 i) b- |" V  G! C. I; N# Z
  LCD_WR_REG(0xB6);    // Display Function Control + f/ M3 E3 y3 u0 M" [+ D, F
  LCD_WR_DATA8(0x0A); & n2 ^- V' E/ @9 [+ I( M
  LCD_WR_DATA8(0xA2); 7 u; W7 }3 _: {( B0 Z
; @8 n6 I; v% m; h; l) f

# t$ E4 Y$ i6 k& W. e
9 ~+ k0 M  i( C+ {4 [4 N! v" ]  LCD_WR_REG(0xF2);    // 3Gamma Function Disable
3 _4 a3 C5 T0 o# |8 ]6 e: D0 H- b0 f- y7 @  LCD_WR_DATA8(0x00);
+ i- Y9 P* v4 ]: S: ^6 W% X: l8 n3 [+ a3 s
  LCD_WR_REG(0x26);    //Gamma curve selected
) O, `) t* _( r- q6 U, J  LCD_WR_DATA8(0x01);
' S; i' J7 q" c" B7 c' z  a, M
  LCD_WR_REG(0xE0);    //Set Gamma
1 m/ u; k! e, h. U% @% c  {  LCD_WR_DATA8(0x0F); ( j1 C* m: a% B# @
  LCD_WR_DATA8(0x20); 3 L- h. M. U2 K0 {% ^, ^) M
  LCD_WR_DATA8(0x1E);
& B% T' s' B0 G/ y) N& g  LCD_WR_DATA8(0x09);
* e7 r/ a0 x; `: i  s  LCD_WR_DATA8(0x12);
. r+ g& N+ j+ N% q4 g. m, P$ i4 m  LCD_WR_DATA8(0x0B);
& w8 N" `8 V! y) u  LCD_WR_DATA8(0x50); ; @, r8 n3 {  v: p& \
  LCD_WR_DATA8(0XBA);
. i$ O. H: M1 D5 W3 O  |  U6 u2 r  LCD_WR_DATA8(0x44);
: Y5 b, u" f! E  V* ^, P  LCD_WR_DATA8(0x09);
2 ]$ N4 b  }4 P) s; X; N& P, O2 j  LCD_WR_DATA8(0x14);
- d6 P7 L8 {2 @. m0 d$ C* N9 _! i  LCD_WR_DATA8(0x05); 1 m* R+ z7 L4 _4 s2 R
  LCD_WR_DATA8(0x23);
, ~, x- D, s# Y+ e' N7 m3 B7 Z, a+ W5 |  LCD_WR_DATA8(0x21);
8 @$ L# N" C% |+ T$ ]  LCD_WR_DATA8(0x00);   k; A% O6 T+ y$ Q. `
5 G( {3 s  l# g# S
  LCD_WR_REG(0XE1);    //Set Gamma " o4 |: u, v) L2 J
  LCD_WR_DATA8(0x00);   Q* X9 w' E. F8 d5 Q* C* v" x
  LCD_WR_DATA8(0x19); 9 U9 C! v2 Q1 M% j  A8 M0 ~
  LCD_WR_DATA8(0x19);
0 t; ?  q5 K" q9 K4 p, p/ ^  LCD_WR_DATA8(0x00);
/ r( x3 W+ v& C, C% i  LCD_WR_DATA8(0x12); & ~" ~. N0 @( C- M$ b4 ~( \: V* G
  LCD_WR_DATA8(0x07); - U* K# Y. y& X. [3 v  U. n- W
  LCD_WR_DATA8(0x2D);
- S1 I* w' I5 S  S: e# y  LCD_WR_DATA8(0x28);
$ c# P0 E' {: u, L& K, ~; x% T  LCD_WR_DATA8(0x3F);
! h1 [+ Z# B# c  LCD_WR_DATA8(0x02); ' r  [! J$ u  J- A$ A6 u
  LCD_WR_DATA8(0x0A); 7 i9 K, u1 v) ?: Z( w6 Z, ~
  LCD_WR_DATA8(0x08); / Y! \" l+ P0 e, V, m
  LCD_WR_DATA8(0x25);
1 ?6 i2 N% _4 V; R6 x% R  LCD_WR_DATA8(0x2D); ' z, u# U& k: Y) ~
  LCD_WR_DATA8(0x0F); ; Y! H5 u" q1 R3 F4 h9 i

! ~7 Q/ Y6 x$ ?# B( `  H  LCD_WR_REG(0x11);    //Exit Sleep
, m' q2 |% E3 H% ?9 s; {& C2 T% R' i  Delay_ms(120); % T+ n6 e3 j, o. t
  LCD_WR_REG(0x29);    //Display on
: L9 u6 c1 S3 m
* x1 z" v0 M/ s/ p( o3 z  LCD_DrawPoint(100,100,RED);  // ****设置一个红点验证 , 不成功!!8 [1 J3 u) I" x; Z. ^0 O# y( R5 j

' R7 s5 z9 I' S% I" m6 \/ V& J0 F1 A# n: z
} , ~; O; ^$ c0 L% s" S  c

5 H0 i9 Y: q% n. dvoid LCD_DrawPoint(u16 x,u16 y,u16 Color). G$ ~' J: f: H! O* `
{
4 K; Q! N, W1 P( h: \! g        Address_set(x,y,x,y);//设置光标位置 + h: J. j  z% g: D# U1 \& w
        LCD_WR_DATA(Color);             % N$ ?) M$ S% t" d  H
}
* L0 g  c$ A, [2 I; L' h% r! w0 Y3 k! Z' e: C/ [/ ]1 J  h
6 A, L, b+ {! R, E- {
4 ^: D" Z- Q- i- V
void LCD_WR_DATA8(char da) // 写 8 bit 数据1 q$ F/ l8 Y# M. z, Z
{       
" N! z% F' n4 l  q6 v  OLED_DC_Set();   
1 k! J: x$ f( P8 V0 p9 M5 N  SPI2_Send(da);3 u7 K; j/ k/ X
}  & r. W/ p- x4 Z5 ~

! X/ Z. l* }/ Z9 L* h/ v+ b
/ D& o& R  {# w3 n; ?2 Z8 Wvoid LCD_WR_REG(char da)  // 写 8 bit 指令
. u/ ^7 \  I( O7 z  u{                + X) A+ ^* M& l7 [% n
  OLED_DC_Clr();   2 R' {8 K- D4 A0 u( @
  SPI2_Send(da);. s. i, j& C. q
}7 Z% n  |1 k& y5 H3 u' O

) W  B! X4 j; {5 H  C- F+ t2 q4 T) y. z" z9 F. a1 d4 ^' J  U2 F* t* L

- j8 P% ^0 Y- e# |+ S+ I  g% n( }; I
void LCD_WR_DATA(int da). {7 O' Q. O0 e  `! d  U4 X
{        8 ?- C! p" [# f+ z
  OLED_DC_Set();
: w& X  Z9 O' A* b/ }! Q  SPI2_Send(da>>8);
; E) y5 x$ p1 f& |  SPI2_Send(da);: p  n' Z+ B% c( _
}           + U9 J, x; f% q) o
7 K& A9 D# S+ n% i$ [7 T" {

# D6 ?4 y; r' `; h8 }void SPI2_UserInit( void )
3 P0 M3 V/ ^2 {9 B- D& J% K8 s{0 \' u% c/ ^: u7 }
    GPIO_InitTypeDef GPIO_InitStructure;
" V8 L/ l4 G7 N' C4 B, i& S4 Y    SPI_InitTypeDef  SPI_InitStructure;" b, T, [6 H0 |# p! S0 f

( ~8 Z$ }% ?: Z0 [- k* o# Q
) E. m, l8 n. E, h: g9 E$ x    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);//使能GPIOB时钟0 t# X. Y) B, b
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2+ [$ {/ w, G/ n

% @. E$ L  v" W* n7 F5 X7 t9 O    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_SCK | SPI_MASTER_MO;
" U' l0 |4 b& c    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  p  t1 Q) ^, _" b
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! B0 a9 g& |1 l4 r" [3 @3 v5 T
    GPIO_Init(GPIOB, &GPIO_InitStructure);6 l% C2 L: d8 b1 L7 F3 F

* ]. \- Q1 k* C* g# n# j" _    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI;
6 i) ^& C- F# ?# }9 U    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
. U3 r7 y6 h5 {, }: P- q+ H9 f! N    GPIO_Init(GPIOB, &GPIO_InitStructure);2 V% r! Y+ F5 T
2 u+ w, B" `! }, \2 n
    //GPIO_SetBits(GPIOB , SPI_MASTER_SCK | SPI_MASTER_MO |SPI_MASTER_MI);9 ^# W" x. t" y8 E- Z5 i
8 ^3 _8 u) f6 U* C
7 R" M5 L0 v: H3 F7 r1 @

; k2 N- {' j* W/ _; l    /* SPI2 configuration ------------------------------------------------------*/
+ {* u2 y4 ^/ q! y: O    /* SPI2 configuration ------------------------------------------------------*/% z( x6 X! H' N  m7 X% h
    SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE
" j" E4 F& J9 a1 y    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI_Direction_1Line_Tx , SPI_Direction_2Lines_FullDuplex/ k# a3 t* j& f' D; @
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+ s' \9 c% M8 O; n9 `    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI_DataSize_16b   SPI_DataSize_8b:SPI数据大小:发送8位帧数据结构9 j) e+ b9 [7 [% J
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;   // SCK    SPI_CPOL_Low ,  SPI_CPOL_High: //设备空闲状态时同步时钟SCK的状态,High
9 V7 G5 C$ j' d' h0 p' \( h( X    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1:数据采样从第二个时钟沿开始   9 Y5 d, R& `% b6 W. n
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;    // NSS由软件控件片选   SPI_NSS_Hard   SPI_NSS_Soft
# ]6 U; I$ R. @5 }8 m* o# N    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // SPI_BaudRatePrescaler_8   SPI_BaudRatePrescaler_256
" g$ h- v; a# \8 _" \    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;   SPI_FirstBit_LSB4 o- j( E0 b- Q) H0 i; H
    SPI_InitStructure.SPI_CRCPolynomial = 7;
( ^* S; ~! |7 v# y    SPI_Init(SPI2, &SPI_InitStructure);$ s2 U) C; O1 \/ U$ w+ e

3 R8 h. n% q6 K5 b! x    SPI_Cmd(SPI2, ENABLE);
/ i3 V7 [! e( F) t! ]}
% f' b8 X2 o/ t+ a! E: }3 {
0 \' L+ r" ~1 ~6 X" [' |% T2 B+ E  j, D0 {! }
void SPI2_Send(u8 data)$ f8 [, \4 v. t# U& t
{# X; j7 K  f3 O* X5 R9 k# Z
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);   /* Wait for SPI2 Tx buffer empty */7 A. c% u7 ~9 }4 j
    SPI_I2S_SendData(SPI2, data );$ R2 Y+ a( _7 ]* D' v
}% N' S& V: z' _5 _( z4 ]

3 i5 ^2 a  }) N
0 l7 R1 Z* e1 m$ Fvoid Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
5 S$ j4 p- t! \: ?5 @; _0 c{
1 x/ c/ y6 ^; [( u* {  LCD_WR_REG(0x2a);+ M, W% B( b( J/ i, q) N* ^) L
  LCD_WR_DATA8(x1>>8);4 I% p* P/ T" S( h. N( i
  LCD_WR_DATA8(x1);+ p- G# L" O9 F9 T2 K( p, u7 T' s
  LCD_WR_DATA8(x2>>8);
9 q8 V, P9 }6 E4 Y# c+ k  LCD_WR_DATA8(x2);" e7 ^" j+ D5 @: R; v

0 y3 @5 L2 q6 E& ]  LCD_WR_REG(0x2b);
: \  u$ N' D/ d, \% R! m" T  LCD_WR_DATA8(y1>>8);
3 u- k6 x0 e3 P  LCD_WR_DATA8(y1);; L' S3 [: W. q* O7 x5 T- }/ m& b" s. w
  LCD_WR_DATA8(y2>>8);% |( C( g( k+ P
  LCD_WR_DATA8(y2);& C: K$ T+ c$ g9 J* q( R8 n
; X& Q% P0 j; Y1 ]
  LCD_WR_REG(0x2C);                                                                                          
# \) l+ A8 I1 s  f8 Y$ G! R}6 Y! L9 v1 e& c5 ^; @4 N% ~
4 M$ u/ q9 s5 s& A' p; G. x" f* p
8 y# n# x# _; v+ b5 f
收藏 评论0 发布时间:2018-6-10 15:26

举报

0个回答

所属标签

相似分享

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