首页 > 解决方案 > Spı sck 引脚始终为高电平

问题描述

我正在开发一个 20*2 字符 oled(US2066)的项目,所以我编写了一个用于配置 SPI 的代码,并且代码没有任何错误或警告,但 SPI 在我的代码上不起作用有什么问题?

SPI的配置是:

    void SPI_Port_Config()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

    SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
    SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
    SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
    SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_LSB;
    SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
    SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
    SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
    SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
           
        //SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE);
        
    SPI_Init(SPI1,&SPI_InitStruct);
        
        SPI_Cmd(SPI1, ENABLE); 
}

Data and Command functions basically like this


  void char_command(unsigned char i)
{
      
        GPIO_ResetBits(GPIOE,GPIO_Pin_7);//cs pin=GPIO_Pin_0
  
        delay_ms(10);
   
    send_byte(i);
        delay_ms(1);
        while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));      
        
 
    GPIO_SetBits(GPIOE,GPIO_Pin_7);
}
void char_data(unsigned char i)
{
        GPIO_ResetBits(GPIOE,GPIO_Pin_7);//cs pin
        
        delay_ms(10);
    
        send_byte(i);
        delay_ms(1);
        while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));
        
        data_counter++;                  
    GPIO_SetBits(GPIOE,GPIO_Pin_7);
}
void send_byte(unsigned char data)
{
        first_byte=(data&0x0F)<<4;
        second_byte=((data&0xF0)>>4)<<4;
        
        transmitter_byte=(second_byte<<12)|(first_byte<<4);
            
    SPI1->DR=first_byte;
        delay_ms(1);
        while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));
    SPI1->DR=second_byte;
        delay_ms(1);
        while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));          
}

我为 contionus 传输编写了 2 个函数作为 data_start 和 command_start。 contionus 传输的工作原理如下所示。 在此处输入图像描述

void command_start(void)
{       
        GPIO_ResetBits(GPIOE,GPIO_Pin_7);//cs pin=GPIO_Pin_0
        delay_ms(10);
        SPI1->DR=0x5F; 
        delay_ms(1);
        while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));
        delay_ms(10);
        GPIO_SetBits(GPIOE,GPIO_Pin_7);
}
void data_start(void)
{
  
        GPIO_ResetBits(GPIOE,GPIO_Pin_7);//cs pin=GPIO_Pin_0
        delay_ms(10);
        SPI1->DR=0x1F; 
        delay_ms(1);
        while (!(SPI1->SR & (SPI_I2S_FLAG_TXE)));
        delay_ms(10);
        GPIO_SetBits(GPIOE,GPIO_Pin_7);
}
And Main
void CHAR_Init(void)
{
  GPIO_SetBits(GPIOA,CHAR_SPI_RES); //reset HIGH – inactive
         delay_ms(1); //delay
        
     command_start();
  char_command(0x2A); //function set (extended char_command set)
  char_command(0x71); //function selection A
        data_start();
     char_data(0x00); // disable internal VDD regulator (2.8V I/O). char_data(0x5C) = enable regulator (5V I/O)
     command_start();
  char_command(0x28); //function set (fundamental char_command set)
  char_command(0x08); //display off, cursor off, blink off
  char_command(0x2A); //function set (extended char_command set)
  char_command(0x79); //OLED char_command set enabled
  char_command(0xD5); //set display clock divide ratio/oscillator frequency
  char_command(0x70); //set display clock divide ratio/oscillator frequency
  char_command(0x78); //OLED char_command set disabled
  char_command(0x08); //extended function set (2-lines)
  char_command(0x06); //COM SEG direction
  char_command(0x72); //function selection B
  
        data_start();
     
     char_data(0x00);    //ROM CGRAM selection
     
     command_start();
     
  char_command(0x2A); //function set (extended char_command set)
  char_command(0x79); //OLED char_command set enabled
  char_command(0xDA); //set SEG pins hardware configuration
  char_command(0x10); //set SEG pins hardware configuration
  char_command(0xDC); //function selection C
  char_command(0x00); //function selection C
  char_command(0x81); //set contrast control
  char_command(0x7F); //set contrast control
  char_command(0xD9); //set phase length
  char_command(0xF1); //set phase length
  char_command(0xDB); //set VCOMH deselect level
  char_command(0x40); //set VCOMH deselect level
  char_command(0x78); //OLED char_command set disabled
  char_command(0x28); //function set (fundamental char_command set)
  char_command(0x01); //clear display
  char_command(0x80); //set DDRAM address to 0x00
  char_command(0x0C); //display ON
       delay_ms(100); //delay

 }

标签: carmstm32spistm32f4discovery

解决方案


推荐阅读