初中生
最后登录1970-1-1
在线时间 小时
注册时间2016-10-25
|
5火花
本帖最后由 1826940651 于 2016-11-16 20:26 编辑
这是我测量的片选信号和发送数据的信号,黄色为片选,按照程序的话应该有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); 给寄存器写数据
}
}
|
|