模拟SPI 类写法--主机端

一个读写spi 的类,默认时序是时钟上升沿读取,时钟平时为低,速率可调。

spi_init(spi_hardware_init*base,VOID_FPTR enable_l,VOID_FPTR enable_h,VOID_FPTR sclk_l,VOID_FPTR sclk_h,VOID_FPTR mosi_l,VOID_FPTR mosi_h,U8_FPTR get_miso,FPTR_U8 delayus,uint8_t delayuscount)

void spi_init(SPI_STR*base,
    void(*enable_l)(void),
    void(*enable_h)(void),
    void(*sclk_l)(void),
    void(*sclk_h)(void),
    void(*mosi_l)(void),
    void(*mosi_h)(void),
    uint8_t(*get_miso)(void),
    void(*delayus)(uint8_t),
    uint8_t delayuscount)

该函数用来初始化SPI_STR这个类,需要传入各种操作spi的管脚变换函数,cs管脚常做为单独接口使用,所以enable传入一般是无作用的函数指针,不是空。

spi_write_read

该函数兼具读写功能

#include "Spi.h"

void spi_init(SPI_STR*base,
	void(*enable_l)(void),
	void(*enable_h)(void),
	void(*sclk_l)(void),
	void(*sclk_h)(void),
	void(*mosi_l)(void),
	void(*mosi_h)(void),
	uint8_t(*get_miso)(void),
	void(*delayus)(uint8_t),
	uint8_t delayuscount)
{
	base->enable_l = enable_l;//spi片选引脚
	base->enable_h = enable_h;//spi片选引脚
	base->sclk_l = sclk_l;//spi时钟引脚
	base->sclk_h = sclk_h;//spi时钟引脚
	base->mosi_l = mosi_l;//
	base->mosi_h = mosi_h;//
	base->get_miso = get_miso;//得到miso管脚电平1:高,0:低电平
	base->delayus = delayus;//延时阻塞函数,us级别
	base->delayuscount = delayuscount;//延时函数的阻塞时间,高低电平各自阻塞一次
	base->flag_busy = 0;
}
uint8_t spi_write_read(SPI_STR*base,uint8_t data)
{
	int8_t index;
	uint8_t  ret_data = 0;
	if(0 == base->flag_busy){
		base->flag_busy = 1;

		base->enable_h();       
		
		// 高位在前
		for (index = 7;index>=0;index--){

			if(0x01&(data>>index))
			{
				base->mosi_h();
			}else
			{
				base->mosi_l();
			}
			// 上升沿锁定数据
			base->sclk_l();
			base->delayus(base->delayuscount);

			base->sclk_h();    
			base->delayus(base->delayuscount);
			// 高电平读取数据
			ret_data = (ret_data <<1) | (0x01&(base->get_miso()));   
			
		}	
		base->enable_l();

		base->flag_busy = 0;
	}       
	return ret_data;
}

头文件

#ifndef _mspi
#define _mspi
#include 
typedef void(*VOID_FPTR)(void);
typedef uint8_t(*U8_FPTR)(void);
typedef void(*FPTR_U8)(uint8_t);
// SPI_STR SPI_STR;
typedef struct SPI_STR
{
	VOID_FPTR enable_l;
	VOID_FPTR enable_h;
	VOID_FPTR sclk_l;
	VOID_FPTR sclk_h;
	VOID_FPTR mosi_l;
	VOID_FPTR mosi_h;
	U8_FPTR get_miso;
	FPTR_U8 delayus;
	uint8_t delayuscount;
	uint8_t flag_busy;
}SPI_STR;

// static void enable_l(void);
// static void enable_h(void);
// static void sclk_l(void);
// static void sclk_h(void);
// static void mosi_l(void);
// static void mosi_h(void);
// static uint8_t get_miso(void);

void spi_write_byte(SPI_STR *base,uint8_t  b);
uint8_t  spi_read_byte(SPI_STR *base);
void spi_write (SPI_STR *base,uint8_t * buf, uint32_t len);
void spi_read(SPI_STR *base,uint8_t * buf, uint32_t len);
uint8_t spi_write_read(SPI_STR *base,uint8_t data);
void spi_init(SPI_STR*base,
	void(*enable_l)(void),
	void(*enable_h)(void),
	void(*sclk_l)(void),
	void(*sclk_h)(void),
	void(*mosi_l)(void),
	void(*mosi_h)(void),
	uint8_t(*get_miso)(void),
	void(*delayus)(uint8_t),
	uint8_t delayuscount);
#endif

 

你可能感兴趣的:(数字接口)