(学习中遇到的问题解决后心得)0.96寸OLED显示屏(7针SPI协议)两种编程方式及一些问题的解决之法
程序的讲解在网上有很多,因此我就不做过多的说明了,只对下载一些程序后遇到的问题,给出一些解决之法。就以“中景园电子0.96OLED显示屏_STM32_F103C8系列_SPI_例程”为例进行讲解,希望能帮助到你
在程序没有问题情况下,点进程序后运行会出现11个错误,点击魔术棒按下图所示
点击Device看芯片是否和你的相符,我用的是STM32F103C8,所以选择STM32F103C8,然后点击C/C++,将Define中的H改为M,看下图所示
如果你用ST-Link下载程序可点击Debug,选择对应辅助下载,如下图
接下来点击Settings,选择SW并把MAX改为4M
点击Flash Downlosd,勾选reset and run,这样下载好程序他就自动复位好了
点击OK就可以了,再编写一下程序就没问题了
这样就把程序移植好了,只需要把符合你的芯片的引脚修改一就好了,分别是这两块,改好这两个地方的引脚就可以,连接硬件,下载程序就可以了
接下来讲一下两种不同方式SPI的发送写法
第一种
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
OLED_CS_Clr();
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set();
OLED_DC_Set();
}
第二种
void spi_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;//CS|SCL|SDA
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_12|GPIO_Pin_1;//RST|DC
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_12|GPIO_Pin_1);
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置为全双发送
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;//主SPI
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;//发送接收8为字节
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;//空闲为高电平
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;//第2个跳变沿数据被采样
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;//NSS主机选片由(CS)软件控制
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;//预分频256
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;//数据传输由高到低
SPI_InitStruct.SPI_CRCPolynomial=7;//CRC 值计算的多项式
SPI_Init(SPI1,&SPI_InitStruct);//SPI的初始化
SPI_Cmd(SPI1,ENABLE);//SPI使能
}
void OLED_WR_Byte(u8 dat,u8 cmd)
{
// u8 i;
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
OLED_CS_Clr();
SPI1_SendByte(dat);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY) == SET);非常重要
OLED_CS_Set();
OLED_DC_Set();
}
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY) == SET);我一直想是第二种方式来发送数据,但就是这个地方困扰了我很久,最后再看到一个大佬的一篇文章才让我明白的问题所在的关键,可以去看看https://blog.csdn.net/weixin_42094842/article/details/107352156
这些就是我遇到的一些问题,最终解决了,想着自己走了不少冤枉路,为了让其他有一样困惑的人少走点弯路,特地分享出来希望能够帮助到你。在此也谢谢那些发表文章的大佬们,是你们让我学到了不少东西。如果想要原文件的可通过下面方式获取,在此声明这些文件只作学习参考,不侵犯他人版权
链接:https://pan.baidu.com/s/16zFN--x84MCFdS2ycwfVHw
提取码:ed1x