アナログ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