本帖最后由 wfy680 于 2018-6-10 15:30 编辑 原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下: #define SPI_MASTER_NSS GPIO_Pin_122 Z" w0 v' n ~1 @ #define SPI_MASTER_SCK GPIO_Pin_13 #define SPI_MASTER_MI GPIO_Pin_14 #define SPI_MASTER_MO GPIO_Pin_15# N, h" c0 O K V% b- }1 q void OLED_Init(void)- S. u/ ]/ Z) J/ i$ G { GPIO_InitTypeDef GPIO_InitStructure;, N& t; u) ]; E+ W5 p7 ]2 ?) n RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); 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; //推挽输出 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); // 背光,高电平亮 OLED_RST_Clr(); // 复位7 N2 d, j& t( g3 v) U7 { Delay_ms(2);9 y1 W) G. c+ ` OLED_RST_Set(); 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(); - 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); LCD_WR_DATA8(0xD9); LCD_WR_DATA8(0X30); : p& L/ b0 l4 W. p( h LCD_WR_REG(0xED); ' }4 S# J7 h$ t$ s q LCD_WR_DATA8(0x64); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0X12); LCD_WR_DATA8(0X81); 5 V m7 k6 |+ H; A. ]8 X' n4 |" c 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 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); LCD_WR_DATA8(0x34); LCD_WR_DATA8(0x02); % X+ L. i7 M3 g' Y" n+ S' Z: i LCD_WR_REG(0xF7); LCD_WR_DATA8(0x20); / c" S. N! H9 L LCD_WR_REG(0xEA); ; V: q" K" |. r LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); 7 J, o8 L. _5 b" [" T1 E % g2 c1 ~; r. Q3 l) | LCD_WR_REG(0xC0); //Power control LCD_WR_DATA8(0x21); //VRH[5:0] 5 s; f; A; Y3 v7 a 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] # k( i T, V0 P LCD_WR_REG(0xC5); //VCM control ! E# h: r, H+ _6 }* C3 G$ W LCD_WR_DATA8(0x32); LCD_WR_DATA8(0x3C); LCD_WR_REG(0xC7); //VCM control2 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 LCD_WR_REG(0xB1); //帧速率控制& t" v$ s' X9 K+ ] LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x18); 3 ~- Z' [( f. v! X& q0 [$ H" R 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); LCD_WR_REG(0xF2); // 3Gamma Function Disable " n9 ?( n" p9 m1 j LCD_WR_DATA8(0x00); LCD_WR_REG(0x26); //Gamma curve selected 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); LCD_WR_DATA8(0x12); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x50); 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); 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); LCD_WR_DATA8(0x19); 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); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x3F); - x" o" `! Y: _ LCD_WR_DATA8(0x02); 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); LCD_WR_DATA8(0x0F); LCD_WR_REG(0x11); //Exit Sleep Delay_ms(120); $ C' F+ S$ @ ]+ M D. e LCD_WR_REG(0x29); //Display on LCD_DrawPoint(100,100,RED); // ****设置一个红点验证 , 不成功!!+ ?( }# t; P/ s' I+ V } . _/ {5 Q. t: o+ A1 N void LCD_DrawPoint(u16 x,u16 y,u16 Color) { Address_set(x,y,x,y);//设置光标位置 LCD_WR_DATA(Color); % ~$ e% `- n. C# q, Y } * 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 { OLED_DC_Set(); ; N$ D7 Q- h1 Y* D+ p/ J SPI2_Send(da); } 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 } u% C; y! q$ p9 v5 p& w H 3 ~( N) u* p/ O9 J" g void LCD_WR_DATA(int da)8 s4 k$ k$ k4 ^: u+ [ { 5 L. [) \2 ?2 p( C# I OLED_DC_Set(); 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 ) {. R9 Q `( _4 Y- n5 H3 d+ Q* { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; 7 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; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;6 }/ d' d6 [ S' @ GPIO_Init(GPIOB, &GPIO_InitStructure); * {* 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 " d0 `3 E& _/ {. y. [$ x /* SPI2 configuration ------------------------------------------------------*/ /* SPI2 configuration ------------------------------------------------------*/ 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位帧数据结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // SCK SPI_CPOL_Low , SPI_CPOL_High: //设备空闲状态时同步时钟SCK的状态,High SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1:数据采样从第二个时钟沿开始 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 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); } " 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 ); } 3 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) { 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); LCD_WR_DATA8(x2>>8); 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 LCD_WR_REG(0x2C); {& R- V# T: H0 E# m } 2 W1 a2 a" }! I |