OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4696|回复: 3

求助:STM8S003硬件SPI无法驱动0.96的OLED,但是软件SPI可以驱动。

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-8-14
在线时间
7 小时
发表于 2020-8-15 10:25:27 | 显示全部楼层 |阅读模式
2金钱
大佬们好,我准备使用stm8S003硬件SPI驱动OLED,配置好后怎么弄都无法驱动,然后移植了一下原子哥stm32f103的软件驱动到stm8上,发现相同的引脚,软件可以驱动成功。找了一天,各种例程都参考了,又用stm32f103的硬件spi写了一下,发现也可以驱动成功,只有stm8的硬件spi不行,麻烦大佬们帮忙找一下哪里有问题ORZ ORZ
  1. 由于这个论坛系统的代码块不太好看,我用图片放代码了ORZ。
复制代码






OLED只写了一个让它全白的做测试

只有俩金钱ORZ


main.rar

1.65 KB, 下载次数: 22

main.c

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-8-14
在线时间
7 小时
 楼主| 发表于 2020-8-15 10:25:53 | 显示全部楼层
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm8s.h"



  3. /* Private typedef -----------------------------------------------------------*/

  4. /* Private define ------------------------------------------------------------*/
  5. #define OLED_CMD  0        //写命令
  6. #define OLED_DATA 1        //写数据
  7. #define HARDWARE_SPI
  8. #define STM8S003




  9. static void delay(__IO uint32_t nCount)
  10. {
  11.   /* Decrement nCount value */
  12.   while (nCount != 0)
  13.   {
  14.     nCount--;
  15.   }
  16. }

  17. void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
  18. {                        
  19.   
  20.         if(cmd == 1)GPIO_WriteHigh(GPIOC, GPIO_PIN_4);//PC4是D/C线
  21.         else GPIO_WriteLow(GPIOC,GPIO_PIN_4);
  22.         
  23. #ifdef HARDWARE_SPI
  24.         
  25.         while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
  26.         SPI_SendData(dat);
  27.         
  28. #else
  29.         u8 i;                          

  30.         for(i=0;i<8;i++)
  31.         {                          
  32.                 GPIO_WriteLow(GPIOC,GPIO_PIN_5);
  33.                 if(dat&0x80)GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
  34.                 else GPIO_WriteLow(GPIOC,GPIO_PIN_6);
  35.                 GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
  36.                 dat<<=1;   
  37.         }                                 
  38. #endif        
  39. }

  40. void OLED_WriteCmd(uint8_t dat){
  41.   OLED_WR_Byte(dat,OLED_CMD);
  42. }

  43. void gpioInit(){
  44. //  GPIO_DeInit(GPIOC);
  45. //  GPIO_DeInit(GPIOB);
  46.   GPIO_Init(GPIOC, GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//D/C
  47.   GPIO_Init(GPIOB, GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//RST
  48.   GPIO_Init(GPIOC, GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//SCK
  49.   GPIO_Init(GPIOC, GPIO_PIN_6,GPIO_MODE_OUT_PP_HIGH_FAST);//MOSI
  50. }





  51. void OLEDInit(){
  52.         GPIO_WriteHigh(GPIOC, GPIO_PIN_4);
  53.         GPIO_WriteLow(GPIOB,GPIO_PIN_5);
  54.         delay(0xFFF);
  55.         GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
  56.         delay(0xFFF);

  57.         OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
  58.         OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
  59.         OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率
  60.         OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
  61.         OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
  62.         OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
  63.         OLED_WR_Byte(0X00,OLED_CMD); //默认为0

  64.         OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
  65.                                                                                                             
  66.         OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
  67.         OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
  68.         OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
  69.         OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
  70.         OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
  71.         OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
  72.         OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
  73.         OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
  74.                  
  75.         OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
  76.         OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
  77.         OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
  78.         OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
  79.         OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
  80.         OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

  81.         OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
  82.         OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示                                                              
  83.         OLED_WR_Byte(0xAF,OLED_CMD); //开启显示         
  84. }


  85. //SPI初始化
  86. void spiInit(){
  87. #ifdef HARDWARE_SPI
  88.   SPI_DeInit();
  89.   SPI_Init(SPI_FIRSTBIT_MSB,
  90.            SPI_BAUDRATEPRESCALER_8,
  91.            SPI_MODE_MASTER,
  92.            SPI_CLOCKPOLARITY_HIGH,
  93.            SPI_CLOCKPHASE_2EDGE,
  94.            SPI_DATADIRECTION_1LINE_TX,
  95.            SPI_NSS_SOFT,(uint8_t)0x07);
  96.   SPI_Cmd(ENABLE);
  97. #endif
  98. }

  99. //屏幕刷新
  100. void OLED_Refresh_Gram(void)
  101. {
  102.         uint8_t i,n;                    
  103.         for(i=0;i<8;i++)  
  104.         {  
  105.                 OLED_WR_Byte (0xb0+i,OLED_CMD);   
  106.                 OLED_WR_Byte (0x00,OLED_CMD);      
  107.                 OLED_WR_Byte (0x10,OLED_CMD);      
  108.                 for(n=0;n<128;n++)OLED_WR_Byte(0xFF,OLED_DATA);
  109.         }   
  110. }


  111. void main(void)
  112. {
  113.   CLK_HSICmd(ENABLE);
  114.   CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
  115.   CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
  116.   CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI,ENABLE);
  117. //  CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,CLK_SOURCE_HSI,DISABLE,CLK_CURRENTCLOCKSTATE_ENABLE);
  118.   gpioInit();
  119.   spiInit();
  120.   delay(400);
  121.   OLEDInit();
  122.   
  123.   while(1) OLED_Refresh_Gram();
  124. }


复制代码
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-8-14
在线时间
7 小时
 楼主| 发表于 2020-8-15 10:26:22 | 显示全部楼层
图片好像冇了ORZ
回复

使用道具 举报

4

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
488
金钱
488
注册时间
2015-4-20
在线时间
51 小时
发表于 2020-10-11 10:35:29 | 显示全部楼层
我的情况和你的差不多,STM32软硬件SPI都能驱动oled,换成STM8就不行了。我用的是中景园的,这个模块用的是RC延时实现复位,所以没有复位引脚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表