WAVプレーヤーの製作(その6 : タッチパネル+SPI2 または SPI3)

「その5」でTFT液晶のタッチパネルが動かなかった。STBee(stm32f103)でも、STM32F4 Discovery(stm32f407)でも同じだ。

stm32f4に戻って良く調べてみました・・・・・・・

いや~~~何という失敗だ。

使っているTFT液晶はaitendoのM032C1289TP、液晶はSSD1289、タッチパネルはXPT2046(SPI)を使っているのだが、
おまけとしてSPI接続のSDカードも持っていた。

失敗というのは、タッチパネルのSPIと思っていた端子は何とSDカードのSPIだったのです。お恥ずかしい限りです。
これに気が付いてませんでした。端子にSDと書いてあるのに・・・

タッチパネルにはSPI3を接続してあったので、ここを動かすようにソフトを修正しました。
(簡単に書くとこうですが、この間、約3日間ドタバタでした。後述)

【やっと動いたタッチパネル・stm32f4】
stm32_proj_17.jpg

サンプルプログラムの動きは、どこかにタッチすると任意の直線が引かれます。その直線の先端にタッチすると、同様に任意の直線が引かれるというものです。タッチしたx,y座標がデジタル表示されます。

さて、めでたくf4での動作ができたので、ベースの開発環境と決めているSTBee+eclipseに戻りましょう。
ここではSPI1をDACに使うので、f4と同様にSPI2をタッチパネルに当てましょう。

・・・・・・・・・・・しかし、かなり周到に組んでみたのですが動きません。

【stm32f103のSPI2に繋がった端子を計測してます】 これは原因が判明してからの写真です。
stm32_proj_16.jpg

