一个读写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