1. SPI とは


演習 6-1 (個人PC): SPI 通信で音声合成 LSI (ATP3011F1-PU)に文字列を送信し、任意の音声を出力をしてみましょう。プログラムの仕様は以下の通りです。

仕様 :

  1. 「音声合成LSI ATP3011 (ATP3011F1-PU)」を SPI 経由で使用する
  2. PIC 側をマスターとする
  3. SPI のモードは「MODE0」、サンプリングタイミングは「1」とする。
  4. RC7を「CS」とする
  5. RC6を「SDO」とする
  6. RC3を「SDI」とする
  7. RC4を「SCK」とする

ATP3011 のピン配置 :

ピン名称説明
1 RESET 未接続
2 Rx UART 接続用ピン
3 Tx
4 SMOD0 通信モードの設定
SMOD0=0、SMOD1=0 → SPI(MODE0)
SMOD0=0、SMOD1=1 → I2C
SMOD0=1、SMOD1=1 → UART
5 SMOD1
6 SLEEP 未接続
7 VCC 3.3V に接続
8 GND GND に接続
9 I.C 未接続
10 I.C 未接続
11 TEST 未接続
12 AOUT アンプの Audio In に接続
13 PLAY アンプの CE に接続
14 PMOD0 動作モードの設定
PMOD0=0、PMOD1=1 → セーフモード

ピン名称説明
15 PMOD1 動作モードの設定
PMOD0=0、PMOD1=1 → セーフモード
16 CS SPI 接続用ピン
17 SDI
18 SDO
19 SCK
20 VCC 3.3V に接続
21 I.C 未接続
22 GND GNDに接続
23 PC0 未接続
24 PC1 未接続
25 PC2 未接続
26 PC3 未接続
27 SDA I2C 接続用ピン

要プルアップ抵抗(5KΩ程度)
28 SCL

プロジェクト「IO_5_5」を「IO_6_1」にコピーします(プロジェクト名を右クリックして Copy を選択)。
プロジェクト IO_5_5を閉じます(プロジェクト名を右クリックして Close を選択)。
(もし開きっぱなしになっていたら) 前のプロジェクトで開いていたソースを全て閉じます。
main.c を開いて例8を有効にします。
仕様に従って main.c の内容を書き換えます。config_spi 関数でモードを「0」、サンプリングタイミングを「1」にするのを忘れないでください。 run関数の内容は以下の内容としてください。

void run(void) 
{
    RC7 = 1; // ATP3011 非アクティブ
    __delay_ms(100);
    RC7 = 0; // ATP3011 アクティブ
    __delay_ms(100);

    while(1){
        
       int c = getch();
       if( c != EOF && c != '\n'){
           
           if( c == '@'){ // '@' を押したらダミーデータ(0xFF)を送る
               c = 0xff;
               printf("dummy(%x) : ",c);
           }
           else if( c == '\r' ){
               printf("enter(%x) : ",c);
           }
           else{
               printf("%c(%x) : ",c,c);
           }
           
           // 1文字送信
           spi_putch((char)c);
           
           // 1文字受信
           int ret = spi_getch();
           printf("%c\r\n",ret);
       }
    }    
    return;
}

ATP3011を「SPI(MODE0)」モードに変更します。
回路を作成します。

以下の設定に従って回路を作成して下さい。
(*) が前の演習からの変更箇所です。

ピン配置設定・回路接続方法:

01: VDD(3.3V)
02: RA5
03: (*)RA4/PWM2 -- 圧電スピーカ ※ 配線済
04: MCLR/VPP -- PICKit の 1: NMCLR ※ プルアップ抵抗不要
05: RC5
(*)06: RC4/SCK -- ATP3011 の 19 : SCK
(*)07: RC3/SDI -- ATP3011 の 18 : SDO
(*)08: RC6/SDO -- ATP3011 の 17 : SDI
(*)09: RC7/CS  -- ATP3011 の 16 : CS
10: RB7/PWM1 -- オシロスコープ

11: RB6
12: RB5/Tx -- RN-42 の J2-7 : Rx
13: RB4/Rx -- RN-42 の J2-6 : Tx
14: RC2
15: RC1/ANC1 -- 可変抵抗の中央ピン
16: RC0 (GPIO出力) -- LED
17: RA2/INT -- タクトスイッチ
18: ICSPCLK(PGC) -- PICKit の 5: PGC
19: ICSPDAT(PGD  -- PICKit の 4: PGD
20: VSS(GND)

書き込みボタンを押し、以下の手順で正常に動作する事を確認して下さい。

(1) PIC が起動したら「@を数回入力 → # → V → エンター → @を数回入力」の順に入力し、バージョンが表示されるのを確認する

(表示例)
dummy(ff) : >
dummy(ff) : >
#(23) : >
V(56) : >
enter(d) : >
dummy(ff) : *
dummy(ff) : V
dummy(ff) : F
dummy(ff) : 1
dummy(ff) : a
dummy(ff) : >
dummy(ff) : >


(2) 「@を数回入力 → # → J(大文字) → エンター → @を数回入力」の順に入力するとチャイムが鳴るのを確認する

(表示例)
dummy(ff) : >
dummy(ff) : >
#(23) : >
J(4a) : >
enter(d) : >
dummy(ff) : *
dummy(ff) : >
dummy(ff) : >


(3) 「@を数回入力 → h → o → g → e → .(ドット) → エンター → @を数回入力」の順に入力すると「ほげ」と発声するのを確認する

(表示例)
dummy(ff) : >
dummy(ff) : >
h(68) : >
o(6f) : >
g(67) : >
e(65) : >
.(2e) : >
enter(d) : >
dummy(ff) : *
dummy(ff) : >
dummy(ff) : >


(4) 好きな音声を発生させる

※ 最後に '.'(ドット) エンター('\r')を送らないと発声しないので注意

指定場所に「main.c」を記入してください。