OpenEdv-开源电子网

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

595控制数码管 SPI配位不知道哪里出现问题了

[复制链接]

12

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-12-8
在线时间
15 小时
发表于 2018-3-21 21:56:51 | 显示全部楼层 |阅读模式
1金钱

求大神指点

void Spi_int(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef  SPI_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStruct);


GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStruct);


// GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_0); //PB3¸´ÓÃΪ SPI1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_0); //PB4¸´ÓÃΪ SPI1
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_0); //PB5¸´ÓÃΪ SPI1

RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;      
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                           
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                       
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                           
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                           
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                              
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;   
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                     
SPI_InitStructure.SPI_CRCPolynomial = 4;                             
SPI_Init(SPI1, &SPI_InitStructure);                                      
SPI_Cmd(SPI1, ENABLE);                                                  }

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-22 01:53:51 | 显示全部楼层
先软件模拟SPI驱动下试试。
回复

使用道具 举报

12

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-12-8
在线时间
15 小时
 楼主| 发表于 2018-3-22 08:11:49 | 显示全部楼层
正点原子 发表于 2018-3-22 01:53
先软件模拟SPI驱动下试试。

如果STM32F030芯片设置成主输出模式,NSS脚设置硬件拉低,硬件拉低是单片机自己硬件拉低还是外部电路将这个脚拉低。
回复

使用道具 举报

12

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-12-8
在线时间
15 小时
 楼主| 发表于 2018-3-22 15:24:01 | 显示全部楼层
本帖最后由 ls2013536 于 2018-3-22 15:34 编辑
正点原子 发表于 2018-3-22 01:53
先软件模拟SPI驱动下试试。


原子哥,你好:
这是我软件模拟的代码

GPIOA_15             SPI1_NSS
GPIOB_3               SPI1_SCK
GPIOB_5               SPI1_MOSI

GPIO_ResetBits(GPIOA, GPIO_Pin_15 );                         //SPI1_NSS
for(i=0;i<8;i++)
{
      GPIO_ResetBits(GPIOB, GPIO_Pin_3 );   //SPI1_SCK                  
       if((0x01&data)!=0)
      {
          GPIO_SetBits(GPIOB, GPIO_Pin_5 );   //SPI1_MOSI
       }
      else GPIO_ResetBits(GPIOB, GPIO_Pin_5 );   //SPI1_MOSI
      GPIO_SetBits(GPIOB, GPIO_Pin_3 );
      data=data>>1;
      }
GPIO_SetBits(GPIOA, GPIO_Pin_15 );





原理图

原理图
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-23 01:55:47 | 显示全部楼层
ls2013536 发表于 2018-3-22 15:24
原子哥,你好:
这是我软件模拟的代码

也不行?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-12-8
在线时间
15 小时
 楼主| 发表于 2018-3-26 07:58:07 | 显示全部楼层

软件模拟的可以啊
但是我用硬件的配置的就不行啊
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
发表于 2018-3-26 14:40:02 | 显示全部楼层
我这边有一个pic单片机上的595驱动程序,我测试完美。但是我软件模拟的。芯片型号是TPIC6B595
回复

使用道具 举报

20

主题

