GPIO模式实现SPI接口
void STM_EVAL_SPIInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable SCK, MOSI, MISO and NSS GPIO clocks */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
/* Configure the SPI_NSS, SPI_CLK, pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure the SPI_RST pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI_MISO pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************************************/
/* SPIRead */
/* FM1702SL */
/* , */
/* */
/****************************************************************/
uint8_t SPIRead(uint8_t SpiAddress)
{
uint8_t i, rdata;
SpiAddress = SpiAddress << 1;
SpiAddress = SpiAddress | 0x80;
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //SPI_SCK=0;
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //NSS=0;
for(i=0; i<8; i++){
if(SpiAddress&0x80)
GPIO_SetBits(GPIOA, GPIO_Pin_7); //SPI_MOSI=1;
else
GPIO_ResetBits(GPIOA, GPIO_Pin_7); //SPI_MOSI=0;
GPIO_SetBits(GPIOA, GPIO_Pin_5); //SPI_CLK=1;
SpiAddress = SpiAddress << 1;
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //SPI_CLK=0;
}//Send SpiAddress;
rdata=0;
for(i=0; i<8; i++){
GPIO_SetBits(GPIOA, GPIO_Pin_5); //SPI_CLK=1;
rdata = rdata << 1;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)){
rdata=rdata|0x01;
}
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //SPI_CLK=0;
}//Receive data
GPIO_SetBits(GPIOA, GPIO_Pin_4); //NSS=1;
return (rdata);
}
/****************************************************************/
/* SPIWrite */
/* FM1702SL */
/* , */
/* N/A */
/****************************************************************/
void SPIWrite(uint8_t SpiAddress, uint8_t SpiData)
{
uint8_t i;
SpiAddress = SpiAddress << 1;
SpiAddress = SpiAddress & 0x7e;
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //SPI_SCK=0;
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //NSS=0;
for(i=0; i<8; i++) {
if((SpiAddress&0x80)==0x80)
GPIO_SetBits(GPIOA, GPIO_Pin_7); //SPI_MOSI=1;
else
GPIO_ResetBits(GPIOA, GPIO_Pin_7); //SPI_MOSI=0;
GPIO_SetBits(GPIOA, GPIO_Pin_5); //SPI_SCK=1;
SpiAddress = SpiAddress << 1;
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //SPI_SCK=0;
}//Send SpiAddress
for(i=0;i<8;i++){
if ((SpiData&0x80)==0x80)
GPIO_SetBits(GPIOA, GPIO_Pin_7); //SPI_MOSI=1;
else
GPIO_ResetBits(GPIOA, GPIO_Pin_7); //SPI_MOSI=0;
GPIO_SetBits(GPIOA, GPIO_Pin_5); //SPI_SCK=1;
SpiData = SpiData << 1;
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //SPI_SCK=0;
}//Send data;
GPIO_SetBits(GPIOA, GPIO_Pin_4); //NSS=1;
}