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

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

[复制链接]
wfy680 发布时间:2018-6-10 15:26
本帖最后由 wfy680 于 2018-6-10 15:30 编辑 ( S% ^1 y7 q# F

: ~: u& {" }1 U' |原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下:+ Y; ]% y/ d4 o9 O+ M' d
#define SPI_MASTER_NSS           GPIO_Pin_12
- D; J: f8 g- l% U  U+ p; B' ]1 `#define SPI_MASTER_SCK           GPIO_Pin_134 j: y. `: B- g' P2 Y4 B
#define SPI_MASTER_MI            GPIO_Pin_14
( e! n, a% {0 X( D6 D#define SPI_MASTER_MO            GPIO_Pin_15, I: k* g  z$ l. K3 {) ~# I6 I

. u, d9 I. a& ^7 h5 Fvoid OLED_Init(void)
' t; a" \- P4 ~4 k$ y1 Q{- G. v0 R& M8 K6 c
  GPIO_InitTypeDef  GPIO_InitStructure;
/ F6 u# g0 r- m3 h, K/ {  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);          
& R$ `* w7 f7 I: j+ F  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 ;          //D/C   BLK   RST
1 z$ I' Q3 _  `+ h, N  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //推挽输出. \' o6 x2 Q1 s) B
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz* u  n: r9 B7 t
  GPIO_Init(GPIOA, &GPIO_InitStructure);             
4 |2 m- R; f' |* z4 L( }  GPIO_SetBits(GPIOA , GPIO_Pin_9);       // 背光,高电平亮0 Z2 B! o% v  \' h
  OLED_RST_Clr(); // 复位
: F+ }8 h& d! I* F# y  Delay_ms(2);
8 F$ p0 D) p% e5 x6 N4 \  OLED_RST_Set();# j5 E& g- @' `# V* t
  Delay_ms(5);7 B: b+ d+ P& `1 r. E+ }- q6 j
! l5 s8 G5 h( J5 ?+ _! R
  SPI2_UserInit();
  Z- U$ x2 A" u2 Q9 [2 N- X7 `8 k
1 p  h& E9 k  s/ G//************* Start Initial Sequence **********//   U/ T& a) s- L, v
  LCD_WR_REG(0xCF);  ! T8 ]( l1 n; i7 {5 O+ Q& X
  LCD_WR_DATA8(0x00); + L! N9 O# ~' ~3 j5 E/ H
  LCD_WR_DATA8(0xD9);
8 k5 i  e, O) F7 z* _  LCD_WR_DATA8(0X30);
% m( f( t: F: q5 F
2 z; V) r- h4 s" N" g" c) ~  LCD_WR_REG(0xED);  
& E, S1 v+ c7 A/ j7 [8 a8 S  LCD_WR_DATA8(0x64); " }' ]9 [* ~: O! V1 T% j! e7 C
  LCD_WR_DATA8(0x03);
8 u9 f! j" g& ]3 \  LCD_WR_DATA8(0X12);
2 }- s0 W6 ]2 H* Y  LCD_WR_DATA8(0X81); . H- u0 q6 R) L  O5 L* L1 x8 V

! z9 Q/ J: v0 F& B0 L; v  LCD_WR_REG(0xE8);  9 {# ~: d1 w6 I" L" B
  LCD_WR_DATA8(0x85); ' `: U' j5 V. P, l) Y
  LCD_WR_DATA8(0x10);
0 C1 f; M, t9 J# c( I) T9 T5 e: I1 l: p  LCD_WR_DATA8(0x78);
0 A7 a6 m6 E, J' Y: q2 Y# M4 {" Q" l# o8 `, ~( L  s# G1 b
  LCD_WR_REG(0xCB);  
. ~$ |4 f9 H0 r6 F; g( Y1 G  LCD_WR_DATA8(0x39); : V8 c' o' B# n+ t  L
  LCD_WR_DATA8(0x2C); 5 @4 _6 P3 j- D+ i3 r( e
  LCD_WR_DATA8(0x00); 6 N( |; H3 r5 B& h/ }; y. O. M
  LCD_WR_DATA8(0x34); 1 I% Q% a% G* H! [0 g/ ]& Q, \. L
  LCD_WR_DATA8(0x02);
0 a( z% I8 c8 O- N- s
" L2 F4 h6 f7 V& }3 p& d  LCD_WR_REG(0xF7);  " T6 u) p" u6 g/ t0 L  V9 p
  LCD_WR_DATA8(0x20); ) R4 O+ X: u" Z; h4 [$ G, N

3 e( F0 L, F; s5 l8 }  LCD_WR_REG(0xEA);  : C' T1 K1 L5 ?( F6 d0 e
  LCD_WR_DATA8(0x00); - Q# `% S. [4 F3 A
  LCD_WR_DATA8(0x00); 2 t( W: ]( g8 i0 F

+ J# l" w- F1 ^: o  LCD_WR_REG(0xC0);    //Power control , R: ~' c9 ~* O- [$ P/ i4 ]
  LCD_WR_DATA8(0x21);   //VRH[5:0]
- W. _( J+ s- g- M) }2 m( e. M& j0 M' I& T
  LCD_WR_REG(0xC1);    //Power control
$ [  s3 m6 h  A( K% v) H  LCD_WR_DATA8(0x12);   //SAP[2:0];BT[3:0]
4 O. q6 E! K6 F; d1 X8 b, o' H' g# c; p+ G  B( V* A
  LCD_WR_REG(0xC5);    //VCM control " ^: N: q) ]+ }# x' f+ O
  LCD_WR_DATA8(0x32);
" [1 \4 D7 b5 J6 R' M/ _; I  LCD_WR_DATA8(0x3C);
" u7 \7 U' ?" Z; }' \1 e* I. p5 U) [. R1 T# t% D- m( S
  LCD_WR_REG(0xC7);    //VCM control2 4 p" |; @' }0 j/ M" X
  LCD_WR_DATA8(0XC1);
% T  W7 e# c: {, `
9 z! n* P2 ~) B' P$ ~  LCD_WR_REG(0x36);    // Memory Access Control
' `' i6 H+ H$ f  |3 y. `  LCD_WR_DATA8(0x08);  // BGR顺序; @9 C& ?' l$ L6 ~. C

. k( H" A+ J- V- c3 r" w  LCD_WR_REG(0x3A);     // 16位像素
3 t- o4 M6 X% b& s. }+ C5 j! X  LCD_WR_DATA8(0x55);
! M7 S$ L6 y' b3 q6 g
# y9 T% P9 f  t. Z4 K0 Y+ E' R  LCD_WR_REG(0xB1);   //帧速率控制
& K, p# c/ y' s  LCD_WR_DATA8(0x00);   7 F1 B9 h  [7 p
  LCD_WR_DATA8(0x18);
- j/ X/ F; x+ F8 H) c- a- B
" I5 P5 s9 r5 l4 k# O  LCD_WR_REG(0xB6);    // Display Function Control
6 F3 r1 R. D2 D& L& C0 a- m( W4 }  LCD_WR_DATA8(0x0A);
9 ]! P3 u. K7 K; E) z$ G& n  LCD_WR_DATA8(0xA2); 4 s$ _* e# A4 E$ c
8 x# m8 G5 ]1 J. ^( j
8 ?+ o& K0 c6 Y

2 Q# x4 G- a$ k) m+ X  LCD_WR_REG(0xF2);    // 3Gamma Function Disable
) O; P9 W9 k* g  LCD_WR_DATA8(0x00); & s8 }  C% ?( W) E/ s

" |! @& D9 y: M7 p1 ]/ h  LCD_WR_REG(0x26);    //Gamma curve selected
$ e, ?0 ]+ p: y# Q3 d& W5 r  LCD_WR_DATA8(0x01);
) Z$ E3 ^7 C: v" ~* t- f  y6 N; q3 a7 L% s
  LCD_WR_REG(0xE0);    //Set Gamma 8 ?/ r, U( Q$ ~
  LCD_WR_DATA8(0x0F);
, |( l2 i) V+ l4 i" T4 @6 t7 g" @% l! W* d  LCD_WR_DATA8(0x20);
4 t! @: Q: ]! ~" A9 H  LCD_WR_DATA8(0x1E); 3 B: {- J3 U$ f* w' z& E' G7 @2 w5 x- \
  LCD_WR_DATA8(0x09);
5 t0 m4 n% J1 t2 [6 p  LCD_WR_DATA8(0x12); ! l5 N3 o% f0 a# B8 K( O
  LCD_WR_DATA8(0x0B); 5 }6 W* n7 B  N. B
  LCD_WR_DATA8(0x50); 3 c& b  R7 K2 ~( w! O& A
  LCD_WR_DATA8(0XBA);
. b5 z8 Q7 L: R4 f  LCD_WR_DATA8(0x44); . T6 o$ K8 ~' N6 _1 h
  LCD_WR_DATA8(0x09);
  V7 |% N; D/ q+ T  LCD_WR_DATA8(0x14);
0 z& s/ D8 t6 ~: D8 q1 G  LCD_WR_DATA8(0x05);
6 s* m+ u: [4 U8 b2 M6 |& _4 R5 p! t  LCD_WR_DATA8(0x23);
$ |9 |+ `0 D: }5 \  LCD_WR_DATA8(0x21);
5 _& l% [9 S# d; T/ ^  LCD_WR_DATA8(0x00);
9 q% V" \+ _; c; ?8 s+ x/ l  A+ i; {7 \" X
  LCD_WR_REG(0XE1);    //Set Gamma & H5 I* w6 N% ]: ~9 `( Y
  LCD_WR_DATA8(0x00); % v" n* [  Z2 a4 y0 o  n0 f! G9 U) O& f
  LCD_WR_DATA8(0x19);
' v* f  _; ?  |* }$ E  LCD_WR_DATA8(0x19);
; J, O( ~7 ]! F) a  LCD_WR_DATA8(0x00); " G- h6 Q+ v  M4 g, e
  LCD_WR_DATA8(0x12); / n6 ?+ @0 b( R; Z
  LCD_WR_DATA8(0x07); , T. l. F6 Q. h- \  K3 c' Z* Q
  LCD_WR_DATA8(0x2D); 8 P& X. n6 H3 s" N
  LCD_WR_DATA8(0x28); 4 ~) w9 m9 X' U8 b2 @
  LCD_WR_DATA8(0x3F);
1 T/ q; z6 b1 C/ |9 l, G, N+ p  LCD_WR_DATA8(0x02);
4 ?; T$ d: P! b& y  y  LCD_WR_DATA8(0x0A);
1 x# T0 P) T; ^- {7 A* k  LCD_WR_DATA8(0x08);
0 C  J: D. V* `  `  M1 ~8 F  LCD_WR_DATA8(0x25);
& N9 ?% `8 ^) X& k  LCD_WR_DATA8(0x2D); $ C" |& h( D' o
  LCD_WR_DATA8(0x0F); 9 C( i3 T, C& V6 y) S

$ ?' Q5 W# E  {9 m0 d  LCD_WR_REG(0x11);    //Exit Sleep # ~% ^* [$ n" Z2 A4 n3 l* d2 Y
  Delay_ms(120);
# ?9 R# V. E7 p  LCD_WR_REG(0x29);    //Display on
8 {" \/ {- x& ], X, h  p6 W; {& |- z; Q/ {
  LCD_DrawPoint(100,100,RED);  // ****设置一个红点验证 , 不成功!!
9 \/ Z* X- C" H5 x* X2 Q5 q  p* `- r+ _' J9 `

( W0 T* Z! V9 p+ h4 W}
7 ]' K0 _9 C* {8 N
9 j; X$ J7 o) M: Tvoid LCD_DrawPoint(u16 x,u16 y,u16 Color); E8 I- Z( ]  C4 o. o9 @
{
6 a% ?! I/ g8 D  n, ?        Address_set(x,y,x,y);//设置光标位置
3 }# f; L* x5 m) b0 p        LCD_WR_DATA(Color);             0 d* s; Z% G1 W! v
} : F- J$ j' g$ y

