单片机IO口模拟SPI四种模式的程序

前言:

为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。

单片机IO口模拟SPI四种模式的程序_第1张图片


转载自------>单片机IO口模拟SPI四种模式的程序


单片机IO口模拟SPI四种模式的程序_第2张图片



#include "iom8535v.h"
#define _CPOL     1
#define _CPHA     0
#define SCK_IO    DDRA|=0X01
#define MOSI_IO   DDRA|=0X02
#define MISO_IO   DDRA&=0XFB
#define SSEL_IO   DDRA|=0X08
#define SCK_D(X)   (X?(PORTA|=0X01):(PORTA&=0XFE))
#define MOSI_D(X)  (X?(PORTA|=0X02):(PORTA&=0XFD))
#define SSEL_D(X)  (X?(PORTA|=0X08):(PORTA&=0XF7))

#define MISO_I()  (PINA&0X04)  
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(0);
		dat<<=1;
		if(MISO_I())
			dat|=0x01;
		else 
			dat&=0xfe;
		SCK_D(1);
	}
	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();
	}
}

常用的模式0,模式3实现比较:

单片机IO口模拟SPI四种模式的程序_第3张图片

你可能感兴趣的:(spi驱动)