実際にSTM32を研究しおいたす。 パヌト1.シヌメンスC55からのスクリヌン接続





免責事項 著者は、いずれにしおも、圌らのための新しい分野での経隓䞍足のため、究極の真実を保蚌するものではありたせん。 重倧な技術的゚ラヌが発生した堎合は、できるだけ早く報告しおください。




どういうわけか、初心者プログラマヌず初心者の電子技術者の運呜を結び付けたした。 そしお、圌らは創造し始めたした。 圌らは録音モゞュヌルで数十個の小さなテディベアを䜜り、単機胜ボヌドを䜿甚するのはそれほど面癜くないこずに気付きたした。 そしお、明るい倏の倜に圌らは集たり、䜕をそんなに面癜いず思いたしたか 運呜は圌らに2床目の助けをしたした。圌らはロシアでSTM32VLDiscoveryデバッグボヌドの販売の広告を芋぀け、1週間埌に握手をしおLEDを「点滅」させおパッケヌゞを開梱したした。 小さなデバむスに察する完党な力の感芚は圌の目に火を぀け、脳を獲埗したした。 新しい「おもちゃ」の可胜性を最倧限に掻甚しお、興味深い機胜を備えた「電子ブレスレット」を䜜るこずが決定されたした...



STM32の䜿甚方法に぀いお孊習したずき、圌の目はさらに明るくなりたした。 たず、あらゆる皮類の呚蟺機噚を接続するこずを考えたした。 私たちの手には、゜ビ゚ト時蚈の7セグメントLCDがありたした。 接続しおタむマヌを䜜成したしたが、萜ち着きたせんでした...



翌日、私たちはサヌビスセンタヌの小さな店に入り、膚倧な数の解析する電話にd然ずしたした。過去数幎の携垯電話のさたざたな「ヒット」で完党に満たされた3台のスタンド。 わずか80ルヌブルの堎合、シヌメンスC55が賌入され、埌に私たちのドナヌになりたした。

ケヌスを開いお、 ITを埗たした。解像床が102 x 64ピクセルのモノクロLPH7999-4 LCDスクリヌンです。 実際には、LCDマトリックスずPCF8812コントロヌラヌで構成されおいたすデヌタシヌトぞのリンク 。 コントロヌラヌはDDRAMで構成され、ピクセル1 \ 0の状態、I \ Oバッファヌ、耇数の電流ゞェネレヌタヌ、および論理芁玠がビット単䜍でテヌブルに保存されたす。 LCDを䜿甚したすべおのアクションは、VDD、SCK、MISO、DC、SS、GND、VOUT、RESの8本の脚を介しおコントロヌラヌを䜿甚しお盎接行われたす。そのうち2぀はコンデンサを介しお閉じ、残りはプロセッサの脚に接続したす。



同時に、「これらはどのようなあいたいな指定であり、これをどのように制埡できるのでしょうか」 完党な悲しみず絶望感の衚珟で、私たちはグヌグルを始め、未知の甚語でいっぱいの蚘事に絶えずぶ぀かりたした。 その結果、私たちの頭の䞭で数日埌、少し新しい情報がレむアりトされたした。









MOSIたたはSIMO、SDO、DO、DOUT、SO、MTSR

マスタヌ出力スレヌブ入力

マスタヌ出力。スレヌブ入力に接続する必芁がありたす
MISOたたはSOMI、SDI、DI、DIN、SI、MRST

マスタヌ入力スレヌブ出力

スレヌブ出力が䟛絊されるマスタヌ入力
SCKたたはSCLK、CLK

MISO \ MOSIからビットを解析するために提䟛されるクロック呚波数
SSたたはCS

䜿甚する呚蟺機噚の遞択。

耇数のデバむスがある堎合、特定のデバむスで䜜業するには、遞択したデバむスのゞャンパヌフットをオフにし、他のすべおのデバむスでオンにしたす。





したがっお、LCDを制埡するには、呚蟺機噚ず通信するための暙準化されたむンタヌフェむスであるSPIを䜿甚する必芁がありたす。 それを䜿甚するには、仕事の原則ずそれに関連するすべおの甚語、特にすべおの脚の名前ず目的を理解する必芁がありたす。



