PASII/CandeII_1.4/Driver/spi_soft.c

132 lines
3.1 KiB
C
Raw Normal View History

/*************************************CopyRight(c)************************************************
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
** www.lvbu.wang
**************************************************************************************************
**Filename:
**Version:
**Author:
**Date:
**Description:
**
**************************************************************************************************
**Version:
**Modifier:
**Datemodified:
**Description:
**
**************************************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif
/*********************************************************************
* Include
*/
#include "spi_soft.h"
#include "gpio.h"
/*********************************************************************
* Macros
*/
/*********************************************************************
* Constants
*/
/*********************************************************************
* Typedefs
*/
/*********************************************************************
* Global Variables
*/
/*********************************************************************
* Global Functions
*/
/*********************************************************************
* External Variables
*/
/*********************************************************************
* External Functions
*/
/*********************************************************************
* Local Vriables
*/
static uint32_t csio=0;
static uint32_t wrio=0;
static uint32_t rdio=0;
static uint32_t dataio=0;
/*********************************************************************
* Local Functions
*/
void spi_soft_delay_us(uint16_t n) {
uint16_t i,j;
for(i=0; i<n; i++)
for(j=0; j<2; j++);
}
void spi_soft_init(spi_soft_t * p_spis,uint32_t cs_io,uint32_t wr_io, uint32_t rd_io, uint32_t data_io )
{
p_spis->csio = cs_io;
p_spis->wrio =wr_io;
p_spis->rdio =rd_io;
p_spis->dataio =data_io;
GPIO_Set_Output(U32BIT(p_spis->csio) | U32BIT(p_spis->dataio));
GPIO_Pin_Set(U32BIT(p_spis->csio) | U32BIT(p_spis->dataio));
if(p_spis->wrio != 0)
{
GPIO_Set_Output(U32BIT(p_spis->wrio));
GPIO_Pin_Set(U32BIT(p_spis->wrio));
}
if(p_spis->rdio != 0)
{
GPIO_Set_Output(U32BIT(p_spis->rdio) );
GPIO_Pin_Set(U32BIT(p_spis->rdio) );
}
}
void spi_soft_cs_enable(spi_soft_t * p_spis)
{
GPIO_Pin_Clear(U32BIT(p_spis->csio));
}
void spi_soft_cs_disenable(spi_soft_t * p_spis)
{
GPIO_Pin_Set(U32BIT(p_spis->csio));
}
void spi_soft_writebit(spi_soft_t * p_spis,uint8_t Data,uint8_t cnt)
{
unsigned char i;
for (i=0;i<cnt;i++)
{
GPIO_Pin_Clear(U32BIT(p_spis->wrio));
spi_soft_delay_us(5);
if((Data&0x80)==0)
{
GPIO_Pin_Clear(U32BIT(p_spis->dataio));
}
else
{
GPIO_Pin_Set(U32BIT(p_spis->dataio));
}
spi_soft_delay_us(5);
GPIO_Pin_Set(U32BIT(p_spis->wrio));
spi_soft_delay_us(5);
Data<<=1;
}
}
#ifdef __cplusplus
}
#endif