1 r' G9 R9 B6 ~& e# B, K8 H
% g/ u* o' M% I- n: [) \: w, U7 r$ W% C, z
void LCD_WR_DATA8(char da) // 写 8 bit 数据
. [/ S0 O# q# U. _4 P( y- r1 ~{       
! d# y  \/ a2 y3 u  OLED_DC_Set();   
. s& G4 ~& P* G9 [, N  SPI2_Send(da);( x: R3 y$ ^- X4 r: k0 Q2 {
}  7 l/ _% ]# k+ |& O' t$ ]8 Q6 K

0 L: p2 h4 `3 x0 h  I" D- Q5 }; H. ?% _4 R8 m1 U
void LCD_WR_REG(char da)  // 写 8 bit 指令
' n9 u  e- @. N# Z$ I; `5 K{               
: y6 }( P1 \7 L& O& l. v, _% w4 l  OLED_DC_Clr();   
3 `2 j! v) c, j+ |! X% O# P  SPI2_Send(da);  X- M: a2 v- I5 Y% R
}& J2 Z5 L: l; O. j  c3 f- [

- N; I3 B5 z! ], L$ C$ S. }0 ~3 j1 ]2 `3 k

7 w5 h- D$ [% N, x( c2 K+ ?6 ^( M9 A5 h% D" S
void LCD_WR_DATA(int da)
4 D* l. O+ F6 @, T{       
# M8 s6 I6 ^. p, p: b  OLED_DC_Set();- Q4 c) x, q2 t9 E1 r5 L3 F
  SPI2_Send(da>>8);  Z& z! m- C! S( E0 h0 _( K7 B
  SPI2_Send(da);
/ g" T+ h* ]. f7 {9 f$ j}           $ Q( `; M% V% P6 \% B

7 L  y2 g$ ?6 A. ?& u1 H# z3 b* r6 E/ \% t) b
void SPI2_UserInit( void )( {/ h! c* n. Q5 {
{3 s4 x4 m4 o+ L  R0 f
    GPIO_InitTypeDef GPIO_InitStructure;
: i  ^" x, _' `' c$ |0 `$ U; C' A    SPI_InitTypeDef  SPI_InitStructure;. o( G* e* K* _8 u" t( G

7 l% }+ E7 @, H) n
, B0 c( T7 Z! B9 B) @$ E/ w    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);//使能GPIOB时钟
$ l; _1 v  u: K; D1 S    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2
9 d' R5 p) y. z. g) d
, V3 ^7 `  N$ N( V* C- B1 P* ?    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_SCK | SPI_MASTER_MO;0 p4 Z/ Y) y8 u8 c
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;# D/ J' P! `& G6 n+ j& {# C
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
2 V( |. G/ T* G: k6 r* }0 q    GPIO_Init(GPIOB, &GPIO_InitStructure);' p+ @$ O! N1 M# E

( D3 I) O; j6 u3 F    GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI;
( o4 J$ ^* j# o  j+ L. _: D' A    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;. x# n' k: x1 i+ y4 T" p! s
    GPIO_Init(GPIOB, &GPIO_InitStructure);
, |% `" \1 I# e8 V! o2 R4 j- M- e* o# W1 u' T2 x
    //GPIO_SetBits(GPIOB , SPI_MASTER_SCK | SPI_MASTER_MO |SPI_MASTER_MI);9 X$ R8 t( t# f) b" B) C. n

3 V  ]$ d3 C! g9 a8 ]
$ i; d+ N* V0 s9 ]3 N7 {' U( c# w. J8 K
    /* SPI2 configuration ------------------------------------------------------*/
; o% ]' x2 V: i& l4 S; B+ M+ ~! t3 n    /* SPI2 configuration ------------------------------------------------------*/! o. Q4 k. v- E% [. I9 D
    SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE4 t2 a1 k$ [( u% W: g7 n, L
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI_Direction_1Line_Tx , SPI_Direction_2Lines_FullDuplex% V+ G' K  L1 S, C! X+ ]5 u
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
: y9 s8 V! ]6 w  w/ t' H! n% x- i    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI_DataSize_16b   SPI_DataSize_8b:SPI数据大小:发送8位帧数据结构
/ j+ \7 N1 j% ]6 u    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;   // SCK    SPI_CPOL_Low ,  SPI_CPOL_High: //设备空闲状态时同步时钟SCK的状态,High
* Q; E  C4 [. t; ~: M5 z& P- e    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1:数据采样从第二个时钟沿开始   
/ T. ]  W. X% F5 E/ T- _6 y' o0 e    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;    // NSS由软件控件片选   SPI_NSS_Hard   SPI_NSS_Soft0 A5 J$ v, s  q) J7 J" M+ H) e) a
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // SPI_BaudRatePrescaler_8   SPI_BaudRatePrescaler_256+ p0 w2 z# V9 Z7 {1 _
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB;   SPI_FirstBit_LSB
1 V* a) C0 Q4 b1 A8 K6 Y2 Y  f    SPI_InitStructure.SPI_CRCPolynomial = 7;; e" G2 B) \- o3 g. P
    SPI_Init(SPI2, &SPI_InitStructure);
# X$ Z1 N# V# Z
% g$ z7 {3 ~$ x; R& a0 n( [    SPI_Cmd(SPI2, ENABLE);5 I0 G+ \# S0 ?' Z. A" O8 H2 g+ N3 [
}
7 z( y* q6 }( Y+ o/ J0 P
" e& x7 t5 n4 P5 K3 ?, U/ w6 z! S
# }* r1 T5 U# `% x8 ]& @void SPI2_Send(u8 data)
2 i, g9 {! S% q+ l{
2 t: @9 R, O1 d0 R1 f    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);   /* Wait for SPI2 Tx buffer empty */! j$ v9 y! t: ?# B
    SPI_I2S_SendData(SPI2, data );
' }: G4 D& {& g' A5 |  y$ }}
" N( o/ O% K  C% I0 K. n" K& }! Z1 r) i# Y: M4 J# K! f
% y9 p: J1 E) F+ G- r
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
% Q) [$ ~: @# t" K3 f. h" G( W{
2 ?' n" @. v1 M" W" S( {$ G  d  LCD_WR_REG(0x2a);
( l' v' T% ]9 z0 }2 }- T; }( b4 l  LCD_WR_DATA8(x1>>8);
" a3 G/ x! ^4 H6 Q' h2 `/ a  LCD_WR_DATA8(x1);
! ~# L, y4 a8 ?  LCD_WR_DATA8(x2>>8);6 v0 P2 q& N. U& u+ Y: v
  LCD_WR_DATA8(x2);. C0 N3 k: X6 {& m
2 Q9 D7 G) l, @" b7 `$ y
  LCD_WR_REG(0x2b);/ {$ d- ?  e* o2 R& h
  LCD_WR_DATA8(y1>>8);7 k& M) O# R' ~  i; k
  LCD_WR_DATA8(y1);
3 W% ^% F1 u9 J  v  LCD_WR_DATA8(y2>>8);
# Q6 g% m% e5 b9 Z! D! p  L2 R9 l  LCD_WR_DATA8(y2);$ I" U! d6 {# M9 d+ g$ G
' y% E3 P# Y7 |/ m" \8 v6 [
  LCD_WR_REG(0x2C);                                                                                          
" Z! T7 d9 |7 m0 ^2 v}( \7 @5 j4 K$ z' t% Y

( y3 b. J4 S+ I$ g/ O
/ y7 x6 l* N3 }. w9 W
赞 收藏 评论0 发布时间:2018-6-10 15:26

举报

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