ZEROPLUS製のLogic Cubeというアナライザーで計測してます。
計測場所は、下記のD_PENIRQというタッチパネルが押されたらLOWになる端子と、D_CLK(SPI2_CLK)、D_CS(SPI"_NSS)、
D_IN(SPI2_MOSI)、D_OUT(SPI2_MISO)に繋いでいます。

stm32_proj_18.jpg
(この画像はとんすけさんの。STM32F4-Discovery Motion Player Projectの一部をお借りしました)


【SPI2が正常になったアナライザーの表示】
stm32_proj_15.jpg

NSSの立下りでトリガーをかけています。PENIRQにチャタリングがあるのか、NSSパルスがダブってます。

不具合時の場合、
PENIRQ
から信号が出ており、プログラムでも検知しているのですが、その次に動かねばならない D_CS(SPI2_NSS)がLOWになりません。即ち、SPI2が動いていなかったのです。


・・・stm32f407のSPI3で3日間、stm32f103のSPI2で3日間を使いました。以下、備忘録です。

1.SPI1を使ったサンプルプログラムは多々あるが、SPI2やSPI3を使った例が殆ど見ない(見つけられない?)

2.stm32マイコンでは、使用する機能(SPI等)やGPIOピンにクロックを与える というコードを記述しなければ
  ならないが、【これを間違って記述してもコンパイルエラーにはならず、作動しないだけ、又は誤作動】

  今回のトラブルの原因となったのが、SPI1,SI2,SPI3が接続されるbusラインとそれに使われるGPIOピンの
  busラインが異なることです。また、stm32f4、stm32f1でもかなり違います。更に、f1シリーズでも
  たとえば、stm32f103xBまではSPI3は未サポートで、stm32f103xCからサポートされています。
  stm32f407ではSPI3を使いました。f103でも同じにしようと調査して知りました。

  使おうとするマイコンの block diagram でしっかり確認しないといけないと知りました。

  【stm32f407のblock diagram(一部抜粋)】 引用元はこちら   【stm32f103xEの場合】 同左
  stm32_proj_19.jpg         stm32_proj_20.jpg

  f407もf103もSPI1とSPI2,SPI3の接続busが異なる。(APB1とAPB2)
  f103でGPIOピンはSPI1と同じbus接続なのだが(APB1)、f407のGPIOピンは専用bus(AHB1)

  SPI2、SPI3環境を作るためのコード抜粋です。

  【stm32f407の場合です、SPI3接続です】
  //SPI1を使う場合と異なる所という観点で記載します。このコードだけでは動きません。

  //最初にSPI3という定義、ピン名称の定義と各ピンへの割付を定義します

  #define TP_SPI                SPI3
  #define TP_SPI_CLK            RCC_APB1Periph_SPI3
  #define TP_SPI_SPI_CLK_INIT     RCC_APB1PeriphClockCmd  // SPI3はAPB1接続

  #define TP_SPI_SCK_PIN         GPIO_Pin_3
  #define TP_SPI_SCK_GPIO_PORT   GPIOB
  #define TP_SPI_SCK_GPIO_CLK    RCC_AHB1Periph_GPIOB  // GPIOはAHB1接続
  #define TP_SPI_SCK_SOURCE     GPIO_PinSource3

  #define TP_SPI_MISO_PIN         GPIO_Pin_4
  #define TP_SPI_MISO_GPIO_PORT   GPIOB
  #define TP_SPI_MISO_GPIO_CLK     RCC_AHB1Periph_GPIOB
  #define TP_SPI_MISO_SOURCE     GPIO_PinSource4

  #define TP_SPI_MOSI_PIN         GPIO_Pin_5
  #define TP_SPI_MOSI_GPIO_PORT   GPIOB  
  #define TP_SPI_MOSI_GPIO_CLK    RCC_AHB1Periph_GPIOB
  #define TP_SPI_MOSI_SOURCE     GPIO_PinSource5

  #define TP_CS_PIN              GPIO_Pin_15
  #define TP_CS_GPIO_PORT        GPIOA
  #define TP_CS_GPIO_CLK         RCC_AHB1Periph_GPIOA
  
  // 後で思ったのだが、GPIOBに割り付けた3ピンの記述は短くできそうだ。

  // TP(タッチペン)用SPI3の初期化です
  void touch_init(void)
  {   
    GPIO_InitTypeDef   GPIO_InitStructure;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    /* Toutch Panel --------------------------------- */  // クロック接続
    RCC_APB1PeriphClockCmd(TP_SPI_CLK, ENABLE);  // SPI3機能のクロックはAPB1に接続
    RCC_AHB1PeriphClockCmd(TP_SPI_SCK_GPIO_CLK | TP_SPI_MISO_GPIO_CLK |
           TP_SPI_MOSI_GPIO_CLK | TP_CS_GPIO_CLK, ENABLE); // GPIOピンはAHB1接続

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

    /*!< SPI SCK pin configuration */
    GPIO_InitStructure.GPIO_Pin = TP_SPI_SCK_PIN;
    GPIO_Init(TP_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

    /*!< SPI MOSI pin configuration */
    GPIO_InitStructure.GPIO_Pin =  TP_SPI_MOSI_PIN;
    GPIO_Init(TP_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);

    /*!< SPI MISO pin configuration */
    GPIO_InitStructure.GPIO_Pin =  TP_SPI_MISO_PIN;
    GPIO_Init(TP_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);

    /*!< Configure TP CS pin in output pushpull mode ********************/
    GPIO_InitStructure.GPIO_Pin = TP_CS_PIN;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_UP;
    GPIO_Init(TP_CS_GPIO_PORT, &GPIO_InitStructure);

   // 以後SPI(SPI3)の初期化だが、SPI1と同じなので省略
   //
   }

   以上の設定でSPI3の環境設定ができる。

  【STBee(stm32f103) は、SPI2接続です】

  //最初にSPI3という定義、ピン名称の定義と各ピンへの割付を定義します

  #define  SPI2_PORT        GPIOB
  #define  SPI2_RCC         RCC_APB1Periph_SPI2  // SPI2はAPB1接続
  #define  SPI2_GPIO_RCC     RCC_APB2Periph_GPIOB // GPIOピンはAPB2接続
  #define  SPI2_NSS_PIN      GPIO_Pin_12
  #define  SPI2_SCK_PIN      GPIO_Pin_13
  #define  SPI2_MISO_PIN     GPIO_Pin_14
  #define  SPI2_MOSI_PIN     GPIO_Pin_15

  void SPI_Configuration(void)
  {
    /* Supply APB2->APB1 clock, change by stm32f103 */
    RCC_APB1PeriphClockCmd(SPI2_RCC , ENABLE);     // SPI2はAPB1接続
    RCC_APB2PeriphClockCmd(SPI2_GPIO_RCC , ENABLE); // GPIOピンはAPB2接続

    SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Configure SPI2 pins: SCK, MISO and MOSI */
    GPIO_InitStructure.GPIO_Pin = SPI2_SCK_PIN | SPI2_MISO_PIN | SPI2_MOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI2_PORT, &GPIO_InitStructure);

    /* Configure SPI2_NSS: xCS : output push-pull */
    GPIO_InitStructure.GPIO_Pin = SPI2_NSS_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(SPI2_PORT, &GPIO_InitStructure);

    /* SPI2 configuration */
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI2, &SPI_InitStructure);

    /* Enable SPI2  */
    SPI_Cmd(SPI2, ENABLE);

  }

  以上、備忘録でした。それなりの形になったらソースをUPしたいと思います。







テーマ : 電子工作・電気関係工作
ジャンル : 趣味・実用

コメントの投稿

非公開コメント

興味深い実験です

継続的な実験に敬服します、本職でもないのにすごいエネルギーですね。
STAP細胞とともに成果を期待しています。

No title

>S.N様

ここ直近になって、本職CMが忙しくstm32マイコンのお勉強時間が取れません。

stm32マイコンは多分、機器組み込みに多用されているので、技術を持ったプロは沢山おられるのでしょうが、アマチェアで(私がWEB検索で見れる範囲)高度に極めておられる方は10人に満たないのではないでしょうか?
反面、stm32マイコン自体は凄い速さで進化を進めているようなので、老体脳の基本的なことを勉強している小生は、学ぶほどに隔世感が増えていきます(笑)
プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード