本帖最后由 wfy680 于 2018-6-10 15:30 编辑 9 c0 P3 Q6 U) s$ a 原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下: #define SPI_MASTER_NSS GPIO_Pin_12 #define SPI_MASTER_SCK GPIO_Pin_13 #define SPI_MASTER_MI GPIO_Pin_14" D5 y4 U. S8 S' Y8 c #define SPI_MASTER_MO GPIO_Pin_15 void OLED_Init(void)& g; U7 C. g3 x: v { GPIO_InitTypeDef GPIO_InitStructure; 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 GPIO_Init(GPIOA, &GPIO_InitStructure); / |( G+ X& [. F# W% p GPIO_SetBits(GPIOA , GPIO_Pin_9); // 背光,高电平亮 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(); //************* Start Initial Sequence **********// LCD_WR_REG(0xCF); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0xD9); * C+ D. y/ D# o" S1 F LCD_WR_DATA8(0X30); . Q4 ~1 l; c; i8 { LCD_WR_REG(0xED); LCD_WR_DATA8(0x64); 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 | LCD_WR_REG(0xE8); LCD_WR_DATA8(0x85); LCD_WR_DATA8(0x10); LCD_WR_DATA8(0x78); ' E" o8 Z+ A" P3 A LCD_WR_REG(0xCB); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x2C); 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); 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 LCD_WR_REG(0xC1); //Power control # s/ m: O! ? L) J LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0] ! k1 X* Y+ r6 E: |% u LCD_WR_REG(0xC5); //VCM control LCD_WR_DATA8(0x32); LCD_WR_DATA8(0x3C); & 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顺序 LCD_WR_REG(0x3A); // 16位像素 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 LCD_WR_REG(0xB6); // Display Function Control LCD_WR_DATA8(0x0A); 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 LCD_WR_REG(0x26); //Gamma curve selected LCD_WR_DATA8(0x01); 6 n' n2 n4 b; B LCD_WR_REG(0xE0); //Set Gamma , m6 W4 l! d# m3 M% v9 [' \ LCD_WR_DATA8(0x0F); 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); LCD_WR_DATA8(0x0B); " `% ^ G+ [: L% o' e LCD_WR_DATA8(0x50); LCD_WR_DATA8(0XBA); ' X7 N& l! D% R! V8 b$ } LCD_WR_DATA8(0x44); LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x14); LCD_WR_DATA8(0x05); # T% \/ Y9 C* H; e LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x21); 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 LCD_WR_DATA8(0x00); 2 Z8 K9 k$ `+ Z9 x" i* C" e LCD_WR_DATA8(0x19); LCD_WR_DATA8(0x19); LCD_WR_DATA8(0x00); 9 w& s2 |* f7 p- d9 Z3 t LCD_WR_DATA8(0x12); 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); LCD_WR_DATA8(0x02); ; M& g4 c( V; W- V' B LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x25); 6 ^2 P/ I0 {: F LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x0F); 7 C3 M, ?% `1 y0 T: y/ G LCD_WR_REG(0x11); //Exit Sleep Delay_ms(120); " z% S2 A. n: u+ k$ I0 E! s5 V LCD_WR_REG(0x29); //Display on ( 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 } + S; v, N. ^* P & h$ ~( l3 |4 y; d, U' L void LCD_DrawPoint(u16 x,u16 y,u16 Color) {) h9 x# q3 ~9 C% @' y0 Q0 y Address_set(x,y,x,y);//设置光标位置 LCD_WR_DATA(Color); } ! s$ b9 y6 A7 @5 { void LCD_WR_DATA8(char da) // 写 8 bit 数据 { OLED_DC_Set(); ; D& Y6 } v4 C SPI2_Send(da); } 2 ?. ~* u2 D2 s; m( \( } . 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 { OLED_DC_Clr(); 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 ( `9 D7 D! V; p* f void LCD_WR_DATA(int da) h+ o {0 q1 X& U4 j1 o { + i/ J+ y: |# y$ D OLED_DC_Set(); SPI2_Send(da>>8); SPI2_Send(da); } : a5 J8 {% U1 g( j1 i) f, I" W. d+ v void SPI2_UserInit( void ) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; % 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 ( T2 F- _! v8 s3 ]& P/ Y GPIO_InitStructure.GPIO_Pin = SPI_MASTER_SCK | SPI_MASTER_MO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); % ?( f& a$ R/ a _3 w4 I% G GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI; 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 //GPIO_SetBits(GPIOB , SPI_MASTER_SCK | SPI_MASTER_MO |SPI_MASTER_MI);4 U1 H, @9 r$ d5 J" ] 8 x9 E7 Z0 u: c* M% D5 }/ G /* SPI2 configuration ------------------------------------------------------*/ a9 Y+ K* O& c" D /* SPI2 configuration ------------------------------------------------------*/ SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE 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 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA=1:数据采样从第二个时钟沿开始 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // NSS由软件控件片选 SPI_NSS_Hard SPI_NSS_Soft SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // SPI_BaudRatePrescaler_8 SPI_BaudRatePrescaler_256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//SPI_FirstBit_MSB; SPI_FirstBit_LSB SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); ) L; d" g5 k1 ?. |9 d SPI_Cmd(SPI2, ENABLE); }/ l! C( P! J1 c6 D! D6 P8 ` : [: E" M9 ~. f3 J- K# o& |3 h void SPI2_Send(u8 data): g% |' I1 B$ |- N { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); /* Wait for SPI2 Tx buffer empty */ SPI_I2S_SendData(SPI2, data );1 n) s3 z5 K( F! _; ?; m* s } 3 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 { 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. { LCD_WR_REG(0x2b); LCD_WR_DATA8(y1>>8); LCD_WR_DATA8(y1); LCD_WR_DATA8(y2>>8); LCD_WR_DATA8(y2); LCD_WR_REG(0x2C); } % K u" i2 [6 x3 g, c8 e1 | % @* i1 k; ]" ]4 ?( c5 F! T |