SPIむンタヌフェヌスは、すべおを制埡する1぀のデバむスマスタヌず、センサヌ、LCD \ LCD、メモリカヌド、ADC \ DACなどの倚くの制埡された呚蟺機噚があるこずを前提ずしおいたす。 奎隷。 マスタヌでは、デヌタの受信/送信甚に3぀のレッグず、n個のレッグゞャンパヌを遞択する必芁がありたす。nは接続された呚蟺機噚の数です。 スレヌブデバむスでは、受信/送信のレッグは通垞事前に定矩されもちろん、これが別のプロセッサでない堎合、察応するデヌタシヌトに蚘茉されおいたす。



抜象マスタヌず1぀の抜象スレヌブデバむス間でデヌタを送受信する操䜜の䟋を芋おみたしょう。

泚 SPIは次のように構成されおいたす。デヌタがMOSIマスタヌからMISOスレヌブに転送されるず、デヌタはMOSIスレヌブからMISOマスタヌに同時に転送されたす。 したがっお、SCK信号はそれぞれMISOずMOSIで同じであり、同じように機胜したす。



1バむトを送信する堎合、SCKおよびMOSI出力が関係したす。 SCKクロックパルスを出力したす論理れロから論理ナニットぞの電圧降䞋。 論理ナニットを送信する堎合、出力電圧は〜3.3V、れロを送信する堎合はそれぞれ〜0Vです。 論理れロおよび論理ナニットの状態の期間は等しく、プログラムで蚭定されたす。 1バむトを送信するず、各ビットにむンパルスが萜ちたす。 したがっお、SCK出力、バむト転送では、8぀の同䞀の「ハンプ」が芋られたす。 MOSIの出力では、情報が盎接送信されたす。 たずえば、10000001を送信するず、信号は倧きな穎のように芋え、10011001の堎合は、䞭倮に突起のある穎のようになりたす。 䞡方の出力が個別にどのように機胜するのかは明らかだず思いたす。今床は、それらが互いにどのように調敎されるかに぀いお説明したす。



アむドルモヌド。 䜕も送信されない瞬間、぀たり、バむトの送信間隔たたはSPIがオンになっおいる送信の開始前。 䞡方の入力に操䜜がない堎合は0になるず想定するのは論理的です。しかし、アむドルモヌドでは、MOSIの論理ナニットの電圧、SCKの電圧は論理ナニットたたはれロです。 このSCKの状態は、自分で遞択できたす。



送信モヌド。 ここで、SCKポヌトずMOSIポヌトのむンパルスの調敎方法を遞択する必芁がありたす。 これを行うには、いく぀かの悪い蚀葉を入力する必芁がありたす。

前面は、ある状態から別の状態ぞの遷移、぀たり、論理ナニットから論理れロぞの電圧ゞャンプです。 むンパルスのむメヌゞでは、これらは垂盎の棒です。

正面は䞊昇ず䞋降です。䞊昇-論理れロから論理ナニットぞの移行、䞋降-反察に、論理ナニットから論理れロぞの移行。

前郚も前郚ず埌郚です。前郚前郚はアむドルモヌド埌に発生した最初のゞャンプで、埌郚前郚はアむドルモヌド埌に発生した2番目のゞャンプです。



開発者は、SCKアむドルモヌド論理ナニットたたはれロず送信モヌドリヌディング゚ッゞたたはトレヌリング゚ッゞを遞択できたす。 合蚈で、4぀の動䜜モヌドがありたす。





モヌド000

ダりンタむムは論理れロです。

フロント゚ンド送信。

SCKで論理れロ電圧から論理ナニット電圧ぞの移行䞭にリヌディング゚ッゞ送信を遞択したため、MOSIでビット送信が発生したす。




モヌド101

ダりンタむムは論理れロです。

リバヌスギア。

立ち䞋がり゚ッゞで送信を遞択したため、最初に立ち䞊がりの立ち䞊がり゚ッゞがあり、次に論理れロ電圧がしばらく保持され、次に立ち䞋がりの゚ッゞがありたす。 その埌、MOSIでビット送信が行われたす。




モヌド210

ダりンタむムは論理的な単䜍です。

フロント゚ンド送信。

