[STM32F4] STM32CubeF4的中SPI

[复制链接]
7502|13
 楼主| st316 发表于 2015-1-4 20:57 | 显示全部楼层 |阅读模式
我用的是STM32F4CubeF4的库文件,用SPI和一个芯片通讯。

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

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

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

  26.     SPIx_MspInit(&hnucleo_Spi);
  27.     HAL_SPI_Init(&hnucleo_Spi);
  28.   }
  29. }
  1. static void SPIx_MspInit(SPI_HandleTypeDef *hspi)
  2. {
  3.   GPIO_InitTypeDef  GPIO_InitStruct;  
  4.   
  5.   /*** Configure the GPIOs ***/  
  6.   /* Enable GPIO clock */
  7.   NUCLEO_SPIx_SCK_GPIO_CLK_ENABLE();  // Enable GPIOB RCC
  8.   NUCLEO_SPIx_MISO_MOSI_GPIO_CLK_ENABLE();  // // Enable GPIOB RCC
  9.   
  10.   /* Configure SPI SCK */
  11.   GPIO_InitStruct.Pin = NUCLEO_SPIx_SCK_PIN;  // GPIOB_PIN_13
  12.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  13.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  14.   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  15.   GPIO_InitStruct.Alternate = NUCLEO_SPIx_SCK_AF;  // 5
  16.   HAL_GPIO_Init(NUCLEO_SPIx_SCK_GPIO_PORT, &GPIO_InitStruct);

  17.   /* Configure SPI MISO and MOSI */
  18.   GPIO_InitStruct.Pin = NUCLEO_SPIx_MOSI_PIN;  // GPIOB_PIN_15
  19.   GPIO_InitStruct.Alternate = NUCLEO_SPIx_MISO_MOSI_AF;  // 5
  20.   HAL_GPIO_Init(NUCLEO_SPIx_MISO_MOSI_GPIO_PORT, &GPIO_InitStruct);
  21.   
  22.   GPIO_InitStruct.Pin = NUCLEO_SPIx_MISO_PIN;  // GPIOB_PIN_14
  23.   HAL_GPIO_Init(NUCLEO_SPIx_MISO_MOSI_GPIO_PORT, &GPIO_InitStruct);

  24.   /* Configure SPI NSS */
  25.   GPIO_InitStruct.Pin = GPIO_PIN_12;
  26.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  27.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  28.   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  29.   HAL_GPIO_Init(NUCLEO_SPIx_SCK_GPIO_PORT, &GPIO_InitStruct);
  30.   HAL_GPIO_WritePin(NUCLEO_SPIx_SCK_GPIO_PORT, GPIO_PIN_12, GPIO_PIN_RESET);

  31.   /*** Configure the SPI peripheral ***/
  32.   /* Enable SPI clock */
  33.   NUCLEO_SPIx_CLK_ENABLE();
  34. }
另外,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 | 显示全部楼层
好吧,希望我这回是找到了原因。得到验证之后再贴上来。
 楼主| st316 发表于 2015-1-9 16:33 | 显示全部楼层
当时以为是由于没有在SysTick_Handler里没有将那个counter加1引起的。不过加上这条语句之后,SPI仍没能工作。
昨天使用了STM32CubeMX生成的代码,SPI可以正常工作了。这个工具还是挺好用的。
honyuan 发表于 2015-2-12 15:47 | 显示全部楼层
我也遇到了SPI的难题,跪求楼主STM32CubeMX工程文件,谢谢
 楼主| 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
这里有些例子可以参考。
langziyexin 发表于 2015-6-18 14:29 | 显示全部楼层
大哥 老弟也遇到一样的问题 求指点 我的QQ 462421430@qq.com 坐等~
可可球 发表于 2015-6-25 16:58 | 显示全部楼层
感觉SPI相对还是比较复杂的,但速率还可以
jesseHsu 发表于 2016-1-6 11:11 | 显示全部楼层
楼主能不能把你的工程文件发我看下,谢谢了!邮箱:282688680@qq.com
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也接收不到,肯请指导啊
yeyulinwse 发表于 2016-6-27 16:36 | 显示全部楼层
我是在Debug的时候第一次能读回SPI数据,第二次就都不回来了 ,全为FF,不知道为什么了
chenyu360583472 发表于 2016-6-28 16:56 | 显示全部楼层
大哥 老弟也遇到一样的问题 求指点 我的QQ 360583472@qq.com 坐等~
1053356130 发表于 2016-11-15 09:19 | 显示全部楼层
楼主怎么解决的 代码不给吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部