STM32 spi与FPGA的通信

发布者:创意梦者最新更新时间:2018-05-04 来源: eefocus关键字:STM32  spi  FPGA  通信 手机看文章 扫描二维码
随时随地手机看文章

最近在研究SPI总线,至于协议和硬件描述就不多说了
四线包括时钟、片选、接收、发送


初始化SP
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //主模式
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                  //16bit宽度
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;     //2--18MHz; 4--9MHz;  8--4.5MHz
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                    //高位在前
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPIx, &SPI_InitStructure);
  SPI_Cmd(SPIx, ENABLE);
  
SPI不能硬件控制CS,只能软件来控,就是通过将NSS设为外部GPIO来控制。
像我所做的项目是使用STM32与FPGA通信,而FPGA的SPI工作在这种一直状态
作为主设备的STM32,CS在传输数据的时候为低,传输完毕后必须拉高,这样FPGA可以判断出SPI的传输起止状态。


FPGA的数据传输格式是16bit地址+16bit数据
对于读16bit,实现如下


uint16_t spi_read(SPI_TypeDef* SPIx,uint32_t addr)
{  
  uint16_t value;
  uint16_t spi_nss;
  uint16_t add;
  uint32_t level;


  if(SPI1 == SPIx)
    spi_nss = SPI1_PIN_NSS;
  else if(SPI2 == SPIx)
    spi_nss = SPI2_PIN_NSS;


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  GPIO_ResetBits(GPIOA, spi_nss);  
  SPI_I2S_SendData(SPIx, addr); //0xf014 >> 2


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPIx, 0x0);


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
  SPI_I2S_ReceiveData(SPIx);


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  GPIO_SetBits(GPIOA, spi_nss);
     
  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
  value = SPI_I2S_ReceiveData(SPIx);


  return value;
}
  
写函数


void spi_write(SPI_TypeDef* SPIx,uint32_t addr, uint16_t value)
{


  uint16_t spi_nss;


  uint32_t level;


  if(SPI1 == SPIx)
    spi_nss = SPI1_PIN_NSS;
  else if(SPI2 == SPIx)
    spi_nss = SPI2_PIN_NSS;



  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  GPIO_ResetBits(GPIOA, spi_nss);  
  SPI_I2S_SendData(SPIx, addr); 


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPIx, value); 


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
  SPI_I2S_ReceiveData(SPIx);


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  GPIO_SetBits(GPIOA, spi_nss);


  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
  SPI_I2S_ReceiveData(SPIx);


}  
拿write函数举例
只所以这么设计是因为
如果是函数一开始就将NSS脚拉低,然后再去send,如下
  GPIO_ResetBits(GPIOA, spi_nss);  
  while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
  SPI_I2S_SendData(SPIx, addr); 
  
这样在CS拉低一段时间后(时间大概有16个时钟周期),才有CLK,这样延时就会降低SPI的传输效率  
之前那种方式会在CS拉底后很快就有clk时钟出来


之所以写两次再读两次而不是读一次写一次也是考虑到效率的问题


如果先写一次再读一次,看波形每个数据之间有比较大的空隙是没有clk的,就是说在传输完一个数据后再
传第二个会要等一段时间,这个对速度要求比较高的设备是不允许的


还有值得注意的是:
如果SPI是主模式,那么GPIO设置为
NSS是GPIO_Mode_Out_PP
CLK是GPIO_Mode_AF_PP
MOSI是GPIO_Mode_AF_PP
MISO是GPIO_Mode_IN_FLOATING


如果SPI是从模式,那么GPIO设置为
NSS是GPIO_Mode_Out_PP
CLK是GPIO_Mode_IN_FLOATING
MOSI是GPIO_Mode_IN_FLOATING
MISO是GPIO_Mode_AF_PP

关键字:STM32  spi  FPGA  通信 引用地址:STM32 spi与FPGA的通信

上一篇:STM32的定时器和ADC
下一篇:STM32 ADC 采样 频率的确定

推荐阅读最新更新时间:2024-03-16 16:01

无线基站中的FPGA和DSP最佳性能组合
  FPGA和DSP之间的“智能配分”可使无线系统设计师获得最佳性能组合和成本——效能。应用DSP和FPGA组合可使成本降低。对于无线基站,组合有DSP可编程逻辑的系统配分,可促使更大的产品设计和市场成功率。   更高数据率的需求正在驱使无线蜂窝系统从窄带2G GSM,IS-95系统到W-CDMA基3G和3.5G系统(支持高达10Mbps峰值数据率)变革。将来,3Gpp远期变革规范面向复杂的信号处理技术,如多输入多输出(MIMO)以及新的无线电技术(如正交频分多址OFDMA,多载波码分多址MC-CDMA)。这些技术对于实现超过吞吐量100Mbps的目标起关键作用。   另外的OFDM基宽带无线系统,如WiMAX现在传输速度超过
