STM32入门:软件 SPI 源码分享

软件 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;
}

学习分享,一起成长!以上为小编的学习分享,若存在不当之处,请批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混子在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值