野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12502|回复: 5

大神帮忙看看SPI初始化问题

[复制链接]
发表于 2017-9-6 17:59:22 | 显示全部楼层 |阅读模式
本帖最后由 lzzy.ha@qq.com 于 2017-9-6 18:00 编辑

我用STM32F407VGT6 SPI接口连接 CC1101芯片,程序卡在了send data, while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); 无限循环

  1. #define SPI1_NSS                        GPIO_Pin_4
  2. #define SPI1_SCK                        GPIO_Pin_5
  3. #define SPI1_MISO                         GPIO_Pin_6
  4. #define SPI1_MOSI                        GPIO_Pin_7
  5. #define GPIO_SPI1                        GPIOA
  6. #define RCC_GPIO_SPI1                RCC_AHB1Periph_GPIOA

  7. void SPI1_Init(void)
  8. {
  9.         GPIO_InitTypeDef GPIO_InitStruct;
  10.         SPI_InitTypeDef SPI_InitStruct;
  11. //        NVIC_InitTypeDef NVIC_InitStruct;

  12.         {// GPIO SPI
  13.                 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  14.                 GPIO_InitStruct.GPIO_Pin = SPI1_SCK | SPI1_MISO | SPI1_MOSI;
  15.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  16.                 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  17.                 GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
  18.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  19.                 GPIO_Init(GPIO_SPI1, &GPIO_InitStruct);

  20.                 // connect SPI1 pins to SPI alternate function
  21.                 GPIO_PinAFConfig(GPIO_SPI1, GPIO_PinSource5, GPIO_AF_SPI1);
  22.                 GPIO_PinAFConfig(GPIO_SPI1, GPIO_PinSource6, GPIO_AF_SPI1);
  23.                 GPIO_PinAFConfig(GPIO_SPI1, GPIO_PinSource7, GPIO_AF_SPI1);

  24.                 // CS
  25.                 GPIO_InitStruct.GPIO_Pin = SPI1_NSS;
  26.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  27.                 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  28.                 GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
  29.                 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  30.                 GPIO_Init(GPIO_SPI1, &GPIO_InitStruct);
  31.                 SPI1_Unselect();
  32.         }
  33.         {// SPI
  34.                 RCC_AHB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  35.                 SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // set to full duplex mode, seperate MOSI and MISO lines
  36.                 SPI_InitStruct.SPI_Mode = SPI_Mode_Master;     // transmit in master mode, NSS pin has to be always high
  37.                 SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide
  38.                 SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;        // clock is low when idle
  39.                 SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;      // data sampled at first edge
  40.                 SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // set the NSS management to internal and pull internal NSS high
  41.                 SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; // SPI frequency is APB2 frequency / 4
  42.                 SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first
  43.                 SPI_InitStruct.SPI_CRCPolynomial = 7;
  44.                 SPI_Init(SPI1, &SPI_InitStruct);
  45.                 SPI_Cmd(SPI1, ENABLE); // enable SPI1
  46.         }
  47. }


  48. void SPI1_Select()
  49. {
  50.         GPIO_ResetBits(GPIO_SPI1, SPI1_NSS);
  51. }

  52. void SPI1_Unselect()
  53. {
  54.         GPIO_SetBits(GPIO_SPI1, SPI1_NSS);
  55. }

  56. uint8_t spi1_send_byte(uint8_t byte)
  57. {
  58.         while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)); //卡死
  59.         SPI_I2S_SendData(SPI1, byte);
  60.         while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE));
  61.         return SPI_I2S_ReceiveData(SPI1);
  62. }
复制代码
测试代码:
  1. int main(void)
  2. {
  3.         SystemInit();
  4.         SPI1_Init();
  5.         uint8_t value;
  6.         SPI1_Select();
  7.         spi1_send_byte( CC1101_VERSION| READ_SINGLE );
  8.         value = spi1_send_byte(0xff);
  9.         SPI1_Unselect();
  10. }
复制代码


大家帮忙看看吧,谢谢!!!
回复

使用道具 举报

发表于 2017-9-7 09:06:39 | 显示全部楼层
你发送数据的时候没有设置片选引脚的电平
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-7 12:24:44 | 显示全部楼层
flyleaf 发表于 2017-9-7 09:06
你发送数据的时候没有设置片选引脚的电平

设置了啊,SPI1_Select();
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-7 17:35:42 | 显示全部楼层
大家帮帮忙啊。
或者给我发点示例连接,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-11 09:17:49 | 显示全部楼层
这么冷清啊
回复 支持 反对

使用道具 举报

发表于 2019-6-3 10:57:22 | 显示全部楼层
可以参考下您的程序吗?谢谢。
个人邮箱:leilei3507@126.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 04:52 , Processed in 0.029463 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表