[嵌入式]
ARM Cortex-M7的内存:太大还是不够?
毫无疑问,ARM Cortex-M7 - 拥有强大的内存和处理能力 –以即使在几年前都难以想象的方式扩展了微控制器的功能。该处理器被定位成为物联网(IOT)的核心构建模块的事实,更是夺人眼目。 事实上,意法半导体的STM32 F7系列在9月的ARM科技论坛上荣获了最佳表现奖。这是第一款采用ARM的Cortex-M7内核的32位MCU家族,拥有320KB SRAM和1024KB闪存。爱特梅尔采用Cortex-M7内核的处理器还没有公布,预计将有384KB SRAM和2MB闪存,这种内存规格高出典型的MCU 10倍以上。 但是,Cortex-M7是否拥有“完成任务”所需的必要资源基本上还是要取决于开发者。本质上:今天的嵌入式开
[单片机]
基于STM32和CPLD可编程逻辑器件的等精度测频
传统的频率测量方法在实际应用中有较大的局限性,基于传统测频原理的频率计的测量精度将随被测信号频率的变化而变化,传统的直接测频法其测量精度将随被测信号频率的降低而降低,测周法的测量精度将随被测信号频率的升高而降低。本文中提出一种基于ARM与CPLD宽频带的数字频率计的设计,以微控器STM32作为核心控制芯片,利用CPLD可编程逻辑器件,实现闸门测量技术的等精度测频。 本设计的技术指标: 测频范围:1Hz~200MHz,分辨率为0.1Hz,测频相对误差百万分之一。 周期测量:信号测量范围与精度要求与测频功能相同。 占空比测量:准确度99%。 计数范围:0~1000000000,可手动暂停、复位。 功耗大小:5V
[单片机]
基于<font color='red'>STM32</font>和CPLD可编程逻辑器件的等精度测频
展讯通信荣获“中印榜样”荣誉称号
印度斋普尔2016年11月17日电 /美通社/ -- 近日,第五届中印论坛在印度拉贾斯坦邦首府 -- 斋普尔盛大举行,该论坛旨在促进中印友谊,促进双边贸易关系,为中印双方未来合作带来新契机,同时表彰中印投资合作领域做出杰出贡献的企业和机构。展讯作为中国领先的芯片设计企业被授予“中印榜样”荣誉称号。 展讯通信荣获“中印榜样”称号 “中印榜样”是第五届中印论坛的重要组成部分。它不仅是一种形式,更是要发挥它的引领作用,为两国政府与政府间、政府与行业间、行业与行业间、企业与企业间搭建沟通交流合作的平台,努力推动中印关系取得更好的发展,让 中印两国 和谐共处、合作发展 。 展讯通信董事长兼CEO李力游博士表示:“我们感到十分荣幸被授予
[手机便携]
展讯<font color='red'>通信</font>荣获“中印榜样”荣誉称号
基于FPGA的高速自适应滤波器的实现
现代通信信号处理发展到3G、4G时代后,每秒上百兆比特处理速度的要求对于自适应处理技术是一个极大的挑战。使用具有高度并行结构的FPGA实现自适应算法以及完成相应的调整和优化,相比于在DSP芯片上的算法实现可以达到更高的运行速度。本文分析了自适应LMS算法及其在FPGA上的实现,并进行算法结构的改进优化,利用DSP Builder在Altera DE2-70平台的FPGA芯片上实现相应自适应算法并下载到目标板上进行板级测试。 1 自适应LMS算法 自适应滤波器的特点在于滤波器参数可以自动地根据某种准则调整到相应的最优滤波情况。其基本框图如图1所示。  图中,X(n)为输入信号,y(n)为滤波信号,d(n)为期望信号,e
[嵌入式]
基于<font color='red'>FPGA</font>的高速自适应滤波器的实现
ARM、DSP、FPGA的技术特点和区别有哪些
ARM、DSP、FPGA与什么区别?各自有什么特点?这是一个很基础的问题,本文对ARM、DSP、FPGA的各自特点和技术进行了分析。 ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软 件。ARM架构是面向低预算市场设计的第一款RISC微处理器,基本是32位单片机的行业标准,它提供一系列内核、体系扩展、微处理器和系统芯片方案,四 个功能模块可供生产厂商根据不同用户的要求来配置生产。由于所有产品均采用一个通用的软件体系,所以相同的软件可在所有产品中运行。目前ARM在手持设备 市场占有90以上的份额,可以有效地缩短应用程序开发与测试
[单片机]
浙江大学两项技术被纳入国际多媒体通信标准
记者从浙江大学了解到,由该校信息科学与工程学院教授虞露领衔6年研发的两项技术,被正式纳入国际数字音视频编码技术标准,并成为其中的核心技术(Essencial patent)。这打破了多媒体通信领域里国际标准长期被国外大型企业和研发机构所垄断的格局,有助于改变中国相关产业的被动状态。据了解,目前这两项核心技术的相关专利已成功转让到国内通信企业。 在信息化时代,人们听音乐、看电视时所接受的音频、视频信号,都要经过编码压缩,以一定的形式存储、传输。这些多媒体信息的内容交换必须遵循统一的编码压缩标准。因此,相关国际标准的制订成为商家必争之地。而国际标准中的核心技术,则指国际标准涉及的产品中必须使用的专利技术,使用该技术的一般
[家用电子]
uclinux下stm32开发环境搭建
  什么是uclinux   uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。   uClinux是嵌入式Linux领域非常重要的分支,已成功应用于路由器、机顶盒、PDA等领域,与标准Linux在内存管理方面有着本质的区别。   uCLinux是一种优秀的嵌入式Linux版本,是micro-Controll
[单片机]
uclinux下<font color='red'>stm32</font>开发环境搭建
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved