|
本帖最后由 wfy680 于 2018-6-10 15:30 编辑 ( S% ^1 y7 q# F 原本将SPI2对应的IO脚设置成GPIO,模拟SPI与ILI9341通信,一切正常。现在将这个口设置成SPI,通信不显示,请高手指教。代码如下:+ Y; ]% y/ d4 o9 O+ M' d #define SPI_MASTER_NSS GPIO_Pin_12 #define SPI_MASTER_SCK GPIO_Pin_134 j: y. `: B- g' P2 Y4 B #define SPI_MASTER_MI GPIO_Pin_14 #define SPI_MASTER_MO GPIO_Pin_15, I: k* g z$ l. K3 {) ~# I6 I void OLED_Init(void) {- G. v0 R& M8 K6 c GPIO_InitTypeDef GPIO_InitStructure; 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; //推挽输出. \' o6 x2 Q1 s) B GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz* u n: r9 B7 t GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA , GPIO_Pin_9); // 背光,高电平亮0 Z2 B! o% v \' h OLED_RST_Clr(); // 复位 Delay_ms(2); 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(); //************* 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); LCD_WR_DATA8(0X30); LCD_WR_REG(0xED); LCD_WR_DATA8(0x64); " }' ]9 [* ~: O! V1 T% j! e7 C LCD_WR_DATA8(0x03); LCD_WR_DATA8(0X12); LCD_WR_DATA8(0X81); . H- u0 q6 R) L O5 L* L1 x8 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); LCD_WR_DATA8(0x78); 4 {" Q" l# o8 `, ~( L s# G1 b LCD_WR_REG(0xCB); 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); 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 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 LCD_WR_REG(0xC0); //Power control , R: ~' c9 ~* O- [$ P/ i4 ] LCD_WR_DATA8(0x21); //VRH[5:0] ) }2 m( e. M& j0 M' I& T LCD_WR_REG(0xC1); //Power control LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0] , o' H' g# c; p+ G B( V* A LCD_WR_REG(0xC5); //VCM control " ^: N: q) ]+ }# x' f+ O LCD_WR_DATA8(0x32); LCD_WR_DATA8(0x3C); . p5 U) [. R1 T# t% D- m( S LCD_WR_REG(0xC7); //VCM control2 4 p" |; @' }0 j/ M" X LCD_WR_DATA8(0XC1); LCD_WR_REG(0x36); // Memory Access Control LCD_WR_DATA8(0x08); // BGR顺序; @9 C& ?' l$ L6 ~. C LCD_WR_REG(0x3A); // 16位像素 LCD_WR_DATA8(0x55); LCD_WR_REG(0xB1); //帧速率控制 LCD_WR_DATA8(0x00); 7 F1 B9 h [7 p LCD_WR_DATA8(0x18); LCD_WR_REG(0xB6); // Display Function Control LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0xA2); 4 s$ _* e# A4 E$ c 8 x# m8 G5 ]1 J. ^( j 8 ?+ o& K0 c6 Y LCD_WR_REG(0xF2); // 3Gamma Function Disable LCD_WR_DATA8(0x00); & s8 } C% ?( W) E/ s LCD_WR_REG(0x26); //Gamma curve selected LCD_WR_DATA8(0x01); * t- f y6 N; q3 a7 L% s LCD_WR_REG(0xE0); //Set Gamma 8 ?/ r, U( Q$ ~ LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x1E); 3 B: {- J3 U$ f* w' z& E' G7 @2 w5 x- \ LCD_WR_DATA8(0x09); 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); LCD_WR_DATA8(0x44); . T6 o$ K8 ~' N6 _1 h LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x14); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x21); LCD_WR_DATA8(0x00); + 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); LCD_WR_DATA8(0x19); 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); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x25); LCD_WR_DATA8(0x2D); $ C" |& h( D' o LCD_WR_DATA8(0x0F); 9 C( i3 T, C& V6 y) S LCD_WR_REG(0x11); //Exit Sleep # ~% ^* [$ n" Z2 A4 n3 l* d2 Y Delay_ms(120); LCD_WR_REG(0x29); //Display on p6 W; {& |- z; Q/ { LCD_DrawPoint(100,100,RED); // ****设置一个红点验证 , 不成功!! * X2 Q5 q p* `- r+ _' J9 ` } void LCD_DrawPoint(u16 x,u16 y,u16 Color); E8 I- Z( ] C4 o. o9 @ { Address_set(x,y,x,y);//设置光标位置 LCD_WR_DATA(Color); 0 d* s; Z% G1 W! v } : F- J$ j' g$ y : [) \: w, U7 r$ W% C, z void LCD_WR_DATA8(char da) // 写 8 bit 数据 { OLED_DC_Set(); SPI2_Send(da);( x: R3 y$ ^- X4 r: k0 Q2 { } 7 l/ _% ]# k+ |& O' t$ ]8 Q6 K ; H. ?% _4 R8 m1 U void LCD_WR_REG(char da) // 写 8 bit 指令 { OLED_DC_Clr(); SPI2_Send(da); X- M: a2 v- I5 Y% R }& J2 Z5 L: l; O. j c3 f- [ , L$ C$ S. }0 ~3 j1 ]2 `3 k ( M9 A5 h% D" S void LCD_WR_DATA(int da) { 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); } $ Q( `; M% V% P6 \% B 3 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; SPI_InitTypeDef SPI_InitStructure;. o( G* e* K* _8 u" t( G RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2 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; GPIO_Init(GPIOB, &GPIO_InitStructure);' p+ @$ O! N1 M# E GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;. x# n' k: x1 i+ y4 T" p! s GPIO_Init(GPIOB, &GPIO_InitStructure); 4 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 N7 {' U( c# w. J8 K /* SPI2 configuration ------------------------------------------------------*/ /* 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; 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_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 SPI_InitStructure.SPI_CRCPolynomial = 7;; e" G2 B) \- o3 g. P SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE);5 I0 G+ \# S0 ?' Z. A" O8 H2 g+ N3 [ } void SPI2_Send(u8 data) { 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 ); } ! 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) { LCD_WR_REG(0x2a); LCD_WR_DATA8(x1>>8); LCD_WR_DATA8(x1); 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); LCD_WR_DATA8(y2>>8); LCD_WR_DATA8(y2);$ I" U! d6 {# M9 d+ g$ G ' y% E3 P# Y7 |/ m" \8 v6 [ LCD_WR_REG(0x2C); }( \7 @5 j4 K$ z' t% Y |
微信公众号
手机版