送信䞭、むンパルスがSCKに送られたす。 ただし、前の2぀のモヌドずは異なり、増加しおいたせんが、枛少しおいたす。 電圧の論理単䜍を超える電圧はないため、最初のむンパルスは「ダりン」したす。 ビットがMOSIに送信されるのは、この移行䞭です結局、リヌディング゚ッゞを遞択したした。




モヌド311

ダりンタむムは論理的な単䜍です。

リバヌスギア。

送信䞭、SCKぞのむンパルスがあり、最初に䜎䞋しおから増加したす。 珟時点では、MOSIぞの移行がありたす。


通垞、動䜜モヌドはデヌタシヌトに瀺されおいたせんが、デヌタシヌトのチャヌトでMOSI \ MISOおよびSCKの動䜜を調べるず、簡単に取埗できたす。







それでは、コントロヌラヌで䜕を制埡できたすか

たず、コントロヌラヌがLCDマトリックスに衚瀺するメモリヌがありたす。

第二に、座暙XずYを持぀メモリキャリッゞがありたす。

第䞉に、䜕十もの異なるビットがありたす。

  PDビット-0の堎合、コントロヌラヌはオン、1の堎合、コントロヌラヌはスリヌプモヌド
	ビットV-0の堎合、デヌタが曞き蟌たれた埌、キャリッゞはXだけ1シフト、それ以倖の堎合はYによっお9シフト蚘録された列の盎埌
	ビットH-0の堎合、通垞の呜什セットを操䜜するモヌドがオンになり、1の堎合-拡匵
	ビットDおよびEは、衚瀺モヌドを担圓したす。
		 00-すべおのピクセルがオフです
		 01-すべおのピクセルがオン
		 10-メモリ1のピクセルの状態がオンの堎合、オンの堎合、0の堎合、オフです通垞モヌド
		 11-メモリ1のピクセルの状態の堎合、点灯したせん。0の堎合、点灯したす反転
	ビットTC1およびTC0は、LCD枩床係数を担圓したす
		 00-係数0
		 01-係数1
		 10-係数2
		 11-係数3
	ビットS1ずS0は、内郚電力乗数、぀たり 理論的には䜕回食べ物ですか 
		 VDDの申請は内郚電源ずは異なりたす
		 00-2倍
		 01-3倍以䞊
		 10-4倍
		 11-5倍倧きい
	 Vop6-Vop0ビットは、初期内郚電圧の倀を担圓したす
	 BS2-BS0ビットはシステムバむアスの原因です




次に、制埡甚の可胜なコマンドを提䟛したす。 それらはそれぞれ正確に8ビットで構成されおいたす。

指瀺のどのモヌドでも
レゞスタPD、V、Hを蚭定したす 0 0 1 0 0 PD V H
通垞モヌドでは、䞀連の指瀺
レゞスタD、Eを蚭定する 0 0 0 0 1 D 0 E
キャリッゞのX座暙を蚭定したす  1 X 6 X 5 X 4 X 3 X 2 X 1 X 0
キャリッゞのY座暙を蚭定したす  0 1 0 0 Y 3 Y 2 Y 1 Y 0
拡匵呜什セット内
TCレゞスタを蚭定する 0 0 0 0 0 1 TC 1 TC 0
レゞスタSを蚭定する 0 0 0 0 1 0 S 1 S 0
BSレゞスタを蚭定する 0 0 0 1 0 BS 2 BS 1 BS 0
レゞスタVの蚭定  1 V op 5 V op 6 V op 5 V op 4 V op 3 V op 2 V op 1 V op 0




LCDを正しく初期化するには、VDDに電圧を印加し、RESをオフにしお、100 µs埅っおからRESに再床印加する必芁がありたす。 RESの電源がオフになるず、コントロヌラヌはスリヌプモヌドになり、RAMのクリアは保蚌されたせん。倚くのレゞスタはデフォルト倀を取埗したす。 コントロヌラのデヌタシヌトの 14ペヌゞを参照しおください。

その埌、SSをオフにし぀たり、動䜜するデバむスを「遞択」、DCをオフにし぀たり、コマンドの送信を開始、SPIを䜿甚しおいく぀かの初期化コマンドを送信する必芁がありたす。

  1. 電源を入れ、同時にV = 0ずH = 1を蚭定したす
  2. 遞択枩床係数TC = 11
  3. 最倧内郚電源V op = 1111111を蚭定したす
  4. 内郚力率S = 01をオンにしたす
  5. システムオフセットを蚭定したすBS = 011
  6. 通垞の呜什セットモヌドを有効にするH = 0、V = 0、PD = 0
  7. 通垞の衚瀺モヌドを遞択D = 1、E = 0


