SPI通信协议_01

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

这里写图片描述

在这里插入图片描述

#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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值