历史上的今天
返回首页

历史上的今天

今天是:2025年08月16日(星期六)

正在发生

2019年08月16日 | 16.HAL库之SPI和QSPI

2019-08-16 来源:eefocus

1.SPI协议(以RN8302为例)


SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线(SCSN,SCLK,SDI,SDO).


总结传输流程:


a.写时序


SCSN拉低,开启通讯。主机依次写入地址,命令,数据(高位在前,低位在后),CS校验。主机在SCLK下降沿将数据通过SDI写入从机。最后SCSN拉高结束通讯。


b.读时序


SCSN拉低开启通讯,主机先写入地址+命令共两个字节,随后在SCLK下降沿读取从机从SDO输出的数据(高位在前,低位在后)。最后SCSN拉高结束通讯。


驱动程序编写:头文件中需定义管脚控制命令,寄存器地址,芯片命令。c文件中依次编写读写字节,读写帧数据,读写寄存器,芯片初始化等函数。


RN8302具体驱动程序见: https://download.csdn.net/download/weixin_42480952/10772976


主机(STM32F746)只需配置SPI接口即可,具体流程为:开启时钟,GPIO管脚配置,SPI配置。


2.QSPI


QSPI是Queued SPI的简写,是Motorola公司推出的SPI接口的扩展,比SPI应用更加广泛。在SPI协议的基础上,Motorola公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即QSPI协议)。QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。共有SNCS,SCLK,BK0,BK1,BK2,BK3共6根接线,可以实现多种通信模式。


主机需进行QSPI接口的配置,QSPI协议主要通过发送命令来进行通讯,因此主机的配置包括管脚配置,QSPI初始化。


QUADSPI通过命令和FLASH通讯,命令包括:指令+地址+交替字节+空周期+数据五个阶段,并且各阶段可省略。


单线SPI模式:BK_IO0即SO,BK_IO1即SI,加上NCS和SCLK,类似于SPI模式。


双线SPI模式:BK_IO0和BK_IO1实现数据的双入双出。


四线SPI模式:BK_IO0,BK_IO1,BK_IO2,BK_IO3四根线实现数据的传输。


SDR模式:QSPI驱动IO0~IO3在SCLK的下降沿进行数据变化。


DDR模式:在该模式下,指令阶段在SCLK下降沿发送数据,而在地址,交替字节,数据阶段在SCLK上升沿和下降沿均发送数据。


双闪存模式:使用两个外部SPI四线,可将flash扩大一倍。


QSPI配置:


时钟使能,管脚定义,QSPI配置,flash初始化,QSPI读/写函数定义。


void Qspi_Config()

{

__HAL_RCC_QSPI_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOF_CLK_ENABLE();

Flash_GPIO.Pin=GPIO_PIN_2;

Flash_GPIO.Mode=GPIO_MODE_AF_PP;

Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM;

Flash_GPIO.Pull=GPIO_NOPULL;

Flash_GPIO.Alternate=GPIO_AF9_QUADSPI;

HAL_GPIO_Init(GPIOB,&Flash_GPIO);   //QSPI_CLK, PB2

Flash_GPIO.Pin=GPIO_PIN_6;

Flash_GPIO.Mode=GPIO_MODE_AF_PP;

Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM;

Flash_GPIO.Pull=GPIO_PULLUP;

Flash_GPIO.Alternate=GPIO_AF10_QUADSPI;

HAL_GPIO_Init(GPIOB,&Flash_GPIO);   //QSPI_NCS, PB6

Flash_GPIO.Pin=GPIO_PIN_8;

Flash_GPIO.Mode=GPIO_MODE_AF_PP;

Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM;

Flash_GPIO.Pull=GPIO_NOPULL;

Flash_GPIO.Alternate=GPIO_AF10_QUADSPI;

HAL_GPIO_Init(GPIOF,&Flash_GPIO);   //QSPI_IO0, PF8

Flash_GPIO.Pin=GPIO_PIN_9;

Flash_GPIO.Mode=GPIO_MODE_AF_PP;

Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM;

Flash_GPIO.Pull=GPIO_NOPULL;

Flash_GPIO.Alternate=GPIO_AF10_QUADSPI;

HAL_GPIO_Init(GPIOF,&Flash_GPIO);   //QSPI_IO1, PF9

Flash_GPIO.Pin=GPIO_PIN_7;

Flash_GPIO.Mode=GPIO_MODE_AF_PP;

Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM;

Flash_GPIO.Pull=GPIO_NOPULL;

Flash_GPIO.Alternate=GPIO_AF9_QUADSPI;

HAL_GPIO_Init(GPIOF,&Flash_GPIO);   //QSPI_IO2, PF7

Flash_GPIO.Pin=GPIO_PIN_6;

Flash_GPIO.Mode=GPIO_MODE_AF_PP;

Flash_GPIO.Speed=GPIO_SPEED_FREQ_MEDIUM;

Flash_GPIO.Pull=GPIO_NOPULL;

Flash_GPIO.Alternate=GPIO_AF9_QUADSPI;

HAL_GPIO_Init(GPIOF,&Flash_GPIO);   //QSPI_IO3, PF6

  QSPI_Flash.Instance=QUADSPI;

QSPI_Flash.Init.ClockPrescaler=2;

QSPI_Flash.Init.FifoThreshold=4;

QSPI_Flash.Init.SampleShifting=QSPI_SAMPLE_SHIFTING_HALFCYCLE;

QSPI_Flash.Init.FlashSize=25;

QSPI_Flash.Init.ChipSelectHighTime=QSPI_CS_HIGH_TIME_8_CYCLE;

QSPI_Flash.Init.ClockMode=QSPI_CLOCK_MODE_0;

HAL_QSPI_Init(&QSPI_Flash);

}

 


