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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版