しばらくの間、STM32F103C8(Blue Pillボード)のSPI1が正しく機能するように努めています。ARMの学習を始めたばかりなので、データを74HC595シフトレジスタにシフトし、それをラッチして1バイトのLEDを点灯させようとしています。データを読み取っていないので、MOSI、SCK、SSのラインしかありません。
最初は何も出力されませんでしたが、オンラインの例を読んで、これらの最初の問題を修正して通信を開始することができました(GPIOAピンを正しく設定し、ソフトウェアSSを設定する必要がありました)。
現在の主な問題は、すべてのライン(MOSI、SCK、SS)にプルアップ抵抗を含めないと、マイクロコントローラーがラインに何も出力しないことです(スコープで確認)。これに加えて、プルアップ抵抗を追加した後、パルスの立ち上がり時間が非常に遅いため、あまりにも高い周波数を使用できません(10kΩのプルアップ抵抗を使用すると、約250 kHz SCKに制限され、スイッチング約330 MHzに約4 MHz)。私はブレッドボードで作業していますが、それでもAVRとより複雑な配線を使用しても、抵抗を追加せずに4 MHz SPIが問題なく動作し、波形はきれいでした。
これは、250 kHzクロックでバイト0b01110010を送信している2つの画像(スコープ画面のひどい状態の場合は申し訳ありません)です。上のトレースはSCKで、下のトレースはMOSIです。最初の画像は10kΩプルアップ抵抗で、2番目の画像は波形をより良くする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;