STM32模拟SPI的程序

这篇具有很好参考价值的文章主要介绍了STM32模拟SPI的程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近完成的一个项目因为SPI管脚被别的资源占用了,只能通过模拟SPI对存储器进行操作。最后测试发现模拟SPI的速度也很快,和硬件SPI相比感觉不到太大的差异。现将模拟SPI的程序分享如下:

管脚定义,大家可以根据需要自行修改,任何一个GPIO都可以模拟SPI

#define  SPI_WP_PIN          GPIO_Pin_6
#define  SPI_WP_PORT         GPIOC

#define  SPI_CS_PIN          GPIO_Pin_15
#define  SPI_CS_PORT         GPIOA

#define  SPI_CLK_PIN         GPIO_Pin_3
#define  SPI_CLK_PORT        GPIOB

#define  SPI_MOSI_PIN        GPIO_Pin_12
#define  SPI_MOSI_PORT       GPIOC

#define  SPI_MISO_PIN        GPIO_Pin_4
#define  SPI_MISO_PORT       GPIOB

#define  SPI_BASE			 SPI3

#define  SPI_FLASH_CS_LOW()    GPIO_ResetBits(SPI_CS_PORT, SPI_CS_PIN)  /* Select SPI MEM1: ChipSelect pin low  */
#define  SPI_FLASH_CS_HIGH()   GPIO_SetBits(SPI_CS_PORT, SPI_CS_PIN)    /* Deselect SPI MEM1: ChipSelect pin high */

#define  SPI_FLASH_WP_LOW()    GPIO_ResetBits(SPI_WP_PORT, SPI_WP_PIN)  //PC4
#define  SPI_FLASH_WP_HIGH()   GPIO_SetBits(SPI_WP_PORT, SPI_WP_PIN)    //PC4

模拟SPI MOSI MOSI CLK

//模拟MOSI
void SPI_MOSI(unsigned char Status)
{
	if(Status)
		GPIO_WriteBit(SPI_MOSI_PORT,SPI_MOSI_PIN,Bit_SET);
	else
		GPIO_WriteBit(SPI_MOSI_PORT,SPI_MOSI_PIN,Bit_RESET);
}
//模拟CLK
void SPI_CLK(unsigned char Status)
{
	if(Status)
		GPIO_WriteBit(SPI_CLK_PORT,SPI_CLK_PIN,Bit_SET);
	else
		GPIO_WriteBit(SPI_CLK_PORT,SPI_CLK_PIN,Bit_RESET);
}
//模拟MISO
unsigned char SPI_MISO(void)
{
	if(GPIO_ReadInputDataBit(SPI_MISO_PORT,SPI_MISO_PIN))
		return 1;
	else 
		return 0;
}

SPI初始化

void gd25qxxInit(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN; //PA5:SCK,PA7:MOSI
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStructure);
	SPI_MOSI(1);
	
	GPIO_InitStructure.GPIO_Pin = SPI_CLK_PIN; //PA5:SCK,PA7:MOSI
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_Init(SPI_CLK_PORT, &GPIO_InitStructure);
	SPI_CLK(1);

	GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(SPI_MISO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN;                             
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(SPI_CS_PORT, &GPIO_InitStructure);
	SPI_FLASH_CS_HIGH();

	GPIO_InitStructure.GPIO_Pin = SPI_WP_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(SPI_WP_PORT, &GPIO_InitStructure);
	SPI_FLASH_WP_HIGH();
}

SPI数据输入输出

uint8_t gd25qxxSendByte(uint8_t byte)
{
	unsigned char i,Result = 0;;
	for(i=0;i<8;i++)
	{
		if(byte & 0x80)	SPI_MOSI(1);
		else SPI_MOSI(0);
		byte <<= 1;
		
		SPI_CLK(0);
		SPI_CLK(1);
		
		Result <<= 1;
		if(SPI_MISO()) Result |= 0x01;
	}
	SPI_CLK(0);
	return(Result);
}

