我现在遇到一个问题,采用STM32的硬件SPI,但是没接片选信号线,想问下,我现在想使用SPI2,该怎样配置呢?下面是我自己的配置代码,但发现始终SPI没工作。
[mw_shl_code=c,true]RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);////SCK
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);////MOSI/MISO GPIO
/**********配置SPI 口的IO口功能************/
GPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2); //Port C Pin 3 is SPI2 MOSI
GPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF_SPI2); //Port C Pin 2 is SPI2 MISO
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_SPI2); //Port B Pin 10 is SPI2 SCK
/* Configure SPI MISO */
GPIO_InitStructure_SPI2_MISO.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure_SPI2_MISO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_SPI2_MISO.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure_SPI2_MISO.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure_SPI2_MISO.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure_SPI2_MISO);
/* Configure SPI MOSI */
GPIO_InitStructure_SPI2_MOSI.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure_SPI2_MOSI.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_SPI2_MOSI.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure_SPI2_MOSI.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure_SPI2_MOSI.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure_SPI2_MOSI);
/* Configure SPI SCK */
GPIO_InitStructure_SPI2_SCK.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure_SPI2_SCK.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_SPI2_SCK.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure_SPI2_SCK.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure_SPI2_SCK.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure_SPI2_SCK);
/* Configure SPI*/
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;// ((uint16_t)0x0004)
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; //SPI_CPHA_1Edge
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //SPI_BaudRatePrescaler_8 //设置波特率预分频值是8
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
//SPI2->CR2 |= (1<<2); //SSOE Slave Select is output only (NO MULTIMASTER)使能SSN
SPI_Init(SPI2,&SPI_InitStruct);
SPI_Cmd( SPI2,ENABLE);[/mw_shl_code]
SPI读写函数:
[mw_shl_code=c,true]void BSP_ReadWriteByte(uint8_t* txBuff, uint8_t* rxBuff, uint16_t length)
{
volatile uint16_t i;
//BSP_CLEAR_SS;
USE_SPIx->DR = txBuff[0];
for(i=1;i<length;i++){
while(!(USE_SPIx->SR & SPI_I2S_FLAG_TXE));
USE_SPIx->DR = txBuff;
while(!(USE_SPIx->SR & SPI_I2S_FLAG_RXNE));
rxBuff[i-1]=USE_SPIx->DR;
}
if(length == 1){
while(!(USE_SPIx->SR & SPI_I2S_FLAG_TXE));
while(!(USE_SPIx->SR & SPI_I2S_FLAG_RXNE));
while(USE_SPIx->SR & SPI_I2S_FLAG_BSY);
rxBuff[length-1]=USE_SPIx->DR;
}else{
while(USE_SPIx->SR & SPI_I2S_FLAG_BSY);
rxBuff[length-1]=USE_SPIx->DR;
}
//BSP_SET_SS;
}
[/mw_shl_code]
|