PASII/CandeII_1.4/Driver/spi.c

81 lines
1.8 KiB
C
Raw Normal View History

#include "spi.h"
#include "gpio.h"
static SPI_CTRL_TYPE * SPI_MASTER_CTRL = ((SPI_CTRL_TYPE *) SPI_MASTER_BASE);
void spi_init(enum spi_interface interface)
{
PIN_CONFIG->PIN_23_SEL = PIN_SEL_SPIM_CLK; //CLK
PIN_CONFIG->PIN_22_SEL = PIN_SEL_SPIM_MISO; // DI
PIN_CONFIG->PIN_20_SEL = PIN_SEL_SPIM_CSN; // CS
PIN_CONFIG->PIN_24_SEL = PIN_SEL_SPIM_MOSI; // DO
SPI_MASTER_CTRL->MSB = 1;
SPI_MASTER_CTRL->SPEED = 0; //<2F><><EFBFBD><EFBFBD>ԽС<D4BD><D0A1><EFBFBD>ٶ<EFBFBD>Խ<EFBFBD><D4BD>
#if 1
SPI_MASTER_CTRL->CPOL = 0;
SPI_MASTER_CTRL->CPHA = 0;
#elif 0
//untested
SPI_MASTER_CTRL->CPOL = 0;
SPI_MASTER_CTRL->CPHA = 1;
#elif 0
//untested
SPI_MASTER_CTRL->CPOL = 1;
SPI_MASTER_CTRL->CPHA = 0;
#else
SPI_MASTER_CTRL->CPOL = 1;
SPI_MASTER_CTRL->CPHA = 1;
#endif
}
void spi_cs_enable(enum spi_interface interface)
{
SPI_MASTER_CTRL->PE = 1; // CS Low
}
void spi_cs_disable(enum spi_interface interface)
{
SPI_MASTER_CTRL->PE = 0; // CS High
}
/***********************************************************
spiд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint8_t *p_data ָ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t num <EFBFBD><EFBFBD><EFBFBD>ݵij<EFBFBD><EFBFBD><EFBFBD>
***********************************************************/
void spi_write(uint8_t *p_data,uint16_t num)
{
// tx data
for(;num>0;num--)
{
SPI_MASTER_CTRL->OUT = *p_data;
SPI_MASTER_CTRL->START = 1;
p_data++;
while(SPI_MASTER_CTRL->START == 1);
SPI_MASTER_CTRL->DONE = 0;
}
}
/***********************************************************
spi<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint8_t *p_data ָ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>λ<EFBFBD><EFBFBD>
uint8_t num <EFBFBD><EFBFBD><EFBFBD>ݵij<EFBFBD><EFBFBD><EFBFBD>
***********************************************************/
void spi_read(uint8_t *p_data,uint16_t num)
{
// rx data
for(;num>0;num--)
{
SPI_MASTER_CTRL->OUT = 0xFF;
SPI_MASTER_CTRL->START = 1;
while(SPI_MASTER_CTRL->START == 1);
*p_data = SPI_MASTER_CTRL->IN;
p_data++;
SPI_MASTER_CTRL->DONE = 0;
}
}