69

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5486
金钱
5486
注册时间
2018-3-25
在线时间
16 小时
发表于 2018-3-26 14:40:26 | 显示全部楼层
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <pic16f877a.h>
/*
* 显示模块的引脚定义如下(从上到下)
* ① 电源 +5V
* ② SER IN ------------串行数据输入引脚 595芯片的 3 脚
* ③ RCK    ------------串行信息输入后 并行信息输出使能引脚 595芯片的 12 脚
* ④ SRCK   ------------串行数据中的每一“位”所需要的 时钟信号 595芯片的 13 脚
* ⑤ 电源地
*/
#define RCK_595 PORTDbits.RD2           //并行数据输出使能
#define SCLK_595 PORTDbits.RD1          //每一"位"所需的时钟信号
#define SDATA_595  PORTDbits.RD0        //串行数据输入
unsigned char leddata[]={               //数码管显示的段信息,自定义的连线 不是标准的段码信息 共阴极
                0x77,  //"0"
                0x41,  //"1"
                0x3B,  //"2"
                0x6B,  //"3"
                0x4D,  //"4"
                0x6E,  //"5"
                0x7E,  //"6"
                0x43,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x5F,  //"A"
                0x7C,  //"B"
                0x36,  //"C"
                0x79,  //"D"
                0x3E,  //"E"
                0x1E,  //"F"
                0x5D,  //"H"
                0x34,  //"L"
                0x57,  //"n"
                0x75,  //"u"
                0x1F,  //"P"
                0x78,  //"o"
                0x08,  //"-"
                0x00,  //熄灭
                0x00  //自定义
};
void WR_595(unsigned char temp)
{
    unsigned char j;
    for (j=0;j<8;j++)
    {
        if(temp&0x01)
        {
            SDATA_595=1;
        }
        else
        {
            SDATA_595=0;
        }
        SCLK_595=1;                     //上升沿发生移位
        asm("nop");
        asm("nop");
        SCLK_595=0;
        temp=temp>>1 ;
    }
}
void OUT_595(void)
{
    RCK_595=1;                     //上升沿将数据送到输出锁存器
    asm("nop");
    asm("nop");
    asm("nop");
    RCK_595=0;
}
void init()
{
    TRISD=0x00;
}
void main()
{
    unsigned int i=12345;
    init();
    SCLK_595=0;
    RCK_595=0;
    while(1)
    {
        WR_595(leddata[i/10000]);
        WR_595(leddata[i%10000/1000]);
        WR_595(leddata[i%10000%1000/100]);
        WR_595(leddata[i%10000%1000%100/10]);
        WR_595(leddata[i%10000%1000%100%10]);
        OUT_595();
        while(1);
    }
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-27 01:45:59 | 显示全部楼层
ls2013536 发表于 2018-3-26 07:58
软件模拟的可以啊
但是我用硬件的配置的就不行啊

改改SPI时序,看看,什么时钟极性之类的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-3-27 09:52:19 | 显示全部楼层
595用stm32spi速度太快,好像反应不过来,只能用io模拟,我以前做过一个f103的595,spi速度快,最慢256分频也快
qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

55

主题

474

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2374
金钱
2374
注册时间
2017-8-7
在线时间
207 小时
发表于 2018-3-27 09:53:46 | 显示全部楼层
你有示波器啥的最好看看,在对比下手册,你自己实验一下,我当时做的也急,没认真研究,
qq1950361006,互帮互助,共同进步。
回复

使用道具 举报

5

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2015-2-9
在线时间
92 小时
发表于 2018-3-27 14:11:38 | 显示全部楼层
TIM截图20180327141334.png     这里不是应该接MOSI吗
回复

使用道具 举报

12

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-12-8
在线时间
15 小时
 楼主| 发表于 2018-3-27 23:12:00 | 显示全部楼层
时间继电器 发表于 2018-3-26 14:40
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG

软件模拟的我已经搞好了    谢谢了
回复

使用道具 举报

12

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-12-8
在线时间
15 小时
 楼主| 发表于 2018-3-27 23:12:34 | 显示全部楼层
御剑江湖 发表于 2018-3-27 14:11
这里不是应该接MOSI吗

接的就是的
回复

使用道具 举报

5

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2015-2-9
在线时间
92 小时
发表于 2018-3-28 10:59:24 | 显示全部楼层

搞个逻辑分析仪  看看时序吧
回复

使用道具 举报

5

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
333
金钱
333
注册时间
2015-2-9
在线时间
92 小时
发表于 2018-3-28 11:19:08 | 显示全部楼层
TIM截图20180328110946.png
看一下时序  我觉得应该这样

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                           
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

//给了发送命令后要检测是否发送完成
SPI_I2S_SendData(SPI2,SendData);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
{
    //延时
}
SPI_I2S_ReceiveData(SPI2);//清除标志位

//这里再给RCLK一个正脉冲  输出锁存 应该就可以了
   
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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