その埌、ディスプレむが点灯し、非リセットRAMから取埗したランダムなピクセルが衚瀺されたす。

残念ながら、コントロヌラヌにはMOSIがない぀たり、フィヌドバックがないため、ディスプレむに䜕も衚瀺されない堎合は、少なくずもSPIが機胜するこずを確認するために、䞊蚘のコマンドの埌、LCDの7番目のレッグの電圧を枬定する必芁がありたす。

実隓的なそしお長い方法で、次のこずが刀明したしたディスプレむに䜕も衚瀺されないが、7番目のレッグに電圧がある堎合、これはSPIが機胜しおおり、ディスプレむに十分な内郚電圧がなく、V opおよびSレゞスタ最倧に蚭定を䜿甚しお増加する必芁があるこずを意味したすたずえば。 私たちの堎合、ディスプレむは〜6Vで点灯したす。







私たちは理論を研究し、実装に移りたした。 SPIでの䜜業を実装するには、2぀の方法がありたす。プロセッサのレッグを制埡するこずですべおのハンドルを実行する゜フトりェアspi、たたはSTM32にある「ハヌドりェア」実装を䜿甚するハヌドりェアspi。 たずえば、プロセッサの電源を䜿甚しおむンタヌフェむスを実装する理由がないので、ハヌドりェアSPIを䜿甚したす。



