151 lines
3.9 KiB
C
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;
|
|
}
|
|
|