/*
编辑框架:
基础层===》隔离层===》驱动层===》应用层
基础层:包含管脚初始化,配置管脚输入输出脚的基础函数到隔离层
例如:void FM25_IOInit(void);
void FM25_CS(u8 IO);
void FM25_CLK(u8 IO);
void FM25_MOSI(u8 IO);
u8 FM25_MISO(void);
隔离层:操作隔离
例如:
//隔离初始化
SPI_Type FM25_SPI = {
.CS = FM25_CS,
.CLK = FM25_CLK,
.MOSI = FM25_MOSI,
.MISO = FM25_MISO};
最好再添加一个函数包裹着 u8 Soft_SPI_RW(SPI_Type *BaseSPI, u8 dat)函数,减少FM25_SPI 耦合
eg:
u8 SPI_Send_Byte( u8 WRDat )
{
return Soft_SPI_RW( FM25_SPI, WRDat ); //软件模拟读写一字节
}
驱动层:就是芯片的时序读写
应用层: 驱动层提供芯片封装好的应用函数给永辉
*/
typedef struct _SPI
{
//SPI管脚
void (*CS)(u8) ; //片选脚输出
void (*CLK)(u8) ; //时钟脚输出
void (*MOSI)(u8) ; //输出
u8(*MISO)(void) ; //输入
} SPI_Type;
/**
* @Name soft_SPI_Write
* @brief 模拟SPI读写一字节
* @param BaseSPI: [输入]
** dat: [输入]
* @retval
* @author https://blog.csdn.net/Wekic
* @Data 2020-03-29
**/
u8 Soft_SPI_RW(SPI_Type BaseSPI, u8 dat)
{
u8 i = 0;
u8 temp = 0;
for(i = 0; i < 8; i++) {
if(BaseSPI.CLK) {BaseSPI.CLK(0);} //上升沿移送数据
if((dat << i) & 0x80) { //数据输出
if(BaseSPI.MOSI) {BaseSPI.MOSI(1);}
} else {
if(BaseSPI.MOSI) {BaseSPI.MOSI(0);}
}
if(BaseSPI.CLK) {BaseSPI.CLK(1);} //移送数据
temp<<=1;
if(BaseSPI.MISO && BaseSPI.MISO()) //数据输入
{
temp |=1;
}
}
return (temp); //返回数据
}
----------------------------------------------------------------------------------------------------------------------------
2020-03-30:增加软件模拟SPI应用文件----FM25CL64芯片操作
FM25CL64.h
/**
************************************* Copyright ******************************
* (C) Copyright 2020,Wenkic,China, GCU.
* All Rights Reserved
*
* By(Wenkic)
* https://blog.csdn.net/Wekic
*
* FileName : FM25CL64.h
* Version : v1.0
* Author : Wenkic
* Date : 2020-03-30
* Description:
* Function List: