/* INCLUDE参数 */
#include"spi.h"
#if hardwarespi
/************************************
* SPI初始化
************************************/
void spi_init(void)
{
DDRB|=(1<<PB4); /* SS端设置为输出 */
DDRB|=(1<<PB5); /* MOSI端口设置为输出 */
DDRB&=~(1<<PB6); /* MISO端口设置为输入 */
DDRB|=(1<<PB7); /* SCK端口设置为输出 */
SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); /* SPI ENABLE,MASTER MODE,Fsoc/16 */
PORTB|=(1<<PB4); /* SS=1 */
}
void spi_write(unsigned char data)
{
unsigned char temp;
SPDR = data;
while(!(SPSR & (1<<SPIF)));
temp = SPDR;
temp+=1;
}
unsigned char spi_read(void)
{
SPDR = 0XFF;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
/************************************
* SPI转入高速模式
************************************/
void SPIHiSPD(void)
{
SPCR|=(0<<SPR1)|(0<<SPR0); /* SPI ENABLE,MASTER MODE,Fsoc/16 */
SPSR|=(1<<SPI2X);
}
#else
void spi_init(void)
{
SOFT_SPI_CS_DDR=1;
SOFT_SPI_CLK_DDR=1;
SOFT_SPI_DI_DDR=1;
SOFT_SPI_CS=1;
SOFT_SPI_CLK=1;
SOFT_SPI_DI=1;
}
void spi_write(unsigned char data)
{
unsigned char i;
//SOFT_SPI_CS = 0;
SOFT_SPI_CLK = 0;
for ( i = 0 ; i < 8 ; i++){
SOFT_SPI_CLK = 0;
SOFT_SPI_DI = (data&0x80)>>7;;
data = data<<1;
SOFT_SPI_CLK = 1;
}
}
unsigned char spi_read(void)
{
unsigned char i;
unsigned char _byte_ = 0x00;
//SOFT_SPI_CS = 0;
SOFT_SPI_CLK = 0;
for ( i = 0; i < 8; i++)
{
_byte_ = _byte_<<1;
SOFT_SPI_CLK = 0;
_byte_ = _byte_|(SOFT_SPI_DO_PING&0x01);
SOFT_SPI_CLK = 1;
}
return(_byte_);
}
#endif
评论0