c - 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
}
解决方案
推荐阅读
- spring - 使用 Spring Websocket STOMP Java 从客户端向服务器发送消息
- terraform - Localstack - AWS API Gateway 使用 Terraform 启用二进制支持
- checkbox - 基于复选框的加减值
- elasticsearch - 锚标记替换模式到标记的末尾
- neo4j - Neo4J 编写密码查询的正确方法
- weblogic12c - Weblogic 12.1.3 到 12.2.1 升级
- ios - 将 UIView 的掩码与多个其他视图一起使用
- angular - 上传和预览 GLTF 文件 (3D)
- c# - Is there a alternative to get .NET that doesn't need admin password?
- python - Is there a way to use multiprocessing in a user defined class on another user defined class to modify one of its attributes in place?