野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17999|回复: 3

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

[复制链接]
发表于 2016-11-16 20:25:31 | 显示全部楼层 |阅读模式
5火花
本帖最后由 1826940651 于 2016-11-16 20:26 编辑

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

下面是程序:

#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;         
    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);    //稳定一下数据
    }
}
//给寄存器写数据
//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);         给寄存器写数据
        }
}



回复

使用道具 举报

发表于 2016-11-16 20:44:15 | 显示全部楼层
示波器测量波形有问题吧,先把波形量对再说吧
回复

使用道具 举报

 楼主| 发表于 2016-11-16 20:54:45 | 显示全部楼层
cancore 发表于 2016-11-16 20:44
示波器测量波形有问题吧,先把波形量对再说吧

怎么?应该怎么量呢?
回复

使用道具 举报

发表于 2016-11-16 21:16:40 | 显示全部楼层
1826940651 发表于 2016-11-16 20:54
怎么?应该怎么量呢?

这波形怎么看啊?幅度,周期没有,然后又不是方波,这都能分析出啥来?
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-24 16:38 , Processed in 0.059761 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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