- STM32F103C8のSPI
- ArduinoのSPIピン
- 必要なコンポーネント
- STM32SPIチュートリアルの回路図と接続
- STM32SPIプログラミング
- マスターSTM32SPIプログラミングの説明
- スレーブArduinoSPIプログラミングの説明
以前のチュートリアルでは、2つのArduinoボード間のSPIおよびI2C通信について学習しました。このチュートリアルでは、1つのArduinoボードをSTM32F103C8であるBlue Pillボードに置き換え、SPIバスを使用してArduinoボードと通信します。このSTM32SPIの例では、2つの16X2LCDディスプレイが別々に接続されたスレーブとしてArduinoUNOを使用し、マスターとしてSTM32F103C8を使用します。2つのポテンショメータもSTM32(PA0)およびArduino(A0)に接続されており、ポテンショメータを変化させることにより、マスターからスレーブへ、およびスレーブからマスターへの送信値(0〜255)を決定します。
STM32F103C8のSPI
ArduinoとSTM32F103C8ブルーピルボードのSPIバスを比較すると、STM32には2つのSPIバスがあり、ArduinoUnoには1つのSPIバスがあります。Arduino UnoにはATMEGA328マイクロコントローラーが搭載されており、STM32F103C8にはARM Cortex- M3が搭載されているため、Arudinoボードよりも高速です。
SPI通信の詳細については、以前の記事を参照してください。
- ArduinoでSPIを使用する方法:2つのArduinoボード間の通信
- PICマイクロコントローラPIC16F877AとのSPI通信
- ビットバンギングによるSPI通信
- SPIモジュールを使用したRaspberryPi温水タンクリークディテクタ
- DS3231モジュールを使用したESP32リアルタイムクロック
STM32SPIピンSTM32F103C8
SPI Line1 | STM32F103C8のピン |
MOSI1 | PA7またはPB5 |
MISO1 | PA6またはPB4 |
SCK1 | PA5またはPB3 |
SS1 | PA4またはPA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
ArduinoのSPIピン
SPIライン |
Arduinoでピン留め |
MOSI |
11またはICSP-4 |
味噌 |
12またはICSP-1 |
SCK |
13またはICSP-3 |
SS |
10 |
必要なコンポーネント
- STM32F103C8
- Arduino
- LCD 16x2-2
- 10kポテンショメータ– 4
- ブレッドボード
- 接続線
STM32SPIチュートリアルの回路図と接続
以下の表は、ArduinoとのSTM32SPI通信用に接続されたピンを示しています。
SPIピン |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
味噌 |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
以下の表は、STM32F103C8とArduinoを別々に使用した2つのLCD(16x2)に接続されたピンを示しています。
LCDピン |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
LCDコントラスト用のポテンショメータセンターPINへ |
LCDコントラスト用のポテンショメータセンターPINへ |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5V |
+ 5V |
K |
GND |
GND |
重要:
- ArduinoGNDとSTM32F103C8GNDを一緒に接続することを忘れないでください。
STM32SPIプログラミング
プログラミングはArduinoコードに似ています。同じ
このSTM32SPIの例では、2つの16X2LCDディスプレイが別々に接続されたスレーブとしてArduinoUNOを使用し、マスターとしてSTM32F103C8を使用します。2つのポテンショメータもSTM32(PA0)およびArduino(A0)に接続されており、ポテンショメータを変化させることにより、マスターからスレーブへ、およびスレーブからマスターへの送信値(0〜255)を決定します。
アナログ入力は、ポテンショメータを回転させることにより、STM32F10C8ピンPA0(0〜3.3V)で取得されます。次に、この入力値はアナログ-デジタル値(0〜4096)に変換され、SPI通信を介して一度に送信できるのは8ビット(バイト)データのみであるため、このデジタル値はさらに(0〜255)にマップされます。
同様に、スレーブ側では、ポテンショメータを使用して、ArduinoピンA0のアナログ入力値を(0〜5V)から取得します。また、この入力値はアナログ-デジタル値(0から1023)に変換され、このデジタル値はさらに(0から255)にマッピングされます。
このチュートリアルには、マスターSTM32用とスレーブArduino用の2つのプログラムがあります。 双方のための完全なプログラムは、デモンストレーションビデオでこのプロジェクトの終わりに与えられ ます。
マスターSTM32SPIプログラミングの説明
1.まず、 SPI通信機能を使用するためのSPIライブラリとLCD機能を使用するためのLCDライブラリを含める必要があり ます。また、16x2LCDのLCDピンを定義します。LCDとSTM32のインターフェースについて詳しくは、こちらをご覧ください。
#include
2. void setup()で
- ボーレート9600でシリアル通信を開始します。
Serial.begin(9600);
- 次にSPI通信を開始します
SPI.begin();
- 次に、SPI通信用のクロック分周器を設定します。仕切り16を設定しました。
SPI.setClockDivider(SPI_CLOCK_DIV16);
- 次に、スレーブarduinoへの転送を開始しなかったため、SSピンをHIGHに設定します。
digitalWrite(SS、HIGH);
3. void loop()内
- スレーブに値を送信する前に、スレーブ選択値をLOWにして、マスターからスレーブへの転送を開始する必要があります。
digitalWrite(SS、LOW);
- 次に、ピンPA0に接続されたマスターSTM32F10C8POTからアナログ値を読み取ります。
intポット= analogRead(PA0);
次に、この値を1バイト(0〜255)で変換します。
バイトMasterSend = map(pot、0,4096,0,255);
- ここで重要なステップは、次の文で、我々はに保存された変換後のPOT値送ってくる Mastersendの スレーブアルドゥイーノに変数を、また、スレーブのArduinoから値を受け取り、中にいることを保存 mastereceive 変数。
Mastereceive = SPI.transfer(Mastersend);
- 次に、スレーブarduinoから500マイクロ秒の遅延で受信した値を表示してから、継続的に値を受信して表示します。
Serial.println( "スレーブArduinoからマスターSTM32"); Serial.println(MasterReceive lcd.setCursor(0,0); lcd.print( "Master:STM32"); lcd.setCursor(0,1); lcd.print( "SalveVal:"); lcd.print(MasterReceive delay (500); digitalWrite(SS、HIGH);
注: Arduino IDEのシリアルモーターで結果を表示するには、serial.println()を使用します。
スレーブArduinoSPIプログラミングの説明
1.マスターと同じように、まず、 I2C通信機能を使用するためのSPIライブラリとLCD機能を使用するためのLCDライブラリを含める必要があり ます。また、16x2LCDのLCDピンを定義します。
#include
2. void setup()で
- ボーレート9600でシリアル通信を開始します。
Serial.begin(9600);
- 以下のステートメントは、MISOをOUTPUT(マスターINにデータを送信する必要がある)として設定します。したがって、データはスレーブArduinoのMISOを介して送信されます。
pinMode(MISO、OUTPUT);
- 次に、SPI制御レジスタを使用してスレーブモードでSPIをオンにします。
SPCR- = _BV(SPE);
- 次に、SPI通信の割り込みをオンにします。マスターからデータを受信すると、割り込みサービスルーチンが呼び出され、受信した値がSPDR(SPIデータレジスタ)から取得されます。
SPI.attachInterrupt();
- マスターからの値はSPDRから取得され、 Slavereceived 変数に格納されます。これは、次の割り込みルーチン機能で行われます。
ISR(SPI_STC_vect){Slavereceived = SPDR; 受信= true; }
3.次のvoidループ()
- ピンA0に接続されたスレーブArduinoPOTからアナログ値を読み取ります。
intポット= analogRead(A0);
- その値を1バイトで0から255に変換します。
Slavesend = map(pot、0,1023,0,255);
- 次の重要なステップは、変換された値をマスターSTM32F10C8に送信することです。そのため、値をSPDRレジスタに配置します。SPDRレジスタは、値を送受信するために使用されます。
SPDR = Slavesend;
- 次に、マスターSTM32F103C8から受信した値( SlaveReceive )を500マイクロ秒の遅延でLCDに表示し、それらの値を継続的に受信して表示します。
lcd.setCursor(0,0); lcd.print( "スレーブ:Arduino"); lcd.setCursor(0,1); lcd.print( "MasterVal:"); Serial.println( "マスターSTM32からスレーブArduino"); Serial.println(SlaveReceived); lcd.print(SlaveReceived); delay(500);
一の側にポテンショメータを回転させ、あなたは別の側にLCD上の様々な値を見ることができます。
つまり、これが STM32でSPI通信が行われる方法です。これで、任意のSPIセンサーをSTM32ボードとインターフェースできます。
マスターSTM32とスレーブArduinoの完全なコーディングは、デモビデオとともに以下に示されています。