lunar-412568 发表于 2020-7-15 17:25:50

STM32F103的SPI驱动不起来

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));
}


lebment 发表于 2020-7-15 19:33:40

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

jeffhe1 发表于 2020-7-16 08:52:47

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

lunar-412568 发表于 2020-7-16 15:13:38

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

zdldcyy 发表于 2020-7-16 22:14:40

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

jeffhe1 发表于 2020-7-17 11:40:08

SPI_InitStruct.SPI_NSS = SPI_NSS_Hard; 都是設定 soft , 用GPIO去做 CS
基本上不會用 硬體 NSS:o
页: [1]
查看完整版本: STM32F103的SPI驱动不起来