oled用硬件spi初始化不了

2019-07-21 05:47发布

#include "spi.h"
#include "delay.h"
SPI_InitTypeDef  SPI_InitStructure;
void SPI1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
       
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //选择了串行时钟的稳态:时钟悬空高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        //SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI1, ENABLE); //使能SPI外设         
}   
//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2   2分频   (SPI 36M@sys 72M)
//SPI_BaudRatePrescaler_8   8分频   (SPI 9M@sys 72M)
//SPI_BaudRatePrescaler_16  16分频  (SPI 4.5M@sys 72M)
//SPI_BaudRatePrescaler_256 256分频 (SPI 281.25K@sys 72M)

void SPI1_SetSpeed(u8 SpeedSet)
{
        SPI_InitStructure.SPI_BaudRatePrescaler = SpeedSet ;
          SPI_Init(SPI1, &SPI_InitStructure);
        SPI_Cmd(SPI1,ENABLE);
}
void oledcmd(u16 data)
{
        dc=0;
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        SPI_I2S_SendData(SPI1,data);
        dc=1;
}
void oleddata(u16 data)
{
        dc=1;
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        SPI_I2S_SendData(SPI1,data);
        dc=0;
}
void clear()
{
        unsigned char yy,xx;
    for(yy=0;yy<8;yy++)
    {
        oledcmd(0xb0+yy);
        oledcmd(0x00);
        oledcmd(0x10);
        for(xx=0;xx<128;xx++)
        oleddata(0xff);
    }
}
void oledinit()
{
       
        GPIO_InitTypeDef  GPIO_InitStructure;
               
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //使能PA端口时钟
               
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_14;                                 //LED0-->PB.5 端口配置
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
         GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5
        res=0;
        delay_ms(10);
        res=1;
        oledcmd(0xae);//--turn off oled panel
    oledcmd(0x00);//---set low column address
    oledcmd(0x10);//---set high column address
    oledcmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
    oledcmd(0x81);//--set contrast control register
        oledcmd(0xff);
    oledcmd(0xcf); // Set SEG Output Current Brightness
    oledcmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
    oledcmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
    oledcmd(0xa6);//--set normal display
    oledcmd(0xa8);//--set multiplex ratio(1 to 64)
    oledcmd(0x3f);//--1/64 duty
    oledcmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
    oledcmd(0x00);//-not offset
    oledcmd(0xd5);//--set display clock divide ratio/oscillator frequency
    oledcmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
    oledcmd(0xd9);//--set pre-charge period
    oledcmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
    oledcmd(0xda);//--set com pins hardware configuration
    oledcmd(0x12);
    oledcmd(0xdb);//--set vcomh
    oledcmd(0x40);//Set VCOM Deselect Level
    oledcmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
    oledcmd(0x02);//
    oledcmd(0x8d);//--set Charge Pump enable/disable
    oledcmd(0x14);//--set(0x10) disable
    oledcmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
    oledcmd(0xa6);// Disable Inverse Display On (0xa6/a7)
    oledcmd(0xaf);//--turn on oled panel
        clear();
}

#ifndef __SPI_H
#define __SPI_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//SPI 驱动函数          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/13
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////           
#define res PAout(8)
#define dc PAout(14)
                                                                                                                                                        
void SPI1_Init(void);                         //初始化SPI口
void SPI1_SetSpeed(u8 SpeedSet); //设置SPI速度   
void clear(void);
void oledinit(void);
void oledcmd(u16 data);
void oleddata(u16 data);
                 
#endif


#include "stm32f10x.h"
#include "spi.h"
int main(void)
{       
          
          SPI1_SetSpeed(SPI_BaudRatePrescaler_256);
         SPI1_Init();
          oledinit();
  while(1)
        {
            
        }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。