【学习记录】软件spi

已经有软件iic了,所以顺便把软件spi也做了
软件spi目前只支持了spi四种模式中的一种,后续用到会同步更改
以下是.h

#ifndef _M_SPI_SOFT_H
#define _M_SPI_SOFT_H
#include "M_io.h"
 
#define SPI_Soft   1    //是否启用软件
 
#define SPI_SCK    SPI1_SCK_PIN
#define SPI_MOSI   SPI1_SOUT_PIN
#define SPI_MISO   SPI1_SIN_PIN
#define SPI_CS     SPI1_PCS0_PIN

#define SPI_Mode   3   
/*备选值 0 1 2 3
0 时钟空闲为低 在第一个上升沿采样
1 时钟空闲为高 在第一个下降沿采样
2 时钟空闲为低 在第二个下降沿采样
3 时钟空闲为高 在第二个上升沿采样
*/

#define SCK_L      Gpio_Set(SPI_SCK,OFF)
#define SCK_H      Gpio_Set(SPI_SCK,ON)


#define READ_MISO	 gpio_get(SPI1_SIN_PIN)

#define 		MOSI_L	Gpio_Set(SPI_MOSI,OFF)
#define 		MOSI_H	Gpio_Set(SPI_MOSI,ON)




void SPI_Init(void) ;
uint8_t SPI_WriteByte(uint8_t TxData);



#endif

以下是.c

#include "M_spi_soft.h"

/*
* 函数名:void SPI_Init(void)
* 输入参数:
* 返回值:无
* 函数作用:初始化 SPI 的四根引脚
*/
void SPI_Init(void) 
{
	
	#if SPI_Soft==1
	
	 Init_Gpio(SPI_SCK,GPO,1);  //sck初始为高
	 Init_Gpio(SPI_MOSI,GPO,1); //数据输出为1 高
	 Init_Gpio(SPI_MISO,GPI,0);
	 Init_Gpio(SPI_CS,GPO,1);   //初始不选中设备
	#else 
	 spi_init(spi1,NOT_PCS,MASTER,500000); //SPI0
	#endif

}
/*spi读写一个字节 由返回值带回读出的值 */
uint8_t SPI_WriteByte(uint8_t TxData)        
{		
	
#if SPI_Soft
	#if SPI_Mode==0
	
	#elif SPI_Mode==1
	
	#elif SPI_Mode==2
	
	#elif SPI_Mode==3
	uint8_t reveDat = 0;
	SCK_H;
	for(int i = 0; i < 8; i++)
	{		
     SCK_L;		
		 if(TxData&0x80)
			 MOSI_H;
		 else           
			 MOSI_L;	
	   SCK_H;
		 TxData <<= 1;
		 
		 reveDat <<= 1;
		 reveDat |= READ_MISO ; 
	}
	SCK_H;
	return reveDat;
	#endif   
#else
  uint8_t rxData=0;
	rxData=SPI_Trans_Byte(spi1,TxData);
  return rxData;
#endif	
}


  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值