示例:文章来源地址https://www.toymoban.com/news/detail-517101.html

uint32_t gd25qxxReadID(void)
{
  uint32_t Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();

  /* Send "RDID " instruction */
  gd25qxxSendByte(0x9F);

  /* Read a byte from the FLASH */
  Temp0 = gd25qxxSendByte(DUMMY_BYTE);

  /* Read a byte from the FLASH */
  Temp1 = gd25qxxSendByte(DUMMY_BYTE);

  /* Read a byte from the FLASH */
  Temp2 = gd25qxxSendByte(DUMMY_BYTE);

  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2;

  return Temp;
}

到了这里,关于STM32模拟SPI的程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机初学4-IIC通信(软件模拟)

    IIC ( Inter-Integrated Circuit )又称I2C(习惯读“I方C”),是 IIC Bus简称,中文名为 集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。适用于IC间的短距离数据传输。 最初的IIC通信速

    2024年02月05日
    浏览(76)
  • STM32 软件模拟SPI

    STM32库:标准函数库 测试环境:STM32F103系列 SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在1980前后提出的一种全双工同步串行通信接口,它用于MCU与各种外围设备以串行方式进行通信以交换信息,通信速度最高可达25MHz以上。 SPI接口主要应用在EEPROM、

    2024年02月09日
    浏览(66)
  • 【单片机】STM32单片机频率计程序,外部脉冲计数程序,基于脉冲计数的频率计程序,STM32F103

    两种方法用于在单片机中实现频率计的功能。 第一种方法是通过定时器来衡量信号的周期,然后将周期转换为频率。在这种方法中,你可以使用单片机的定时器模块来测量输入信号的周期,定时器会产生一个计数值,你可以根据这个计数值来推算出输入信号的周期,并通过简

    2024年02月11日
    浏览(52)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(58)
  • 【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

    我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地),即可实现掉电后依旧走时的能力。 主要特性(来源于STM32中文参考手册V10.pdf): 记得加标准库文件: 串口接收:

    2024年02月11日
    浏览(56)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月11日
    浏览(53)
  • CH340进行STM32单片机程序烧录

    目录 代码: 接法: 结束: 刚写完32点灯程序,接下来打算用CH340进行烧录 一个main.c实现点灯,即PA2出低电位 放个仿真图  接下来就是烧录了 用的是CH340进行烧录 CH340usb转ttl CH340 STM32 TXD RXD RXD TXD 3V3 3V3 GND GND 注意这里TXD和RXD是反接的 然后打开flymcu进行配置 port看设备管理器选

    2024年02月05日
    浏览(50)
  • PCAP01介绍和STM32模拟SPI驱动

    Pcap01是德国acam公司设计的一款革命性的电容测量芯片。该芯片 内部有DSP计算单元,可以直接将电容元件接到Pcap01芯片,然后芯片计算出容值大小,通过SPI总线将电容容值数据传送给CPU,电容测量完全数字化。 PCAP测量的原理是基于电容的充放电时间比。 PCAP01有8个通道,每一

    2024年02月12日
    浏览(59)
  • stm32 GPIO模拟SPI接口实现双机通信

    一、SPI协议简介     一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(主机输入从机输出)、MOSI(主机输出,针对主机来说)、SCLK(时钟,主机产生)、CS(片选,一般由主机发送或者直接使能,通常为低电平有效) ●

    2023年04月08日
    浏览(49)
  • 【GD32】从0开始学GD32单片机(9)—— SPI外设详解+主机从机发送和接收例程

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种 高速的,全双工,同步的 通信总线。 SPI总共需要4根线来实现通信, NSS:片选线,用于选择需要通信的从机;CLK:同步时钟线,用于提供同步时钟信号;MISO:主机读从机写线;MOSI:主机写从机读线 。 GD32F103系列的

    2023年04月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包