使用しているチップのPIC32MX270F256Bの仕様は、
PIC32MX1XX2XX-28-36-44-PIN-DS60001168K.pdf の資料をご覧ください。
| 1 | MCLR | 28 | AVDD 「アナログ用3.3v」 |
| 2 | AN0「アナログ入力」 | 27 | AVSS 「アナログ用GND」 |
| 3 | AN1「アナログ入力」 | 26 | 「LED D1」(SCK2 SPIクロック) |
| 4 | PGED1 | 25 | RB14 「PWM出力」 |
| 5 | PGEC1 | 24 | RB13 「PWM出力」 |
| 6 | RB2「PWM出力」 | 23 | VUSB3V3「3.3v ??」 |
| 7 | RB3「PWM出力」 | 22 | D-「USB」 |
| 8 | VSS 「GND」 | 21 | D+「USB」 |
| 9 | OSC1 | 20 | VCAP |
| 10 | OSC2 | 19 | VSS「GND」 |
| 11 | RB4 「出力」「UART1 TX」 | 18 | SDA1 「I2C」または「SPI」「U1RTSの出力」 |
| 12 | T1CK「カウント入力」「UART1 RX」,RA4 | 17 | SCL1 「I2C」または「SPI」「U1CTSの入力」 |
| 13 | VDD 「3.3v」 | 16 | INT0 RB7 「入力 SW, 赤外線リモコン入力」 |
| 14 | USBID/RB5「出力」圧電SP,LED出力 | 15 | VBUS |
PIC32の
ペリフェラルピンセレクト (PPS: Peripheral Pin Select)は、特定のデジタル周辺機能(UARTやSPIなど)の入出力を、マイコンの任意のI/Oピン(RPn/RPInピン)に自由に割り当てることができる機能です。
PPS機能をサポートするピンには、ピン名に「RPn」が含まれます。(「RP」はリマップ可能な周辺機器、「n」はリマップ可能なポート番号です。)
UART (Universal Asynchronous Receiver-Transmitter)
PIC32MX270F256Bで、UART1として、11番ピンをTX、12番ピンをRX、17番ピンをCTS、18番ピンをRTS)のペリフェラルピンセレクト設定例
1. ピンとRP番号の対応(再確認)
データシートに基づき、指定された各ピンのRP(Remappable Pin)番号を特定します。
11番ピン: RB4 (RPB4 / RP4)
12番ピン: RA4 (RPA4)
17番ピン: RB8 (RPB8)
18番ピン: RB9 (RPB9)
2. PPS設定レジスタの割り当て表
各機能を指定のピンに割り当てるための設定値です。
機能 方向 ピン番号 RP名 レジスタ名 設定値
U1TX 出力 11番 RPB4 RPB4R 0x01 (U1TX)
U1RX 入力 12番 RPA4 U1RXR 0x02 (RPA4)
U1CTS 入力 17番 RPB8 U1CTSR 0x04 (RPB8)
U1RTS 出力 18番 RPB9 RPB9R 0x01 (U1RTS)
3. C言語による設定コード例
c
void init_uart1_pps(void) {
// 1. デジタルI/O設定(アナログ機能があるピンはオフにする)
ANSELBbits.ANSB4 = 0; // 11番ピン (RB4)
// RA4(12番), RB8(17番), RB9(18番) はアナログ共用なし、またはデジタルのみ
// 2. TRIS(入出力方向)の設定
TRISBbits.TRISB4 = 0; // 11番ピン (TX: 出力)
TRISAbits.TRISA4 = 1; // 12番ピン (RX: 入力)
TRISBbits.TRISB8 = 1; // 17番ピン (CTS: 入力)
TRISBbits.TRISB9 = 0; // 18番ピン (RTS: 出力)
// 3. PPSのロック解除と設定
SYSKEY = 0x0;
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;
CFGCONbits.IOLOCK = 0; // ロック解除
// 入力設定 (Input Selection)
U1RXRbits.U1RXR = 0x02; // U1RX = RPA4 (12番)
U1CTSRbits.U1CTSR = 0x04; // U1CTS = RPB8 (17番)
// 出力設定 (Output Selection)
RPB4Rbits.RPB4R = 0x01; // RPB4 = U1TX (11番)
RPB9Rbits.RPB9R = 0x01; // RPB9 = U1RTS (18番)
CFGCONbits.IOLOCK = 1; // 再ロック
SYSKEY = 0x0;
}
I2C(Inter-Integrated Circuit)機能は、UARTやSPIとは異なり、I2C機能は使用するピンがハードウェア的に固定されています。
| ユニット | SCL (クロック) | SDA (データ) |
| I2C1 | RB8 (17番ピン) | RB9 (18番ピン) |
| I2C2 | RB2 (6番ピン) | RB3 (7番ピン) |
そして、次のようにSCL/SDAピンを入力 (TRIS = 1) に設定するなどします。
TRISBbits.TRISB8 = 1; // SCL1 (RB8) を入力に設定
TRISBbits.TRISB9 = 1; // SDA1 (RB9) を入力に設定
// ※RB8, RB9にはアナログ機能がないためANSEL設定は不要
// --- 3. I2C1モジュールの設定 ---
I2C1BRG = 0x004F; // ボーレート設定 (例: PBCLK 40MHzで100kHz通信時)
I2C1CONbits.ON = 1; // I2C1を有効化
I2S(Inter-IC Sound)形式のデジタルオーディオ通信
PIC32MX270でI2Sのビットクロックは、SCK1(25番ピン:RB14)とSCK2(26番ピン:RB15)で固定されており、
それらは既に別用途で使っており、PPSで他のピンに移動させることはできません。
よって、UMEHOSHI ITAでPIC32MX270のI2Sを使うことはできません。、
SPI(Serial Peripheral Interface)
SPIは4本の信号線「SCLK, MOSI, MISO, CS」を使用した数10Mbpsの高速通信が可能な全二重同期シリアル通信規格)
PIC32MX270で、一つのSPIを
11番ピンをSDO1、12番ピンをSDI1、17番ピンをSCK1 、18番ピンをCS の指定で使えるようにする。
(SCK1 は 17番ピン (RB8) に固定されて、他はRPnで設定する)
void init_spi1_pps(void) {
// 1. デジタル/アナログ設定 (11番ピン RB4 は ANSEL設定が必要)
ANSELBbits.ANSB4 = 0; // 11番ピン (RB4) をデジタルに
// RA4(12番), RB8(17番), RB9(18番) はデジタルのみ、または他機能との共用
// 2. TRIS(入出力方向)の設定
TRISBbits.TRISB4 = 0; // 11番ピン (SDO1: 出力)
TRISAbits.TRISA4 = 1; // 12番ピン (SDI1: 入力)
TRISBbits.TRISB8 = 0; // 17番ピン (SCLK1: マスター時は出力、スレーブ時は入力)
TRISBbits.TRISB9 = 1; // 18番ピン (SS1/CS: スレーブ時は入力)
// 3. PPSのロック解除と設定
SYSKEY = 0x0;
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;
CFGCONbits.IOLOCK = 0; // ロック解除
// 入力設定 (Input Selection)
SDI1Rbits.SDI1R = 0x02; // SDI1 = RPA4 (12番)
SS1Rbits.SS1R = 0x04; // SS1 = RPB9 (18番)
// 出力設定 (Output Selection)
RPB4Rbits.RPB4R = 0x03; // RPB4 = SDO1 (11番)
// ※SCK1(17番)は固定ピンのためPPS設定レジスタはありません
CFGCONbits.IOLOCK = 1; // 再ロック
SYSKEY = 0x0;
}
補足
UART(調歩同期式シリアル通信)においても、CTSは入力端子です。
フロー制御における信号の役割を整理すると分かりやすくなります。
CTS(Clear To Send)の役割
信号の向き: 入力
役割: 「(相手から自分へ)送信していいよ」という許可を受け取るための端子です。
動作: この端子の電圧がアクティブ(通常はLレベル)になると、デバイスはデータの送信を開始します。
RTS(Request To Send)の役割
信号の向き: 出力
役割: 「(自分は今)データを受け取れる状態だよ」と相手に伝えるための端子です。
動作: 自分の受信バッファに余裕があるときにアクティブにし、相手のCTS端子へ信号を送ります。
SPI(CS)との違い
SPIのCSとUARTのCTSはどちらも「入力端子」という点では共通していますが、意味合いが少し異なります。
SPIのCS(入力): マスターから一方的に「お前が通信相手だ」と指名される信号。
UARTのCTS(入力): 相手から「送っても大丈夫だよ」という準備完了(許可)をもらう信号。