(学习中遇到的问题解决后心得)0.96寸OLED显示屏(7针SPI协议)两种编程方式及一些问题的解决之法

学习中遇到的问题解决后心得)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 

  • 21
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值