GPIO口模擬SPI四種模式


void delay()
{
 unsigned char m,n;
     for(n=0;n<5;n++);
    for(m=0;m<100;m++);
}
/************************************************
        端口方向配置  與輸出初始化
************************************************/
void SPI_Init(void)
{
	SCK_IO; 
	MOSI_IO;
	MISO_IO; 
	SSEL_IO;
	SSEL_D(1);
	MOSI_D(1);
	#if _CPOL==0
	SCK_D(0);
	#else
	SCK_D(1);
	#endif
}

/**********************************************
模式零           寫數據
***********************************************/
#if _CPOL==0&&_CPHA==0          //MODE   0  0   
void SPI_Send_Dat(unsigned char dat)
{
	unsigned char n;
	for(n=0;n<8;n++)
	{
		SCK_D(0);  //下降沿發出
		if(dat&0x80)
			MOSI_D(1);
		else 
			MOSI_D(0);
		dat<<=1;
		SCK_D(1);
	}
	SCK_D(0);
}

/*********************************************
模式零         讀數據
*********************************************/
unsigned char SPI_Receiver_Dat(void)
{
	unsigned char n ,dat,bit_t;
	
	for(n=0;n<8;n++)
	{
		SCK_D(1);//上升沿讀取
		dat<<=1;
		if(MISO_I())
			dat|=0x01;
		else 
			dat&=0xfe;
		SCK_D(0);
	}
	SCK_D(0);
	return dat;
}
#endif


/**********************************************
模式二           寫數據
***********************************************/
#if _CPOL==1&&_CPHA==0           //MODE   1  0
void SPI_Send_Dat(unsigned char dat)
{
 unsigned char n;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(0);
 }
  SCK_D(1);
}
/*********************************************
模式二          讀數據
*********************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  dat<<=1;
  if(MISO_I())dat|=0x01;
  else dat&=0xfe;
  SCK_D(0);
 }
  SCK_D(1);
  return dat;
}

#endif


/*********************************************
模式一        寫數據
*********************************************/
#if _CPOL==0&&_CPHA==1           //MODE  0  1
void SPI_Send_Dat(unsigned char dat)
{
 unsigned char n;
 SCK_D(0);
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(0);
 }
}
/*********************************************
模式一       讀數據
*********************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
   dat<<=1;
  if(MISO_I())dat|=0x01;
  else dat&=0xfe;
  SCK_D(0);
 }
  SCK_D(0);
  return dat;
}
#endif


/*********************************************
模式三        寫數據
*********************************************/
#if _CPOL==1&&_CPHA==1            //MODE  1  1
void SPI_Send_Dat(unsigned char dat)
{
	unsigned char n;
	
	SCK_D(1);
	for(n=0;n<8;n++)
	{
		SCK_D(0);
		if(dat&0x80)
			MOSI_D(1);
		else 
			MOSI_D(0);
		dat<<=1;
		SCK_D(1);
	}
}
/************************************
模式三          讀數據
************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 SCK_D(0);
 for(n=0;n<8;n++)
 { 
	SCK_D(0);
	dat<<=1;
	if(MISO_I())
		dat|=0x01;
	else 
	  dat&=0xfe;
	SCK_D(1);
 }
	SCK_D(1);
	return dat;
}
#endif

/*************************************
*************************************/
void main()
{

	SPI_Init();
	DDRB = 0XFF;
	//#if _CPOL
	//SCK_D(0);
	//#endif
	while(1)
	{
		//SSEL_D(0);
		//SPI_Send_Dat(0x01);
		//SPI_Send_Dat(0x31);
		//SSEL_D(1);
		SSEL_D(0);
		SPI_Send_Dat(0x81);
		PORTB =SPI_Receiver_Dat();
		SSEL_D(1);
		//delay();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章