你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103的SPI驱动不起来

[复制链接]
lunar-412568 提问时间:2020-7-15 17:25 /
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));
}


收藏 评论5 发布时间:2020-7-15 17:25

举报

5个回答
lebment 回答时间:2020-7-15 19:33:40
HAL库不香?实在不行LL库也可以。
jeffhe1 回答时间:2020-7-16 08:52:47
你有先用 sample code 跑一下嗎? 先測試看看 SPI 會不會動 , 假如會動 , 代表設定沒問題 , 再互相對比初始化設定, 接著再查其他設定 & 硬體電路  

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

lunar-412568 回答时间:2020-7-16 15:13:38
驱动已正常,可能之前是测试点接触不良问题。发现NSS不能自动控制,需要用普通GPIO口方式控制。发送数据已正常,接收从机数据的信号测出来很怪异,正在查找问题中。
xiao_lu 回答时间:2020-7-16 22:14:40
NSS是主机片选,并不是从机片选。多主机的情况下才用。从机的片选用GPIO就行。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

jeffhe1 回答时间:2020-7-17 11:40:08
SPI_InitStruct.SPI_NSS = SPI_NSS_Hard; 都是設定 soft , 用GPIO去做 CS
基本上不會用 硬體 NSS
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版