I am working on a project on 20*2 character oled(US2066) so I wrote a code for configuration of SPI and code has not any error or warning but the SPI doesnt work on my code what is the problem?
The configuration of SPI is:
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)));
}
I wrote 2 function as data_start and command_start for contionus transmition.How contionus transmition works shown below.
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
}