
本帖最后由 wfy680 于 2018-6-10 15:30 编辑 原本将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 #define SPI_MASTER_MO GPIO_Pin_15 void OLED_Init(void) { 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; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA , GPIO_Pin_9); // 背光,高电平亮 OLED_RST_Clr(); // 复位 Delay_ms(2); OLED_RST_Set(); Delay_ms(5); SPI2_UserInit(); //************* Start Initial Sequence **********// LCD_WR_REG(0xCF); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0xD9); LCD_WR_DATA8(0X30); LCD_WR_REG(0xED); LCD_WR_DATA8(0x64); LCD_WR_DATA8(0x03); LCD_WR_DATA8(0X12); LCD_WR_DATA8(0X81); LCD_WR_REG(0xE8); LCD_WR_DATA8(0x85); LCD_WR_DATA8(0x10); LCD_WR_DATA8(0x78); LCD_WR_REG(0xCB); LCD_WR_DATA8(0x39); LCD_WR_DATA8(0x2C); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x34); LCD_WR_DATA8(0x02); LCD_WR_REG(0xF7); LCD_WR_DATA8(0x20); LCD_WR_REG(0xEA); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x00); LCD_WR_REG(0xC0); //Power control LCD_WR_DATA8(0x21); //VRH[5:0] LCD_WR_REG(0xC1); //Power control LCD_WR_DATA8(0x12); //SAP[2:0];BT[3:0] LCD_WR_REG(0xC5); //VCM control LCD_WR_DATA8(0x32); LCD_WR_DATA8(0x3C); LCD_WR_REG(0xC7); //VCM control2 LCD_WR_DATA8(0XC1); LCD_WR_REG(0x36); // Memory Access Control LCD_WR_DATA8(0x08); // BGR顺序 LCD_WR_REG(0x3A); // 16位像素 LCD_WR_DATA8(0x55); LCD_WR_REG(0xB1); //帧速率控制 LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x18); LCD_WR_REG(0xB6); // Display Function Control LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0xA2); LCD_WR_REG(0xF2); // 3Gamma Function Disable LCD_WR_DATA8(0x00); LCD_WR_REG(0x26); //Gamma curve selected LCD_WR_DATA8(0x01); LCD_WR_REG(0xE0); //Set Gamma LCD_WR_DATA8(0x0F); LCD_WR_DATA8(0x20); LCD_WR_DATA8(0x1E); LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x12); LCD_WR_DATA8(0x0B); LCD_WR_DATA8(0x50); LCD_WR_DATA8(0XBA); LCD_WR_DATA8(0x44); LCD_WR_DATA8(0x09); LCD_WR_DATA8(0x14); LCD_WR_DATA8(0x05); LCD_WR_DATA8(0x23); LCD_WR_DATA8(0x21); LCD_WR_DATA8(0x00); LCD_WR_REG(0XE1); //Set Gamma LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x19); LCD_WR_DATA8(0x19); LCD_WR_DATA8(0x00); LCD_WR_DATA8(0x12); LCD_WR_DATA8(0x07); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x28); LCD_WR_DATA8(0x3F); LCD_WR_DATA8(0x02); LCD_WR_DATA8(0x0A); LCD_WR_DATA8(0x08); LCD_WR_DATA8(0x25); LCD_WR_DATA8(0x2D); LCD_WR_DATA8(0x0F); LCD_WR_REG(0x11); //Exit Sleep Delay_ms(120); LCD_WR_REG(0x29); //Display on LCD_DrawPoint(100,100,RED); // ****设置一个红点验证 , 不成功!! } void LCD_DrawPoint(u16 x,u16 y,u16 Color) { Address_set(x,y,x,y);//设置光标位置 LCD_WR_DATA(Color); } void LCD_WR_DATA8(char da) // 写 8 bit 数据 { OLED_DC_Set(); SPI2_Send(da); } void LCD_WR_REG(char da) // 写 8 bit 指令 { OLED_DC_Clr(); SPI2_Send(da); } void LCD_WR_DATA(int da) { OLED_DC_Set(); SPI2_Send(da>>8); SPI2_Send(da); } void SPI2_UserInit( void ) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能spi2 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); GPIO_InitStructure.GPIO_Pin = SPI_MASTER_MI; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIO_SetBits(GPIOB , SPI_MASTER_SCK | SPI_MASTER_MO |SPI_MASTER_MI); /* SPI2 configuration ------------------------------------------------------*/ /* SPI2 configuration ------------------------------------------------------*/ SPI_Cmd(SPI2, DISABLE); //必须先disable,才能改变MODE SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI_Direction_1Line_Tx , SPI_Direction_2Lines_FullDuplex 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_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); SPI_Cmd(SPI2, ENABLE); } void SPI2_Send(u8 data) { while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); /* Wait for SPI2 Tx buffer empty */ SPI_I2S_SendData(SPI2, data ); } 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); LCD_WR_DATA8(x2); 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); } |