软件 SPI 源码分享
项目需求,只需要软件 SPI 的写入功能,后面有时间了再把读取功能补上。
spi.h
//spi.h
#ifndef __SPI_H
#define __SPI_H
#include "sys.h"
#include "delay.h"
#define SPI_LE PCout(4) //SPI 片选引脚
#define SPI_DATA PCout(5) //SPI 数据输出
#define SPI_CLK PBout(0) //SPI 时钟信号
void SPI_Init(u8 edgeTriggered, u8 effectiveLevel, u8 nus); //SPI 初始化
void SPI_Start();
void SPI_Write_Place(u8 data); //SPI 写入一位数据
void SPI_Stop(); //结束 SPI
#endif //__SPI_H
spi.c
//spi.c
#include "spi.h"
GPIO_InitTypeDef GPIO_Initure;
u8 edgeTriggered = 1; //边沿触发,1 为上升沿,0 为下降沿
u8 effectiveLevel = 1; //有效电平,1 为高电平有效,0 为低电平有效
u8 effectiveNus = 1; //有效时间间隔,默认为 1us
void SPI_Init(u8 eTrig, u8 eLevel, u8 nus) { //边沿触发 有效电平 电平持续时间
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Initure.GPIO_Pin = GPIO_Pin_0;
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_Initure);
GPIO_Initure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOC, &GPIO_Initure);
SPI_LE = 1; //拉高 LE 片选引脚,屏蔽 CLK 时钟信号,使 SPI 无效
SPI_DATA = SPI_CLK = 0;
edgeTriggered = eTrig;
effectiveLevel = eLevel;
effectiveNus = nus;
}
void SPI_Start() {
SPI_LE = 0;
}
void SPI_Write_Place(u8 data) {
SPI_DATA_1 = data == 1 ? effectiveLevel : !effectiveLevel;
SPI_CLK_1 = !edgeTriggered;
delay_us(effectiveNus);
SPI_CLK_1 = edgeTriggered;
delay_us(effectiveNus);
}
void SPI_Stop() {
SPI_LE = 1;
}
学习分享,一起成长!以上为小编的学习分享,若存在不当之处,请批评指正!