项目场景:
最近打算用STM32的最小系统版进行SPI通信实验,想首先验证SPI工作是否正常及观察收发数据是否正确,便进行STM32F103上SPI1和SPI2自通信。
问题描述
利用单步调试观察SPI1和SPI2寄存器的值,发现SPI1中各个寄存器的值符合预先设定,SPI2中寄存器的值都为零。
(0x40013000是SPI1的存储器映像地址,0x40003800是SPI2的存储器映像地址)
原因分析:
首先检查了SPI1和SPI2时钟及所在管脚的时钟是否开启,代码如下:
/* 打开GPIOA、GPIOB时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);
/* 打开SPI2时钟 */
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,ENABLE ); //低速APB(APB1)
/* 打开SPI1时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1,ENABLE ); //高速APB(APB2)
之后再网上看到了这篇文章:https://bbs.21ic.com/icview-2577580-1-2.html,怀疑STM32F103C6T6是否有SPI2模块,查阅芯片手册:
发现C6T6版本属于小容量产品,没有SPI2模块,之前一直看的是下面这张表格:
真是粗心,没有注意到C6T6属于小容量产品,之前一直把C6T6当做C8T6用,而C8T6产品是有两个SPI模块的。
解决方案:
后来把C6T6更换为C8T6,在寄存器窗口中可以观察到SPI2成功配置完成:
记录一下调试过程中的bug,希望能帮助更多遇到同样问题的人