void QSPI_Read(uint8_t *data,uint32_t addr, uint32_t size)

{

QSPI_CommandTypeDef flash_command;

flash_command.InstructionMode=QSPI_INSTRUCTION_1_LINE;

flash_command.Instruction=0x13;

flash_command.Address=addr;

flash_command.AddressMode=QSPI_ADDRESS_1_LINE;

flash_command.AddressSize=QSPI_ADDRESS_32_BITS;

flash_command.AlternateByteMode=QSPI_ALTERNATE_BYTES_NONE;

flash_command.DataMode=QSPI_DATA_1_LINE;

flash_command.DummyCycles=0;

flash_command.NbData=size;

flash_command.DdrMode=QSPI_DDR_MODE_DISABLE;

flash_command.DdrHoldHalfCycle=QSPI_DDR_HHC_ANALOG_DELAY;

flash_command.SIOOMode=QSPI_SIOO_INST_EVERY_CMD;

HAL_QSPI_Command(&QSPI_Flash,&flash_command,HAL_QPSI_TIMEOUT_DEFAULT_VALUE);

  HAL_QSPI_Receive(&QSPI_Flash,data,1000); //读取的数据放入*data中,共size个字节

  QSPI_AutoPollingMemReady();

}

 

void QSPI_WritePage(uint8_t *pData,uint32_t WriteAddr, uint32_t Size)

{

QSPI_CommandTypeDef flash_command;

QSPI_WriteEnable();

flash_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;

  flash_command.Instruction       = 0x12;

  flash_command.AddressMode       = QSPI_ADDRESS_1_LINE;

  flash_command.AddressSize       = QSPI_ADDRESS_32_BITS;

flash_command.Address           = WriteAddr;

  flash_command.NbData            = Size;

  flash_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;

  flash_command.DataMode          = QSPI_DATA_1_LINE;

  flash_command.DummyCycles       = 0;

  flash_command.DdrMode           = QSPI_DDR_MODE_DISABLE;

  flash_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;

  flash_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

HAL_QSPI_Command(&QSPI_Flash, &flash_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE);

  HAL_QSPI_Transmit(&QSPI_Flash, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE);

QSPI_AutoPollingMemReady();

}


推荐阅读

史海拾趣

Ericsson Power Modules公司的发展小趣事

在创立初期,Ericsson Power Modules就展现出了强大的技术创新能力。公司团队通过深入研究电源技术、电路板应用和系统知识,成功开发出了一系列高性能、高效率的电源模块产品。其中,DC-DC转换器、中级和先进总线转换器、POL稳压器等产品因其卓越的性能和稳定性,在市场上赢得了广泛好评。这些技术突破和产品创新为Ericsson Power Modules的后续发展奠定了坚实的基础。

CUI Devices公司的发展小趣事

CUI Devices与富昌电子之间的合作关系可以追溯到CUI Inc的时代。多年来,双方建立了深厚的合作基础。在CUI Devices从CUI Inc剥离后,富昌电子继续支持其发展,成为其重要的合作伙伴之一。双方共同致力于推动电子元件行业的发展,为客户提供更优质的产品和服务。这种稳固的合作关系为CUI Devices在市场竞争中提供了有力的支持。

这五个故事展示了CUI Devices在电子行业中的发展历程和取得的成就。从起源与转型到应对全球健康危机的积极举措,再到在压电警报器市场的卓越表现以及电机品牌的崛起与拓展,每一个故事都见证了公司的成长和进步。同时,与富昌电子的稳固合作也为公司的未来发展奠定了坚实的基础。

Elma Electronic Inc公司的发展小趣事

