GPIO口模拟SPI四种模式

  • Post author:
  • Post category:其他

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();
	}
}

 


版权声明:本文为jdsnpgxj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。