久芯网

STM32F103的SPI驱动不起来

avatar lunar-412568 提问时间: 2023-09-26 19:05:29 / 未解决
STM32F103连接ADC芯片,用SPI1,示波器量不到时钟信号,各管脚都是低电平。代码如下,请帮忙看看是否问题,谢谢!

void ADS_SPI_Init(void)
{  
  /* Configure SPI_MASTER pins: NSS, SCK and MOSI */
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);// GPIOA的RCC在别处

  //配置SPI寄存器
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);// Enable SPI1 reset state

  SPI_I2S_DeInit(SPI1);

  SPI_InitTypeDef SPI_InitStruct;  
  SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //全双工
  SPI_InitStruct.SPI_Mode = SPI_Mode_Master;                        //主模式
  SPI_InitStruct.SPI_DataSize = SPI_DataSize_16b;                   //16位
  SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;                           //时钟极性,SCK空闲时低电平
  SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;                         //时钟相位,下降沿
  SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;                            //硬件模式,NSS脚直接连到从机(ADC芯片)
  SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;   //8分频,72M/8
  SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;                   //高位在前
  SPI_InitStruct.SPI_CRCPolynomial = 7;                             //CRC多项式寄存器(SPI_CRCPR)

  SPI_Init(SPI1,&SPI_InitStruct);                                   //初始化寄存器  
  SPI_SSOutputCmd(SPI1, ENABLE);                                    //NSS输出使能
  SPI_Cmd(SPI1, ENABLE);                                            //使能SPI   
}
/*******************************************************************************
发送
*******************************************************************************/
void ADS_SPI_Send(u16 data)
{
  SPI_I2S_SendData(SPI1, data);
  while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); //发送缓冲器空闲标志(TXE)
}
/*******************************************************************************
读取
*******************************************************************************/
u16 ADS_SPI_Receive(void)
{
  while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)); //接收缓冲器非空(RXNE)
  return(SPI_I2S_ReceiveData(SPI1));
}



如需获得 STM32F103 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

5个回答
  • avatar lebment
    回答时间: 2023-09-26 19:28:11

    HAL库不香?实在不行LL库也可以。

  • avatar jeffhe1
    回答时间: 2023-09-26 19:45:46

    你有先用 sample code 跑一下嗎? 先測試看看 SPI 會不會動 , 假如會動 , 代表設定沒問題 , 再互相對比初始化設定, 接著再查其他設定 & 硬體電路

  • avatar lunar-412568
    回答时间: 2023-09-26 20:03:21

    驱动已正常,可能之前是测试点接触不良问题。发现NSS不能自动控制,需要用普通GPIO口方式控制。发送数据已正常,接收从机数据的信号测出来很怪异,正在查找问题中。

  • avatar xiao_lu
    回答时间: 2023-09-26 20:26:25

    NSS是主机片选,并不是从机片选。多主机的情况下才用。从机的片选用GPIO就行。

  • avatar jeffhe1
    回答时间: 2023-09-26 20:57:33

    SPI_InitStruct.SPI_NSS = SPI_NSS_Hard; 都是設定 soft , 用GPIO去做 CS 基本上不會用 硬體 NSS

会员中心 微信客服
客服
回到顶部