ZNKT-ST-M/BSP/Src/spi1.c
2025-01-15 16:02:53 +08:00

151 lines
3.9 KiB
C

/*
* FILE : spi1.c
* DESCRIPTION : This file is iCore3 driver demo.
* Author : XiaomaGee@Gmail.com
* Copyright :
*
* History
* -------------------
* Rev : 0.00
* Date : 12/20/2015
*
* create.
* -------------------
*/
//-----------------Include files-------------------------//
#include "spi1.h"
#include "w5500.h"
//---------------- Function Prototype ------------------//
static int initialize_spi(void);
static int write(int number, uint8_t * buf);
static uint8_t send_data(uint8_t data);
//-----------------Variable-----------------------------//
SPI1_T spi1 = {
.initialize = initialize_spi,
.write = write,
.send_data = send_data
};
//-----------------Function-----------------------------//
/*
* Name : initialize_spi1
* Description : ---
* Author : XiaomaGee.
*
* History
* -------------------
* Rev : 0.00
* Date : 12/20/2015
*
* create.
* -------------------
*/
static int initialize_spi(void) /*spi1*/
{
GPIO_InitTypeDef GPIO_uInitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;;
GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_uInitStructure);
SPI1_CS_ON;
GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;;
GPIO_Init(GPIOA,&GPIO_uInitStructure);
GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;;
GPIO_Init(GPIOA,&GPIO_uInitStructure);
SPI_Cmd(SPI1,DISABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = 0x00;
SPI_InitStructure.SPI_CPHA = 0x00;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
return 0;
}
/*
* Name : initialize_spi1
* Description : ---
* Author : XiaomaGee.
*
* History
* -------------------
* Rev : 0.00
* Date : 12/20/2015
*
* create.
* -------------------
*/
static uint8_t send_data(uint8_t data)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == 0);
SPI_I2S_SendData(SPI1,data);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == 0);
return SPI_I2S_ReceiveData(SPI1);
}
/*
* Name : write
* Description : ---
* Author : XiaomaGee.
*
* History
* -------------------
* Rev : 0.00
* Date : 12/20/2015
*
* create.
* -------------------
*/
static int write(int number, uint8_t * buf)
{
int i;
SPI1_CS_OFF;
for (i = 0; i < number; i++){
buf[i] = send_data(buf[i]);
}
SPI1_CS_ON;
return 0;
}