SPI-STM32

SPI-STM32

SPI(SerialPeripherallnterface) 是由Motorola公司开发的一种通用数据总线。
四根通信线: SCK(Serial Clock)、MOSI(Master Output SlaveSS(Slave Select)input) 、MISO(Master input Slave Output)。
同步,全双工。
支持总线挂载多设备(一主多从)。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include "stm32f10x.h"                  // Device header

//把置引脚高低电平的函数都封装换个名字
//输出引脚
//从机选择 GPIO_Pin_4 cs 
void SPI_W_CS(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)BitValue);
}
//GPIO_Pin_5  clk
void SPI_W_CLK(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)BitValue);
}
//GPIO_Pin_7 MOSI
void SPI_W_MOSI(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_7,(BitAction)BitValue);
}
//输入引脚 GPIO_Pin_6  MISO
uint8_t SPI_R_MISO(void)
{
	return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
}


void SPI_Iint(void)
{
		//使能GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//GPIOA模式初始化
	//GPIO_Pin_4 cs  GPIO_Pin_5  clk  GPIO_Pin_7 MOSI
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//GPIO_Pin_6  MISO
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);	
	
	
	//对信号进行初始化
	SPI_W_CS(1);//cs默认为高电平
	SPI_W_CLK(0);//因使用spio0,则clk默认为低电平
}

//起始信号
void SPI_Start(void)
{
	SPI_W_CS(0);
}
//终止信号
void SPI_Stop(void)
{
	SPI_W_CS(1);
}

//交换一个字节  
//使用掩码实现,好处就是不改变传入参数本身
uint8_t SPI_SwapByte(uint8_t ByteSend)
{
	uint8_t i;
	uint8_t ByteReceive = 0x00;//用于接收
	
	for(i=0;i<8;i++)
	{
		SPI_W_MOSI(ByteSend & (0x80>>i));//先发送出一位
		SPI_W_CLK(1);//产生上升沿,进行采样,读出数据
		if(SPI_R_MISO() == 1)
		{
			ByteReceive |= (0x80>>i);
		}
		SPI_W_CLK(0);//产生下降沿,发送数据的第二位
	}
	return ByteReceive;
}

使用移位寄存器实现,好处就是效率高,但是改变传入参数本身
//uint8_t SPI_SwapByte(uint8_t ByteSend)
//{
//	uint8_t i;	
//	for(i=0;i<8;i++)
//	{
//		SPI_W_MOSI(ByteSend & 0x80);//先发送出一位
//		ByteSend <<= 1;
//		SPI_W_CLK(1);//产生上升沿,进行采样,读出数据
//		if(SPI_R_MISO() == 1)
//		{
//			 ByteSend |= 0x01;
//		}
//		SPI_W_CLK(0);//产生下降沿,发送数据的第二位
//	}
//	return ByteSend;
//}

#ifndef _SPI_H
#define _SPI_H

void SPI_W_CS(uint8_t BitValue);
void SPI_W_CLK(uint8_t BitValue);
void SPI_W_MOSI(uint8_t BitValue);
uint8_t SPI_R_MISO(void);

void SPI_Iint(void);
void SPI_Start(void);
void SPI_Stop(void);
uint8_t SPI_SwapByte(uint8_t ByteSend);

#endif

猜你喜欢

转载自blog.csdn.net/qq_45159887/article/details/130875890