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));
}
HAL库不香?实在不行LL库也可以。 你有先用 sample code 跑一下嗎? 先測試看看 SPI 會不會動 , 假如會動 , 代表設定沒問題 , 再互相對比初始化設定, 接著再查其他設定 & 硬體電路 驱动已正常,可能之前是测试点接触不良问题。发现NSS不能自动控制,需要用普通GPIO口方式控制。发送数据已正常,接收从机数据的信号测出来很怪异,正在查找问题中。 NSS是主机片选,并不是从机片选。多主机的情况下才用。从机的片选用GPIO就行。 SPI_InitStruct.SPI_NSS = SPI_NSS_Hard; 都是設定 soft , 用GPIO去做 CS
基本上不會用 硬體 NSS:o
页:
[1]