Elma致力于为个人应用量身定制解决方案,通过丰富的包装电子系统实践经验,确保能够快速、经济地开发出满足客户需求的定制解决方案。这种能力得益于其内部制造能力,确保了产品的兼容性和一致性。同时,Elma还提供设计/集成服务,以及响应迅速且知识渊博的技术支持。

Echelon公司的发展小趣事

进入21世纪后,Echelon在智能楼宇领域取得了重大突破。公司凭借其先进的LonWorks技术和能源管理服务方案,成功为多个大型楼宇提供了智能化的能源管理解决方案。这些解决方案不仅提高了楼宇的能源利用效率,还降低了运行成本,赢得了客户的广泛赞誉。Echelon在智能楼宇领域的成功,进一步巩固了其在能源管理市场的领先地位。

Fabrimex AG公司的发展小趣事

Fabrimex AG成立于1947年5月19日,总部位于瑞士苏黎世。公司最初进入电子市场是通过收购国际整流器公司(美国)的总代表处,开始涉足半导体产品。随着德州仪器活动的加入,Fabrimex AG逐渐在电子市场中稳固了地位。在这个阶段,公司积极寻求市场机会,通过多元化的产品线和灵活的商业模式,为未来的发展奠定了坚实的基础。

Boyd Corporation公司的发展小趣事

在电子行业快速发展的背景下,Boyd Corporation始终保持着对技术的追求和对市场的敏锐洞察。公司不断深耕细作,优化现有产品,同时积极研发新产品,以满足市场的不断变化和客户的不同需求。通过持续创新,Boyd Corporation在电子行业中始终保持着领先地位,为客户提供了更优质的产品和服务。

这五个故事展示了Boyd Corporation在电子行业中的发展历程和取得的成就。作为一家技术领先、市场领先的企业,Boyd Corporation将继续秉承创新、质量、服务的理念,为电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

长期供应综合测试仪8960(E5515B/E5515C)/CMU200/CMD55

一、 综合测试仪 R&S CMU200(可测GSM900/1800);Agilent8960 E5515B(可测GSM900/1800/1900/GPRS);Agilnet8960 E5515C(OPT:002、003,可测GSM、CDMA);R&S CMD55(可测900/1800);R&S CMD60(DECT测试仪);MT8801B(PHS测试仪); ...…

查看全部问答>

ARM入门

一 首先说说ARM的发展       可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位。       广义的嵌入式无非几种:传统的什么51、AVR、PIC称做嵌入式微控制器;ARM是嵌入式微 ...…

查看全部问答>

睡眠耳机

很多人有睡前听轻音乐的习惯,据说这样不仅有助于很快入睡,而且还可以治疗打鼾。如果是戴普通的耳机你只能是平躺着,而且如果中间睡着了,耳机可能会被压在身下,而这款由一位家庭医生发明的睡眠耳机SleepPhones,被制作成了头带,戴着它你可以采 ...…

查看全部问答>

有没有人知道怎么在Source Insigth加入Keil的编译器,连接器等

有没有人知道怎么在Source Insigth加入Keil的编译器,连接器 把整个工程建立目标生成HEX文件。…

查看全部问答>

LCD分屏显示(高手指点)

比如:我要在LCD上显示4个画面,每一个画面占LCD得1/4。就像我们坐公交可以经常看到,显示多个监测画面。 不知道怎么贴图,画一个: |…

查看全部问答>

STR912有人成功扩充外部存储器(16bitSRAM)吗?

通过16位数据/地址复用方式,有人成功给STR912扩充外部存储器(16bit SRAM)吗?中间加了一只16位地址锁存器来扩充外部存储器SRAM,有无问题?最高速度怎样(是否只有96/2/2=24MHz)?稳定性怎样?  …

查看全部问答>

自制 51 avr pic 开发板

有想要啥资料的可以+qq 15508561422   目前在用彩屏,个小游戏,很久远的摩托罗拉手机中的 足球游戏 大家可以一起交流     功能板1 1:4*4矩阵键盘,键盘的应用不言而喻,任何一个实验或者项目中我们都可以看见按键的身影。 ...…

查看全部问答>

EKK-LM4F232例程一 PWM外设

 PWM相关函数原型   void ROM_PWMDeadBandDisable (unsigned long ulBase, unsigned long ulGen) 禁止PWM死区输出 void ROM_PWMDeadBandEnable (unsigned long ulBase, unsigned long ulGen, unsigned short usRise, unsigned short ...…

查看全部问答>

MSP430 的视频处理问题

大家好 在下新人一枚 请问MSP430 是否可以连接摄像头以及处理视频呢?     最近收到导师给的任务 大体是使用两个   TI 的 TrxEB 开发板 (搭载MSP430 5438a的MCU)     实现无线的视频传输&n ...…

查看全部问答>