你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F373VCT6 SPI接口程序问题

[复制链接]
dzxxx2004 提问时间:2013-9-12 23:31 /
 各位大侠本人最近在调试STM32F373VCT6 芯片,需要用到SPI接口,但是调试了1天都没有任何进展,我先上程序,请大家帮忙分析一下,谢谢!
 
void SPI_Config(void)
{
       SPI_InitTypeDef  SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
 
        /* Enable GPIO clock */
       RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
       
       /* Enable the SPI peripheral */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);       
 
        /* SPI  MOSI pin configuration */
        GPIO_InitStructure.GPIO_Pin         = GPIO_PinSource9;       
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        /* SPI SCK pin configuration */
       GPIO_InitStructure.GPIO_Pin         = GPIO_PinSource7;       
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_Init(GPIOC, &GPIO_InitStructure); 
 
       /* SPI MISO pin configuration */
       GPIO_InitStructure.GPIO_Pin = GPIO_PinSource8;
       GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        /* SPI NSS pin configuration */
        GPIO_InitStructure.GPIO_Pin = GPIO_PinSource6;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        /* SPI pin mappings */
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_5);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_5);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_5);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_5);
 
        /* SPI configuration -------------------------------------------------------*/
        SPI_Cmd(SPIx, DISABLE); 
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
         SPI_InitStructure.SPI_CRCPolynomial = 7;
       
        /* Initializes the SPI communication */
         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
         SPI_Init(SPI1, &SPI_InitStructure);
  
        /* Initialize the FIFO threshold */
          SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF); 
 
        /* Enable the SPI peripheral */
          SPI_Cmd(SPI1, ENABLE);
}
 
void SPI_Bufferwrite(unsigned char *buffer,unsigned char num)
{
        unsigned char i;
       

        for(i=0;i
收藏 评论7 发布时间:2013-9-12 23:31

举报

7个回答
fengye5340 回答时间:2013-9-13 08:03:18

回复:STM32F373VCT6 SPI接口程序问题

  当然是你的SPI时钟配置出问题了:首先你的端口配置有问题,参考代码如下:

  /*!< Configure SD_SPI pins: SCK */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;  //这里是端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; //SCK上拉
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
   /*!< Configure SD_SPI pins: MISO */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /*!< Configure SD_SPI pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /*!< Configure CS_PIN pin: */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // 用通用IO来配置--不用NSS
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_5);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_5);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_5);

  SPI配置参考:
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
 
  SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
 
  SPI_Cmd(SPI1, ENABLE); /*!< SD_SPI enable */
 
dzxxx2004 回答时间:2013-9-13 16:54:16

回复:STM32F373VCT6 SPI接口程序问题

回复第 2 楼 于2013-09-13 08:03:18发表:
  当然是你的SPI时钟配置出问题了:首先你的端口配置有问题,参考代码如下:

  /*!< Configure SD_SPI pins: SCK */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;  //这里是端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP; //SCK上拉
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
   /*!< Configure SD_SPI pins: MISO */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /*!< Configure SD_SPI pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /*!< Configure CS_PIN pin: */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // 用通用IO来配置--不用NSS
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_5);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_5);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_5);

  SPI配置参考:
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
 
  SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
 
  SPI_Cmd(SPI1, ENABLE); /*!< SD_SPI enable */
 
 
非常感谢,我回头试试,有消息了告诉你!
 
dzxxx2004 回答时间:2013-9-14 15:22:24

RE:STM32F373VCT6 SPI接口程序问题

大哥,怎么还是不行呢?还是没有波形输出。帮帮忙呀。
dzc2001 回答时间:2013-9-14 16:07:08

RE:STM32F373VCT6 SPI接口程序问题

既然你用的是固件库,那么你去固件库下翻一下示例代码,SPI必定会有示例代码的,比较一下,你就可以找出你的错误了。如果连固件库的示例代码都不成,那就怀疑下硬件吧。
feiante-155820 回答时间:2013-9-16 20:13:38

RE:STM32F373VCT6 SPI接口程序问题

SPI_Bufferwrite和 SPI_Bufferread不要分开,要合成一个。因为ST的SPI是有个移位寄存器的,要读数据时,需要先写入数据,至于写什么,随便都可以,而写数据时,只是忽略了返回的读取的值。
温柔的武士刀 回答时间:2013-9-16 20:58:38

RE:STM32F373VCT6 SPI接口程序问题

推荐你看下这里:
STM32 SPI接口的简单实现


STM32的SPI接口

 

 
dzxxx2004 回答时间:2013-9-26 16:22:43

回复:STM32F373VCT6 SPI接口程序问题

回复第 7 楼 于2013-09-16 20:58:38发表:
推荐你看下这里:
STM32 SPI接口的简单实现


STM32的SPI接口

 

 现在SPI是可以工作了,但是为什么我非的要执行
       while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);        //ÅжÏÊÇ·ñÒѾ­·¢ËÍÍê³É
  
        SPI1->DR = byte;
以上程序后,再进行
      while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);
        buffer = SPI1->DR;
就不会出问题。
 
但是如果我不首先执行
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);        //ÅжÏÊÇ·ñÒѾ­·¢ËÍÍê³É  
        SPI1->DR = byte;
程序就会一直卡死在  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==RESET);这条程序。
我不知道我的表达是否清楚,能帮我解释一下吗,谢谢!
 

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版