アナログSPIクラス書き方--ホスト側
3226 ワード
読み書き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
この関数は読み書き機能を兼ね備えている
ヘッダファイル
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