打印
[STM32F4]

STM32CubeF4的中SPI

[复制链接]
6965|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
st316|  楼主 | 2015-1-4 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是STM32F4CubeF4的库文件,用SPI和一个芯片通讯。

通过SPI读回来的数据全是0x00,然后用Jlink仿真,发现待发送的数据根本就没有写到SPI_DR寄存器里去,SPI_DR寄存器里始终是0x00。

大家用过这个库文件里的SPI吗,能否给个例程?

初始化SPI的代码如下:
void SPIx_Init(void)
{
  if(HAL_SPI_GetState(&hnucleo_Spi) == HAL_SPI_STATE_RESET)
  {
    /* SPI Config */
    hnucleo_Spi.Instance = NUCLEO_SPIx;   // SPI2
      /* SPI baudrate is set to 12,5 MHz maximum (PCLK2/SPI_BaudRatePrescaler = 100/8 = 12,5 MHz)
       to verify these constraints:
          - ST7735 LCD SPI interface max baudrate is 15MHz for write and 6.66MHz for read
            Since the provided driver doesn't use read capability from LCD, only constraint
            on write baudrate is considered.
          - SD card SPI interface max baudrate is 25MHz for write/read
          - PCLK2 max frequency is 100 MHz
       */
    hnucleo_Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
    hnucleo_Spi.Init.Direction = SPI_DIRECTION_2LINES;
    hnucleo_Spi.Init.CLKPhase = SPI_PHASE_1EDGE;
    hnucleo_Spi.Init.CLKPolarity = SPI_POLARITY_LOW;
    hnucleo_Spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
    hnucleo_Spi.Init.CRCPolynomial = 7;
    hnucleo_Spi.Init.DataSize = SPI_DATASIZE_8BIT;
    hnucleo_Spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hnucleo_Spi.Init.NSS = SPI_NSS_SOFT;
    hnucleo_Spi.Init.TIMode = SPI_TIMODE_DISABLED;
    hnucleo_Spi.Init.Mode = SPI_MODE_MASTER;

    SPIx_MspInit(&hnucleo_Spi);
    HAL_SPI_Init(&hnucleo_Spi);
  }
}
static void SPIx_MspInit(SPI_HandleTypeDef *hspi)
{
  GPIO_InitTypeDef  GPIO_InitStruct;  
  
  /*** Configure the GPIOs ***/  
  /* Enable GPIO clock */
  NUCLEO_SPIx_SCK_GPIO_CLK_ENABLE();  // Enable GPIOB RCC
  NUCLEO_SPIx_MISO_MOSI_GPIO_CLK_ENABLE();  // // Enable GPIOB RCC
  
  /* Configure SPI SCK */
  GPIO_InitStruct.Pin = NUCLEO_SPIx_SCK_PIN;  // GPIOB_PIN_13
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull  = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStruct.Alternate = NUCLEO_SPIx_SCK_AF;  // 5
  HAL_GPIO_Init(NUCLEO_SPIx_SCK_GPIO_PORT, &GPIO_InitStruct);

  /* Configure SPI MISO and MOSI */
  GPIO_InitStruct.Pin = NUCLEO_SPIx_MOSI_PIN;  // GPIOB_PIN_15
  GPIO_InitStruct.Alternate = NUCLEO_SPIx_MISO_MOSI_AF;  // 5
  HAL_GPIO_Init(NUCLEO_SPIx_MISO_MOSI_GPIO_PORT, &GPIO_InitStruct);
  
  GPIO_InitStruct.Pin = NUCLEO_SPIx_MISO_PIN;  // GPIOB_PIN_14
  HAL_GPIO_Init(NUCLEO_SPIx_MISO_MOSI_GPIO_PORT, &GPIO_InitStruct);

  /* Configure SPI NSS */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull  = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  HAL_GPIO_Init(NUCLEO_SPIx_SCK_GPIO_PORT, &GPIO_InitStruct);
  HAL_GPIO_WritePin(NUCLEO_SPIx_SCK_GPIO_PORT, GPIO_PIN_12, GPIO_PIN_RESET);

  /*** Configure the SPI peripheral ***/
  /* Enable SPI clock */
  NUCLEO_SPIx_CLK_ENABLE();
}
另外,SPI2的时钟已经在库文件里的HAL层使能了。
请各位帮忙看看,多谢了!
沙发
Ketose| | 2015-1-5 12:25 | 只看该作者
没有看到你的发送代码

使用特权

评论回复
板凳
st316|  楼主 | 2015-1-5 16:32 | 只看该作者
Ketose 发表于 2015-1-5 12:25
没有看到你的发送代码

发送就是直接调用库里提供的API了:
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)

1、调试时进入此函数,观察SPI_DR寄存器,此寄存器始终为0,待发送的数据一直没出现在这寄存器里。

2、将MISO和MOSI管脚短接,期望能收到发出去的数据。结果收到的数据也始终为0.

:L

使用特权

评论回复
地板
st316|  楼主 | 2015-1-5 17:34 | 只看该作者
好吧,希望我这回是找到了原因。得到验证之后再贴上来。

使用特权

评论回复
5
st316|  楼主 | 2015-1-9 16:33 | 只看该作者
当时以为是由于没有在SysTick_Handler里没有将那个counter加1引起的。不过加上这条语句之后,SPI仍没能工作。
昨天使用了STM32CubeMX生成的代码,SPI可以正常工作了。这个工具还是挺好用的。

使用特权

评论回复
6
honyuan| | 2015-2-12 15:47 | 只看该作者
我也遇到了SPI的难题,跪求楼主STM32CubeMX工程文件,谢谢

使用特权

评论回复
7
st316|  楼主 | 2015-2-12 18:13 | 只看该作者
honyuan 发表于 2015-2-12 15:47
我也遇到了SPI的难题,跪求楼主STM32CubeMX工程文件,谢谢

\STM32Cube_FW_F4_V1.3.0\Projects\STM32F4-Discovery\Examples\SPI
这里有些例子可以参考。

使用特权

评论回复
8
langziyexin| | 2015-6-18 14:29 | 只看该作者
大哥 老弟也遇到一样的问题 求指点 我的QQ 462421430@qq.com 坐等~

使用特权

评论回复
9
可可球| | 2015-6-25 16:58 | 只看该作者
感觉SPI相对还是比较复杂的,但速率还可以

使用特权

评论回复
10
jesseHsu| | 2016-1-6 11:11 | 只看该作者
楼主能不能把你的工程文件发我看下,谢谢了!邮箱:282688680@qq.com

使用特权

评论回复
11
libingqing| | 2016-1-21 10:52 | 只看该作者
st316 发表于 2015-2-12 18:13
\STM32Cube_FW_F4_V1.3.0\Projects\STM32F4-Discovery\Examples\SPI
这里有些例子可以参考。

为什么我用Receive函数接收的时候总是接收不到数据呢,用TranslateReceive也接收不到,肯请指导啊

使用特权

评论回复
12
yeyulinwse| | 2016-6-27 16:36 | 只看该作者
我是在Debug的时候第一次能读回SPI数据,第二次就都不回来了 ,全为FF,不知道为什么了

使用特权

评论回复
13
chenyu360583472| | 2016-6-28 16:56 | 只看该作者
大哥 老弟也遇到一样的问题 求指点 我的QQ 360583472@qq.com 坐等~

使用特权

评论回复
14
1053356130| | 2016-11-15 09:19 | 只看该作者
楼主怎么解决的 代码不给吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