OpenEdv-开源电子网

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

求助:模拟spi的片选不够,实在不知道哪里出错了!求大侠帮忙!

[复制链接]

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
发表于 2016-11-16 13:06:18 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 1826940651 于 2016-11-16 20:43 编辑

QQ图片20161116202256.jpg
这是我测量的片选信号和发送数据的信号,黄色为片选,按照程序的话应该有25个低电平,选中25次,但是测量出来只有三次,不知道为什么会这样,求高手指点,感激涕零!

下面是程序:

#include "spi.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//3õê¼»ˉ
void SPI_Config(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;  //分别是时钟,片选,主机数据输出MOSI
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;                                       
  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;                                            //推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);
        
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                               //MISO
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;                                       
  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;                                             
  CS=1;                //初始化将片选拉高
  SCK=0;  //时钟空闲
        MOSI=0;  

}
//写时序
void SPI_RW(u8 data)
{
                u8 t;   
    SCK=0;//时钟空闲
    for(t=0;t<8;t++)
    {  
                                if(data&0x80)MOSI=1;
                                else MOSI=0;
                                SCK=1;               //上升沿发送数据
                                delay_us(2);                                          //稳定数据
                                data<<=1;                                         //数据左移
                                if(MISO_Read)                 
                                {
                                        data |= 1;
                                }
                                delay_us(2);                                          //延时稳定数据
                                SCK=0;                                                //时钟空闲
                }
}
//给寄存器写数据
//reg:寄存器地址
//data32:要写的数据
void SPI_RW_Reg(u8 reg, u32 Data32)
{
        u8 i=0;
        u8 Data8[4]={0x00,0x00,0x00,0x00};
        Data8[0]=(Data32>>24)&0xff;
        Data8[1]=(Data32>>16)&0xff;
        Data8[2]=(Data32>>8)&0xff;
        Data8[3]=Data32&0xff;
        CS=0; //片选拉低,选中器件,开始发送数据
        SPI_RW(reg);
         for(i=0;i<4;i++)
        {
          SPI_RW(Data8);
        }
        CS=1; //片选拉高,停止发送数据
}

=================主函数====
#include "usart.h"
#include "spi.h"
#include "led.h"
u8 Register[25]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x010,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F};    //寄存器地址     
u32 data[25]={0xa018,0xa00c,0xa018,0xa018,0xa00c,0xa00c,0x2222000,0x888900,0x22000,0x2aaaaaa,0x4c20a08,0x1a00880,0x986003,0x1181413,0x100000,0x4000400,0x60aa820,0x2,0x164e20,0x57d4000,0x8000f0,0x100f0,0x40096,0x100096,0xf800};    //要发送的数据

int main(void)
{
        u8 i;        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组
        delay_init();                     //初始化延时      
        LED_Init();         
        uart_init(9600);                 //串口初始化      
        SPI_Config();                  //SPI 配置
        delay_ms(2);
        for(i=0;i<25;i++)
        {
                SPI_RW_Reg(Register,data);         给寄存器写数据
               
        }
}
   

QQ图片20161116125651.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 13:10:52 | 显示全部楼层
本帖最后由 1826940651 于 2016-11-16 20:45 编辑

顶顶,求大神帮忙
QQ图片20161116125651.jpg
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2016-11-14
在线时间
16 小时
发表于 2016-11-16 13:40:40 | 显示全部楼层
注释乱码看得好难过。。。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-16 14:00:58 | 显示全部楼层

void SPI_RW(u8 data)函数,sck=0与sck=1之间,缺少明确的延时。

回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-16 14:02:27 | 显示全部楼层

用GPIO模拟的片选,要多少就应当有多少,很容易查。

回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 19:12:01 | 显示全部楼层
zhulikai8 发表于 2016-11-16 13:40
注释乱码看得好难过。。。

忘记修改注释了,刚把注释加好了。
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 19:14:04 | 显示全部楼层
xuande 发表于 2016-11-16 14:02
用GPIO模拟的片选,要多少就应当有多少,很容易查。

我就是用的GPIO模拟SPI,但是只有出来了3次低电平,应该有25次才对,好奇怪。
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-16 19:19:57 | 显示全部楼层
1826940651 发表于 2016-11-16 19:14
我就是用的GPIO模拟SPI,但是只有出来了3次低电平,应该有25次才对,好奇怪。

4L正解。你时钟维持电平弄的不好
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 19:39:15 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-16 19:19
4L正解。你时钟维持电平弄的不好

这个时钟电平没弄好会影响到片选吗?嗯我修改了一下时序的高低电平延时,你看下有没有问题?
//写时序
void SPI_RW(u8 data)
{
    u8 t;         
    for(t=0;t<8;t++)
    {
        SCK=0;  //电平空闲状态
        delay_us(2);   //稳定一下时钟
        if(data&0x80)MOSI=1;
        else MOSI=0;      //根据数据最高位确定MOSI高低电平
        data<<=1;         //数据左移一位
        SCK=1;                //时钟上升沿发送数据
        delay_ms(2);    //稳定一下数据
    }
}

回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 20:30:47 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-16 19:19
4L正解。你时钟维持电平弄的不好

我把时序那里的电平修改之后还是那样,黄色片选只有三次,帮忙在看一下,非常感谢

QQ图片20161116202256.jpg
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 20:33:39 | 显示全部楼层
xuande 发表于 2016-11-16 14:00
void SPI_RW(u8 data)函数,sck=0与sck=1之间,缺少明确的延时。

我修改了一下,片选还是只有三次低电平,好奇怪啊。 QQ图片20161116202256.jpg
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-16 21:51:12 | 显示全部楼层
1826940651 发表于 2016-11-16 20:33
我修改了一下,片选还是只有三次低电平,好奇怪啊。


仿真器单步走,上万用表。

回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-25
在线时间
13 小时
 楼主| 发表于 2016-11-16 22:26:44 | 显示全部楼层
xuande 发表于 2016-11-16 21:51
仿真器单步走,上万用表。

嗯嗯好的,我试一下,谢谢。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 05:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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