打印
[STM8]

STM8S 硬件SPI驱动74HC595

[复制链接]
1297|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

  一直对STM8S的硬件SPI感兴趣,但没有真正使用过,以往都是用IO口模拟,这次刚好有个板子上有两个595驱动的8位LED数码管,就在上面试了一把,把过程记录一下。

      硬件接线图:

595是数据接收器件,所以MCU只用了3条线与之相连,分别是MOSI接SER,SCK接CLK,NSS接RCK。其实这里RCK可以用其他的IO口的。
      相关的代码:

      LOCAL uint8 DISP_BUF[8]={0,1,2,3,4,5,6,7};             //显示缓冲区
      PUBLIC uint8 DISP_TAB[]=                                      //显示码表
      {
               0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x04,0x05,0x06,0xA4,0x3C

      };
      相关的IO口设为上拉输出
      LOCAL void gpio_init(void)
      {
          GPIO_DeInit(GPIOC);
          GPIO_Init(GPIOC,GPIO_PIN_5|GPIO_PIN_6,GPIO_MODE_OUT_PP_LOW_FAST);
          GPIO_DeInit(GPIOE);
          GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_FAST);
      }


      SPI初始化
      LOCAL void spi_init(void)
     {
          SPI_DeInit();
          CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI, ENABLE);
   
          SPI_Init(SPI_FIRSTBIT_LSB, SPI_BAUDRATEPRESCALER_256, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT, 0x07);
          SPI_Cmd(ENABLE);
      }

      显示程序
      PUBLIC void DISP_Display(void)
      {
          uint8 i,dig = 0x80;
   
          for (i=0;i<8;i++)
          {
              GPIO_WriteLow(GPIOE,GPIO_PIN_5);
              while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
              SPI_SendData(DISP_TAB[DISP_BUF]);      
              while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
              SPI_SendData(dig);
              while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
              GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
              delay(20);
              dig >>= 1;
          }
      }


  

沙发
mintspring|  楼主 | 2017-4-20 16:33 | 只看该作者
编译运行,出现的字符如下:

用示波器看了下,MOSI脚和SCK脚的波形正常。猜想是硬件SPI的速度太快,595跟不上。于是修改代码,在两次发送数据之后都延时一下。
      PUBLIC void DISP_Display(void)
      {
          uint8 i,dig = 0x80;
   
          for (i=0;i<8;i++)
          {
              GPIO_WriteLow(GPIOE,GPIO_PIN_5);
              while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
              SPI_SendData(DISP_TAB[DISP_BUF]);   

              delay(500);  
              while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
              SPI_SendData(dig);

              delay(500);
              while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
              GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
              delay(20);
              dig >>= 1;
          }
      }


使用特权

评论回复
板凳
mintspring|  楼主 | 2017-4-20 16:34 | 只看该作者
再次编译运行,显示如下:

    结论:
        1. STM8S 硬件SPI的速度较快,实际应用的时候需要考虑外部设备的响应速度问题。
        2. while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);只能保证每次SPI发送数据前,发送缓冲区是空的,即上次数据已经发送完成,但不能保证外部设备正确接收了数据。

使用特权

评论回复
地板
wahahaheihei| | 2017-4-20 19:51 | 只看该作者
这个方法真好,用便宜的常用芯片,搭建了功能强大的驱动器。

使用特权

评论回复
5
shenghe511| | 2019-3-22 16:28 | 只看该作者
  very good .

使用特权

评论回复
6
itchente| | 2022-8-16 15:38 | 只看该作者
大佬,为什么我按你的方法去驱动一位数码管,发送的数据的也不准确呢?

使用特权

评论回复
7
wwppd| | 2022-8-17 16:33 | 只看该作者
74HC595好久没用过了。   

使用特权

评论回复
8
yujielun| | 2022-8-18 17:37 | 只看该作者
这个简单多了。   

使用特权

评论回复
9
uptown| | 2022-8-18 18:45 | 只看该作者
模拟Io口比这个简单的。   

使用特权

评论回复
10
averyleigh| | 2022-8-18 19:25 | 只看该作者
为什么要用spi呢?   

使用特权

评论回复
11
pklong| | 2022-8-19 20:10 | 只看该作者
硬件SPI好用吗   

使用特权

评论回复
12
linfelix| | 2022-9-11 11:16 | 只看该作者
SPI硬件电路怎样设计

使用特权

评论回复
13
ingramward| | 2022-9-11 12:53 | 只看该作者
SPI 与74HC595怎么传输数据

使用特权

评论回复
14
primojones| | 2022-9-11 13:45 | 只看该作者
双74HC595驱动8*8点阵  

使用特权

评论回复
15
vivilyly| | 2022-9-11 14:50 | 只看该作者
SPI控制两个74HC595控制四位数码管

使用特权

评论回复
16
mnynt121| | 2022-9-11 17:01 | 只看该作者
软件模拟的SPI和硬件SPI哪个速度比较快

使用特权

评论回复
17
uptown| | 2022-9-11 18:06 | 只看该作者
用软件SPI和用硬件SPI有啥区别?

使用特权

评论回复
18
gouguoccc| | 2022-9-11 18:19 | 只看该作者
串转并

使用特权

评论回复
19
quickman| | 2022-9-12 12:56 | 只看该作者
spi 怎么进行设备硬件的初始化

使用特权

评论回复
20
selongli| | 2022-9-12 15:17 | 只看该作者
stm32怎样驱动74hc595

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

4810

帖子

24

粉丝