本帖最后由 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 #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 void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;- s4 z8 B) _2 T8 D2 E- d RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 ; //D/C BLK RST GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出% [, X( f4 F: s N GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA , GPIO_Pin_9); // 背光,高电平亮' v2 c0 S! K. `" [3 S* M. C OLED_RST_Clr(); // 复位 Delay_ms(2); OLED_RST_Set(); Delay_ms(5); SPI2_UserInit(); //************* Start Initial Sequence **********// , @: k# P: ^: f( ~ LCD_WR_REG(0xCF); / j/ k' Q8 ^$ C' q/ M LCD_WR_DATA8(0x00); LCD_WR_DATA8(0xD9); 3 J& w9 t0 J# y5 K LCD_WR_DATA8(0X30); . L# U/ A; u5 Y2 a LCD_WR_REG(0xED); LCD_WR_DATA8(0x64); LCD_WR_DATA8(0x03); # a* T3 V* P8 ^+ r2 l3 C0 n/ ] LCD_WR_DATA8(0X12); LCD_WR_DATA8(0X81); 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); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x34); # a) V7 l. G6 E5 z0 u LCD_WR_DATA8(0x02); / G L: b t D9 c/ N1 h LCD_WR_REG(0xF7); LCD_WR_DATA8(0x20); , U2 C* x2 i6 N8 n7 l r0 @ LCD_WR_REG(0xEA); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); 1 j8 Y! |) C" h LCD_WR_REG(0xC0); //Power control ) p) p3 x5 d3 l! P ` LCD_WR_DATA8(0x21); //VRH[5:0] & 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); 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); ( ^/ L7 N3 M ?5 N6 S" R LCD_WR_REG(0x36); // Memory Access Control LCD_WR_DATA8(0x08); // BGR顺序+ [7 ]; w5 y9 e# S, h6 x LCD_WR_REG(0x3A); // 16位像素8 v% S# S# ?: T8 a, h( |& a0 @4 \ LCD_WR_DATA8(0x55); $ b5 y. ^1 c* A LCD_WR_REG(0xB1); //帧速率控制 LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x18); 7 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 LCD_WR_REG(0xF2); // 3Gamma Function Disable LCD_WR_DATA8(0x00); 6 W% X: l8 n3 [+ a3 s LCD_WR_REG(0x26); //Gamma curve selected LCD_WR_DATA8(0x01); " B7 c' z a, M LCD_WR_REG(0xE0); //Set Gamma LCD_WR_DATA8(0x0F); ( j1 C* m: a% B# @ LCD_WR_DATA8(0x20); 3 L- h. M. U2 K0 {% ^, ^) M LCD_WR_DATA8(0x1E); LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x12); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x50); ; @, r8 n3 { v: p& \ LCD_WR_DATA8(0XBA); LCD_WR_DATA8(0x44); LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x14); LCD_WR_DATA8(0x05); 1 m* R+ z7 L4 _4 s2 R LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x21); 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); LCD_WR_DATA8(0x00); 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); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x3F); 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); LCD_WR_DATA8(0x2D); ' z, u# U& k: Y) ~ LCD_WR_DATA8(0x0F); ; Y! H5 u" q1 R3 F4 h9 i LCD_WR_REG(0x11); //Exit Sleep Delay_ms(120); % T+ n6 e3 j, o. t LCD_WR_REG(0x29); //Display on LCD_DrawPoint(100,100,RED); // ****设置一个红点验证 , 不成功!!8 [1 J3 u) I" x; Z. ^0 O# y( R5 j % I" m6 \/ V& J0 F1 A# n: z } , ~; O; ^$ c0 L% s" S c void LCD_DrawPoint(u16 x,u16 y,u16 Color). G$ ~' J: f: H! O* ` { Address_set(x,y,x,y);//设置光标位置 + h: J. j z% g: D# U1 \& w LCD_WR_DATA(Color); % N$ ?) M$ S% t" d H } 0 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 { OLED_DC_Set(); SPI2_Send(da);3 u7 K; j/ k/ X } & r. W/ p- x4 Z5 ~ void LCD_WR_REG(char da) // 写 8 bit 指令 { + 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 ) y. z" z9 F. a1 d4 ^' J U2 F* t* L + 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(); SPI2_Send(da>>8); SPI2_Send(da);: p n' Z+ B% c( _ } + U9 J, x; f% q) o 7 K& A9 D# S+ n% i$ [7 T" { void SPI2_UserInit( void ) {0 \' u% c/ ^: u7 } GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure;" b, T, [6 H0 |# p! S0 f RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能GPIOB时钟0 t# X. Y) B, b RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2+ [$ {/ w, G/ n GPIO_InitStructure.GPIO_Pin = SPI_MASTER_SCK | SPI_MASTER_MO; 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 GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 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 @ /* SPI2 configuration ------------------------------------------------------*/ /* SPI2 configuration ------------------------------------------------------*/% z( x6 X! H' N m7 X% h SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE 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; 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 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 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_LSB4 o- j( E0 b- Q) H0 i; H SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure);$ s2 U) C; O1 \/ U$ w+ e SPI_Cmd(SPI2, ENABLE); } 2 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 ] void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) { 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); LCD_WR_DATA8(x2);" e7 ^" j+ D5 @: R; v LCD_WR_REG(0x2b); LCD_WR_DATA8(y1>>8); 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); }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 |