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