我一直在尝试使STM32F103C8(蓝色药丸板)上的SPI1 正常工作一段时间。在我刚刚开始学习ARM时,我只是在尝试将数据移至74HC595移位寄存器并对其进行锁存以点亮一个字节的LED。我没有回读任何数据,所以我只有MOSI,SCK和SS线路。
起初我什么都没有得到,但是阅读一些在线示例后,我可以解决这些第一个问题,以使通信正常进行(我需要正确设置GPIOA引脚并设置软件SS)。
现在的主要问题是,如果我在所有线路(MOSI,SCK和SS)上均未包括上拉电阻,则微控制器在任何线路上均不会输出任何内容(已通过示波器检查)。最重要的是,在添加上拉电阻之后,脉冲的上升时间非常慢,因此我不能使用太高的频率(对于10kΩ上拉电阻,我限于约250 kHz SCK,并且切换至330Ω(约4 MHz)。我正在试验板上,但是即使使用AVR和更杂乱的布线,我也可以得到一个4 MHz SPI,而无需添加任何电阻就可以正常工作,并且波形更清晰。
这是两张图片(抱歉,我的示波器屏幕处于极低状态),它们以250 kHz的时钟传输字节0b01110010。顶部轨迹为SCK,底部轨迹为MOSI。第一张图带有10kΩ上拉电阻,第二张图带有330Ω上拉电阻,这些波形使波形更好看(但不需要)。
我将不胜感激,以帮助您找出正在发生的事情。
我的代码的相关部分是:
#define SS_LOW GPIOA->BSRR |= 1 << 4 + 16;
#define SS_HIGH GPIOA->BSRR |= 1 << 4;
// SPI GPIO configuration
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRL |= 0b0011 << 4 * 4; // Set pin A4 as PP out 50mHz for SS
GPIOA->CRL |= 0b1011 << 5 * 4; // Set pin A5 AltFunc PP out 50mHz for SCK
GPIOA->CRL |= 0b1011 << 7 * 4; // Set pin A7 AltFunc PP out 50mHz for MOSI
SS_HIGH;
// SPI1 configuration
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // Enable SPI1 clock
SPI1->CR1 |= SPI_CR1_SSM; // Software SS
SPI1->CR1 |= SPI_CR1_SSI;
SPI1->CR1 |= SPI_CR1_BR_0; // Set prescaler
SPI1->CR1 |= SPI_CR1_BR_1;
SPI1->CR1 |= SPI_CR1_BR_2;
SPI1->CR1 |= SPI_CR1_MSTR; // Master mode
SPI1->CR1 |= SPI_CR1_SPE; // Enable SPI
// Transmit byte
SS_LOW;
SPI1->DR = 0b01110010;
while(!(SPI1->SR & SPI_SR_TXE));
while(SPI1->SR & SPI_SR_BSY);
SS_HIGH;
你的设置是什么?您的电线如何连接?您正在使用定制板还是面包板?
—
塔里克·威灵
我正在使用面包板。74hc595由蓝色药丸板的3.3V电源供电(准确地说,这是一个:revspace.nl/File : Bluepill.jpg)。往返移位寄存器的唯一导线是MOSI,SCK和SS。我确信接线是正确的,我已经检查了很多次(在回答您之前,请再次确认)。
—
jjpprr