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

STM32F030使用库函数配置SPI寄存器出错

[复制链接]
zds88512 提问时间:2020-9-16 17:23 /
我使用STM32F030C8T6作SPI从机,SPI初始化如下:
void OLED_SPI_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
        
  /* Enable the SPI periph */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

  /* Enable SCK, MOSI, MISO and NSS GPIO clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
        

  /* SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* SPI  MISO pin configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* SPI MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* SPI configuration -------------------------------------------------------*/
  SPI_I2S_DeInit(SPI1);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;   //16位
  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_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //最高位开始移位
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
        
  /* Configure the SPI interrupt priority */
  NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  RxIndex = 0;
        TxIndex = 0;
}

void SPI_Config(void)
{
        SPI_InitTypeDef  SPI_InitStructure;
        
        /* Initializes the SPI communication */
        SPI_I2S_DeInit(SPI1);
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
        SPI_Init(SPI1, &SPI_InitStructure);
        
        /* Initialize the FIFO threshold */
        SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_HF);  //16位
        
        /* Enable the Rx buffer not empty interrupt */
        SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
        
        /* Enable the SPI peripheral */
        SPI_Cmd(SPI1, ENABLE);
}

可是在调试界面查看寄存器时却发现:
(1)本来要配置数据长度为16位的,也就是这句 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;寄存器显示的却是8位;

(2)本来要配置从最高位开始移位的,也就是这句SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;寄存器显示的却是从最低位(LSB)开始移位;

配置函数都是从ST官方例程中移植过来的;本人刚开始接触STM32,用的不熟,被这个问题困扰很久,希望能得到各位大神的指点!
收藏 评论3 发布时间:2020-9-16 17:23

举报

3个回答
小歆-2051663 回答时间:2020-9-17 16:29:38
建议使用HAL库,底层配置方便很多。
zds88512 回答时间:2020-9-18 18:50:42
小歆-2051663 发表于 2020-9-17 16:29
建议使用HAL库,底层配置方便很多。

感谢回复,我现在不是怀疑库函数是否有问题,而是网上提供的配置都是使用库函数配置的,所以这样配置应该没问题。不知是否哪里没有配置对才会导致这种情况出现,网上说时钟没打开会出现这种情况,但是我的时钟已经打开了啊。
butterflyspring 回答时间:2020-9-28 17:25:23
那就最直接的办法,对照参考手册的寄存器,单步调试,看看哪一步把结果赋值错误了或者哪一步把之前的结果改掉了。注意看寄存器或对应内存的数值,而不是寄存器的显示名称(因为这个和你编译器的有关) 一般说来,很多人用这个库和芯片,不应该会发生这样的问题了。

所属标签

相似问题

官网相关资源

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