stm32-SPI通信(软件方法实现)

目录

一。硬件介绍

1.1电路介绍

 1.2硬件电路图

​编辑1.3 SPI通信移位示意图

1.4 SPI时序

二。代码实现

总结:


一。硬件介绍

1.1电路介绍

•SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线

•四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)

•同步,全双工

•支持总线挂载多设备(一主多从)

•所有SPI设备的SCK、MOSI、MISO分别连在一起

•主机另外引出多条SS控制线,分别接到各从机的SS引脚

•输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

 1.2硬件电路图

1.3 SPI通信移位示意图

1.4 SPI时序

•起始条件:SS从高电平切换到低电平(片选选中)

•终止条件:SS从低电平切换到高电平

•交换一个字节(模式0)

        CPOL=0:空闲状态时,SCK为低电平

        CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

•交换一个字节(模式1)

        CPOL=0:空闲状态时,SCK为低电平

        CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

•交换一个字节(模式2)

        CPOL=1:空闲状态时,SCK为高电平

        CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

•交换一个字节(模式3)

        CPOL=1:空闲状态时,SCK为高电平

        CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

•发送指令:向SS指定的设备,发送指令(0x06)

•指定地址写

        向SS指定的设备,发送写指令(0x02),

        随后在指定地址(Address[23:0])下,写入指定数据(Data)

•指定地址读

        向SS指定的设备,发送读指令(0x03),

        随后在指定地址(Address[23:0])下,读取从机数据(Data)

二。代码实现

//写片选线
void MySPI_W_SS(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue);
}
//写时钟线
void MySPI_W_SCK(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue);
}
//发送数据线(主出从入)
void MySPI_W_MOSI(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue);
}
//接收数据线(主入从出)
uint8_t MySPI_R_MISO(void)
{
	return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
}
//初始SPI
void MySPI_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	MySPI_W_SS(1);
	MySPI_W_SCK(0);
}
//SPI开始信号
void MySPI_Start(void)
{
	MySPI_W_SS(0);
}
//SPI结束信号
void MySPI_Stop(void)
{
	MySPI_W_SS(1);
}
//交换数据(发送和结束数据都是在交换数据)
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{
	uint8_t i, ByteReceive = 0x00;
	
	for (i = 0; i < 8; i ++)
	{
		MySPI_W_MOSI(ByteSend & (0x80 >> i));
		MySPI_W_SCK(1);
		if (MySPI_R_MISO() == 1){ByteReceive |= (0x80 >> i);}
		MySPI_W_SCK(0);
	}
	
	return ByteReceive;
}

总结:

        stm32-SPI通信有软硬件方法,这是软件方法实现的。

        本文只用于学习和记录。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值