目标效果:传感器返回值通过SPI通信传输至单片机,单片机通过处理后筛选有效信息进行显示
问题简述:现在通过读取SPI寄存器获得传感器数据,一直无返回值(都是0x00),考虑是时序问题。
尝试:1、修改过APB1的时钟为36M,16M均无效果。
2、考虑是不是SPI2一定要用对应片选引脚,尝试后也无返回数据。
希望有懂的老哥帮帮我!!
下图是传感器的时序
下面是芯片引脚接口,因为芯片自带了spi flash封装,所以我想连接外设,就启用SPI2选用另外一个其他引脚当作片选。不知道可不可以?
一、下面这一段是初始化引脚和SPI
void Rcc_Init(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON); //OPEN_HSE
while(!(RCC->CR>>17));
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //SYSTEMCLK:9*8=72M
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB: 72/1=48M
RCC_PCLK1Config(RCC_HCLK_Div4); //APB1:72/4=18M
RCC_PCLK2Config(RCC_HCLK_Div1); //APB2:72/1=72MS
RCC_PLLCmd(ENABLE);
while(!(RCC->CR>>25));
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //set_pll=sysclk
while(RCC_GetSYSCLKSource() != 0x08);
}
void SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/*使能时钟信号*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE );//PORTB时钟使能
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能
/*SPI2 definated pin*/
/*CLK*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
/*SO*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB
/*user definated pin*/
/*CS1*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_13); //时钟信号空闲位:低
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_SetBits(GPIOD,GPIO_Pin_3);
/*SPI2初始化*/
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx; //设置SPI为单线双向接收
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置为主机
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //设置SPI输出大小:接收16位帧数据
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串口同步时钟空闲位为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //上升沿采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //波特率预分频值256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC计算多项式
SPI_Init(SPI2, &SPI_InitStructure); //初始化寄存器
SPI_Cmd(SPI2, ENABLE); //使能spi外设
}
二、下面这一段是获取数据,但是始终获取的数据都是0x00
```c
void SPI2_ReadWriteByte(void)
{
while (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == SET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
read_byte=SPI_I2S_ReceiveData(SPI2); //返回通过SPI2最近接收的数据
start_byte=1;
}
}
void SPI_ReadSR(void)
{
SPI_CS_CLR; //使能器件
Delay_us(1);
SPI2_ReadWriteByte(); //读取一个字节
SPI_CS_SET; //取消片选
}