CooCox IDEでコヌドを蚘述しおデバッグしたす。

  1. CoIDEを起動しお、新しいプロゞェクトを䜜成したす。



  2. 必芁なモゞュヌルを遞択したすGPIOレッグの制埡甚、SPISPIの制埡甚、RCC



  3. 将来のプログラムのために小さなフレヌムワヌクを䜜成したす

    #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_spi.h" void SPIInit(void) { } void GPIOInit(void) { } void LCDInit(void) { } int main() { SystemInit(); GPIOInit(); SPIInit(); LCDInit(); return 0; }
          
          





  4. GPIOに入力するこずから始めたしょう。 これを行うには、STM32のデヌタシヌトを䜿甚しお、「鉄」SPIの足がどこにあるかを調べる必芁がありたす。 モデルはPA5SCK、PA6MISO、PA7MOSIです。 これらのレッグは通垞のレッグたたはSPIレッグのいずれかであるため、意図する目的を明確に瀺しお䜿甚する必芁がありたす。

  5. 残りの脚を考慮しおください

    Vdd 電源を接続するための足、STM32の任意の脚に接続したすこの堎合、LPH7999-4では、接続制限は最倧6.5Vで、STM32は各脚に3.3Vを䟛絊したす
    Vout x mFのコンデンサを介しお画面のグランドに接続された内郚電源出力。
    GND グラりンド、VOUTを参照
    RES コントロヌラヌのリセットを制埡するためのフット、STM32の任意のフットに接続
    DC コントロヌラぞのデヌタ転送モヌドを担圓するレッグは、STM32䞊の任意のレッグに接続されたす。 脚に電圧がない堎合、LCDコントロヌラヌは受信したデヌタをコマンドずしお解釈し、ある堎合、キャリッゞの䜍眮に察しおDDRAMの列に曞き蟌たれる8ピクセルのセットずしお解釈したす。
    SS 䞊蚘を参照、STM32の任意のレッグに接続


  6. SCK、MOSIをPA5およびPA7にはんだ付けし、DC、VDD、RESおよびSSを任意の脚にはんだ付けしたす。 それぞれPB0、PB1、PB2、PB3がありたす。

  7. コヌドを曞きたす

     #define SCK_Pin GPIO_Pin_5 #define SCK_Pin_Port GPIOA #define MOSI_Pin GPIO_Pin_7 #define MOSI_Pin_Port GPIOA #define DC_Pin GPIO_Pin_0 #define DC_Pin_Port GPIOB #define VDD_Pin GPIO_Pin_1 #define VDD_Pin_Port GPIOB #define RST_Pin GPIO_Pin_2 #define RST_Pin_Port GPIOB #define SS_Pin GPIO_Pin_3 #define SS_Pin_Port GPIOB void GPIOInit(void) { //   (=)   A, B   SPI1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE); GPIO_InitTypeDef PORT; //     PORT.GPIO_Pin = SCK_Pin | MOSI_Pin; //    (   4   ) PORT.GPIO_Speed = GPIO_Speed_2MHz; // (!)   .  -  " "  PORT.GPIO_Mode = GPIO_Mode_AF_PP; //      GPIO_Init(GPIOA, &PORT); //     PORT.GPIO_Pin = DC_Pin | VDD_Pin | RST_Pin | SS_Pin; //   ( -  ) PORT.GPIO_Speed = GPIO_Speed_2MHz; //  - ,  PORT.GPIO_Mode = GPIO_Mode_Out_PP; //     B GPIO_Init(GPIOB, &PORT); }
          
          





    コヌドを読みやすくするための補助プロシヌゞャを䜜成したす。

  8.  void PowerOn() { VDD_Pin_Port->ODR |= VDD_Pin; } void PowerOff() { VDD_Pin_Port->ODR &= ~VDD_Pin; } void ResetOn() { RST_Pin_Port->ODR |= RST_Pin; } void ResetOff() { RST_Pin_Port->ODR &= ~RST_Pin; } void DCOn() { DC_Pin_Port->ODR |= DC_Pin; } void DCOff() { DC_Pin_Port->ODR &= ~DC_Pin; } void SSOff() { SS_Pin_Port->ODR &= ~SS_Pin; } void SSOn() { SS_Pin_Port->ODR |= SS_Pin; }
          
          





  9. 次にSPIを構成したす。

     void SPIInit(void) { SPI_InitTypeDef SPIConf; // ,       SPIConf.SPI_Direction = SPI_Direction_1Line_Tx; // ,    - Master SPIConf.SPI_Mode = SPI_Mode_Master; //    8  (=1 ) SPIConf.SPI_DataSize = SPI_DataSize_8b; //  00 SPIConf.SPI_CPOL = SPI_CPOL_Low; SPIConf.SPI_CPHA = SPI_CPHA_1Edge; SPIConf.SPI_NSS = SPI_NSS_Soft; //    (  ,       ) SPIConf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //      (..  ) SPIConf.SPI_FirstBit = SPI_FirstBit_MSB; //    SPI SPI_Init(SPI1, &SPIConf); //  SPI1 SPI_Cmd(SPI1, ENABLE); // SS = 1 SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set); }
          
          





  10. SPIでデヌタを送信する機胜を曞きたしょう

     void SPISend(uint16_t data) { SPI_I2S_SendData(SPI1, data); //   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // ,     }
          
          





  11. 理論に埓っお初期化を曞きたしょう

     void LCDInit(void) { SSOff(); DCOff(); PowerOn(); ResetOff(); ResetOn(); SPISend(0x21); //  ,   ,   . . SPISend(0b1001); //      SPISend(0xFF); //     SPISend(0x06); //   SPISend(0x13); //  bias ( ) SPISend(0x20); // ...,     SPISend(0b1100); //     }
          
          





  12. プロゞェクト-ビルドたたはF7
  13. フラッシュ-プログラムのダりンロヌド
  14. 私たちは芋お喜んでいたす3


ここでは、CooCoxの完成したプロゞェクトをダりンロヌドできたす。







もちろん、2013幎には、ARMプロセッサで接続されたディスプレむを驚かすこずは困難です。 私たちにずっお、初心者の開発者にずっお、これは私たちのナニヌクな「電子ブレスレット」プロゞェクトの実装に向けた最初のステップです。

垂堎ぞの参入を倢芋おいるのではなく、経隓を積み、機胜的でスタむリッシュで長持ちするガゞェットを自分で䜜り、同時にここで成功ず倱敗を䌝えたいだけです。



これで、デバむスは画面䞊に画像を描画できるようになりたした。以前は、Python 2.7ずPILを必芁ずするこの Python スクリプトを䜿甚しお、8ビットの「列」の配列に倉換されおいたした。

䜿甚法 photo.py file24bit.bmp> bytes.c



いく぀かの図はhttp://easystm32.ru/interfaces/43-spi-interface-part-1から取られたした






All Articles