已经有软件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
}