之前使用spi2驱动读写都正常,后来改成spi1缺不能读写,感觉配置没啥问题
[mw_shl_code=c,true]void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTBê±Öóê1Äü
RCC_APB1PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI1ê±Öóê1Äü
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOB
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PB13/14/15éÏà-
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //éèÖÃSPIμ¥Ïò»òÕßË«ÏòμÄêy¾YÄ£ê½:SPIéèÖÃÎaË«ÏßË«Ïòè«Ë«1¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //éèÖÃSPI1¤×÷Ä£ê½:éèÖÃÎaÖ÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //éèÖÃSPIμÄêy¾Y′óD¡:SPI·¢Ëí½óêÕ8λ֡½á11
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //′®DDí¬2½ê±ÖóμÄ¿ÕÏD×′ì¬Îa¸ßμçÆ½
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //′®DDí¬2½ê±ÖóμÄμú¶t¸öìø±äÑØ£¨éÏéy»òϽ죩êy¾Y±»2éÑù
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSSDÅoÅóéó2¼t£¨NSS1ü½Å£©»1êÇèí¼t£¨ê1óÃSSI룩1üàí:Äú2¿NSSDÅoÅóDSSIλ¿ØÖÆ
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //¶¨òå2¨ìØÂêÔ¤·ÖÆμμÄÖμ:2¨ìØÂêÔ¤·ÖÆμÖμÎa256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //Ö¸¶¨êy¾Y′«êä′óMSBλ»1êÇLSBλ¿aê¼:êy¾Y′«êä′óMSBλ¿aê¼
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRCÖμ¼ÆËãμĶàÏîê½
SPI_Init(SPI1, &SPI_InitStructure); //¸ù¾YSPI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèSPIx¼Ä′æÆ÷
SPI_Cmd(SPI1, ENABLE); //ê1ÄüSPIíaéè
SPI1_ReadWriteByte(0xff);//Æô¶ˉ′«êä
}
//SPI Ëù¶èéèÖÃoˉêy
//SpeedSet:
//SPI_BaudRatePrescaler_2 2·ÖÆμ
//SPI_BaudRatePrescaler_8 8·ÖÆμ
//SPI_BaudRatePrescaler_16 16·ÖÆμ
//SPI_BaudRatePrescaler_256 256·ÖÆμ
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler; //éèÖÃSPI2Ëù¶è
SPI_Cmd(SPI1,ENABLE);
}
//SPIx ¶áD′ò»¸ö×Ö½ú
//TxData:òaD′èëμÄ×Ö½ú
//·μ»ØÖμ:¶áè¡μ½μÄ×Ö½ú
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //¼ì2éÖ¸¶¨μÄSPI±ê־λéèÖÃóë·ñ:·¢Ëí»o′æ¿Õ±ê־λ
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, TxData); //í¨1yíaéèSPIx·¢Ëíò»¸öêy¾Y
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) //¼ì2éÖ¸¶¨μÄSPI±ê־λéèÖÃóë·ñ:½óêü»o′æ·Ç¿Õ±ê־λ
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //·μ»Øí¨1ySPIx×î½ü½óêÕμÄêy¾Y
}
////////////////////////////////////////////////////////////////////////////////////////////
u16 SPI_FLASH_TYPE=W25Q128;//ĬèϾíêÇ25Q64
//4KbytesÎaò»¸öSector
//16¸öéèÇøÎa1¸öBlock
//W25X128
//èYá¿Îa16M×Ö½ú,12óD256¸öBlock,4096¸öSector
//3õê¼»ˉSPI FLASHμÄIO¿ú
void SPI_Flash_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTBê±Öóê1Äü
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // PB12 íÆíì
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
SPI1_Init(); //3õê¼»ˉSPI
SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//éèÖÃÎa18Mê±Öó,¸ßËùÄ£ê½
// SPI_FLASH_TYPE=SPI_Flash_ReadID();//¶áè¡FLASH ID.
} [/mw_shl_code]
|