未知のマむクロコントロヌラヌのリバヌス゚ンゞニアリング





耇雑なネクタむ



バックグラりンド ...



電子eInkの倀札のリバヌス゚ンゞニアリングに関する䜜業の䞀環ずしお   ã€èˆˆå‘³æ·±ã„問題が発生したした。特定の䌚瀟Samsung Electro Mechanics / SoluMは、私が特定できたサヌドパヌティのチップMarvell 88MZ100の䜿甚から、次䞖代の倀札で䜿甚し始めた新しいチップに切り替えたした。



これは、たさにこの目的のために䌚瀟が開発した独自のチップのようでした。そのようなもののリバヌス゚ンゞニアリングを匕き受けるこずは、死んだ問題です。友人が私にそのようなチップでいく぀かの倀札をくれたした-いじくり回したす。それらは2぀のタむプであるこずが刀明したした。1぀はe-inkにセグメント化されたディスプレむを備え、もう1぀はe-inkに埓来のグラフィックディスプレむを備えおいたす。䞡方のモデルのメむンチップは同じであるため、最初に行ったのはセグメント化されたディスプレむデバむスでした。これは、よりシンプルで、それを䜿甚しお未知のシステムを凊理するのが簡単だからです。どこから始めればよいかは完党には明確ではありたせんでしたが、もちろん、これらは垞に最も興味深いタスクです。 



調査





質問を読たずにクロスワヌドパズルを解こうずするのはばかげおいたす。デバむスに関しおすでに利甚可胜なすべおの情報を最初に収集せずに、デバむスをリバヌス゚ンゞニアリングするのも同様に愚かです。では、最初に䜕を知っおいるのでしょうか。ワむダレスデヌタ転送プロトコルはおそらく通垞ず同じです。新しいプロトコルに移行したり、顧客のために2぀のプロトコルを同時にサポヌトしたりしお、移行をゆっくりず実行するこずを望んでいる䌁業はないからです。叀いプロトコルは2.4GHz ZigBeeに䌌おいたので、新しいプロトコルはおそらく同じです。これが䞡面からのボヌドの写真です。





では、䜕が芋えたすかたず、コスト最適化のクヌルな䟋です。圌らはe-inkスクリヌンをPCBに盎接ラミネヌトしたした PCBがある堎合、誰が導電性ガラスの背面パネルを必芁ずしたすかフロントパネルは導電性プラスチック補です。しかし、それは重芁ではありたせん。



サむズから刀断するず、2.4GHzで2぀のアンテナが衚瀺されたす。予想通り、前䞖代のデバむスにも2぀の2.4GHzアンテナがありたした。 2぀のチップがありたす。倧小。倧きなもの「SEM9010」ず指定には、明らかにディスプレむに接続する倚くの接点があり、アンテナには接続しおいたせん。明らかに、これはディスプレむコントロヌラヌです。



小さな「SEM9110」ず指定されおいるは、すべおの操䜜を担圓する脳のようです。これは、アンテナ、タむミングクリスタル、およびファクトリプログラミングでここで明らかなキヌポむントに接続されおいたす。



ここには12個のパッドがありたす。1個はバッテリヌのプラス端子に接続され、1個はアヌスに接続され、他の10個の目的は謎です。オンラむンでチップの名前を怜玢しおも、圹に立぀ものは䜕も芋぀かりたせん。間違いなく圌ら自身の開発です。しかし、誰がそのような単玔なアプリケヌションのために独自のチップを蚭蚈するのでしょうかたぶんただのリブランド利甚しお、私たちは働いおいたす



䞍思議なこずに、Google画像怜玢がここで圹に立ちたした。このツヌルは、リバヌス゚ンゞニアリングに圹立぀こずがありたす。この堎合、圌は私たちをこのナゲットに連れお行き たす。 ïŒˆ åŸŒäž–のためにここにアヌカむブされたコピヌ  。これはStackExchangeからの質問です-これらの電子棚ラベルがどのように機胜するのか疑問に思いたす。ここに掲茉されおいる写真では、プリント回路基板は ç§ãŸã¡ã®ã‚‚のずほずんど同じに芋えるので、質問は興味深い  ものです。チップもたったく同じですが、ラベルが異なりたす。ボヌドは、SoluMがこれらのチップのブランド倉曎を開始する前に䜜成された可胜性がありたす。



私がディスプレむコントロヌラヌであるず想定したチップには、ずいうラベルが付いおい  SSD1623L2



たす。実際、これは最倧96セグメントをサポヌトするe-inkセグメントディスプレむコントロヌラヌです。オンラむンで怜玢するず、プレリリヌスバヌゞョン0.1のデヌタシヌトが芋぀かりたした  アヌカむブされたコピヌは  こちら åŸŒäž–のために。それは良いです圌らがこれに到達する方法を知っおいれば、圌らはそれが理解するコヌドを拟うこずができたす、そしお私たちがこのコヌドを芋るずすぐにそれはすべおです



メむンのマむクロコントロヌラは ZBS242



です。はい。私はこのマむクロコントロヌラヌに粟通しおいたせん。もう少しむンタヌネットを怜玢しおみたしょう-怜玢するず リンクが衚瀺されたす ïŒˆã‚¢ãƒŒã‚«ã‚€ãƒ–コピヌは  こちら åŸŒäž–のために、StackExchangeからの同じ答えにも蚀及しおいたす。このペヌゞは韓囜語ですが、このチップには8051コアず、かなり予枬可胜な呚蟺機噚UART、SPI、I2C、ADC、DAC、コンパレヌタ、枩床センサヌ、5チャネルPWM、3チャンネルトラむアックコントロヌラヌが搭茉されおいるこずが瀺されおいたす。 、IRトランスミッタヌ、キヌスキャン機胜、RF-Wake機胜、アンテナ間隔、ZigBiee互換ラゞオおよびMAC。写真は、内郚に32 kHz RC発振噚もあり、前述のように、スリヌプモヌドで消費するのはわずか1uAであるこずを瀺しおいたす。サムスン甚のチップを䜜ったのはこの䌚瀟だったず思いたす。おもしろい...



写真を芋お、私たちを困惑させたSEM9110クリスタルもポむントブランクで撮圱されたこずがわかり  たす ïŒˆã‚¢ãƒŒã‚«ã‚€ãƒ–コピヌ   åŸŒäž–のためにここに。ZBS243ず蚘茉されおいたす。これは、ここにチップのファミリヌ党䜓、぀たりZBS24xがあるこずを意味しおいるず思いたす。本圓に面癜いです。



スレッドがありたす





別のセグメントタグを開いた埌も、ニュヌスを喜んでいたす。プログラミングヘッドは、明確で読みやすい金色の文字で眲名されおいたす。ヘッドには、SPI、UART、リセットピン、電源、グランド、および「テスト」ず呌ばれるピンがあり、おそらく工堎テストモヌドに入るのに䜿甚されおいるようです。すべおがより奜奇心が匷く、奜奇心が匷いです。





架空のZBS24xファミリの最も叀い代衚が「ZBS240」ず指定されるこずは論理的です。たぶん、そのようなク゚リの怜玢は私たちに䜕か面癜いものを䞎えるでしょうか 「ZBS240」を怜玢しおスラグを陀倖するず、韓囜語で別の興味深いペヌゞが芋぀かりたす  ïŒˆ åŸŒäž–のためにここにアヌカむブされたコピヌ  。この䌚瀟はカスタムのオンデマンドグルヌププログラマヌを䜜っおいるようです。圌らのりェブサむトを芋お回ったずころ、マニュアルが芋぀かりたした  ïŒˆã‚¢ãƒŒã‚«ã‚€ãƒ–コピヌは  こちら åŸŒäž–のために圌らのプログラミングデバむス䞊で、そしお私たちはそのようなデバむスで動䜜するPC甚のナヌティリティをダりンロヌドするこずさえできたす。このナヌティリティには、デバむスのファヌムりェアを曎新するツヌルもありたす。この情報からデバむスのプログラミング方法を掚枬できるかどうか調べたしたが、ファヌムりェアが暗号化されおいるこずがわかりたした。どうやらPC偎のナヌティリティはUSBシリアルポヌトを介しおデヌタを送信しおいるだけなので、ここにも有甚な情報はありたせん。悲しい... 



もう少し怜玢するず、さらに興味深いペヌゞが芋぀かり たす ïŒˆã‚¢ãƒŒã‚«ã‚€ãƒ–されたコピヌは  こちら åŸŒäž–のために。それは䜕ですかセヌル䞭ですか間違いなくもうありたせんよね念のため、この䌚瀟に石鹞を曞いおみたした。沈黙...絶望のゞェスチャヌずしお、私は銙枯の友人に、韓囜の銀行からの送金のみを支払いずしお受け入れるずりェブサむトに瀺されおいるので、これらの人に連絡できる韓囜の誰かを知っおいるかどうか尋ねたした。圌がノックバックしお蚀ったずき、私はただ驚いた。確かに、圌は韓囜で芋぀けた仲介業者を通しお私にこのデバむスを手に入れるこずができた数日埌、デバむスはDHLによっお配達されたした



あなたは圌に到達するこずができたす



圌に連絡する方法



動䜜したすチップの読み取りず曞き蟌みができたす。プログラミングツヌルを研究するのに少し時間がかかりたした。どうやら、チップには64KBのフラッシュメモリず1KBの「情報ブロック」があり、キャリブレヌション倀やMACアドレスなどを保存するために䜿甚されおいるず思いたす。玠晎らしいSaleaeLogicロゞックアナラむザヌを装備しお、プログラマヌがその仕事をしおいるのを芋お、いく぀かのトレヌスを傍受するこずができたした  。私の調査結果はここからダりンロヌドできたす 。このアヌカむブには、INFOBLOCKおよびCODEスペヌスの読み取り、消去、および曞き蟌みの痕跡がありたす。実際、プロトコルは 非垞に ã‚·ãƒ³ãƒ—ルです。クロック呚波数は、100 kHz〜8MHzの範囲で指定できたす。



ISPプロトコル骚の折れる 



それはすべお、ラむンを目的の状態SCLKボトム、MOSIトップ、RESETトップ、SSトップに蚭定するこずから始たりたす。この状態は20ミリ秒間維持されたす。次に、RESETが32ミリ秒䜎䞋したす。次に、少なくずも4぀のプロセッサクロックが500kHzでSCKラむンに送信されたす。次に、RESETがプッシュアップされるたでさらに10ミリ秒の遅延がありたす。通信を開始する前に100ミリ秒の遅延を蚭定できるようになりたした。その埌、任意の数のトランザクションを行うこずができたす。いく぀かの基本的なルヌルSSがダりンしおからバむトを送信するたでに少なくずも5us、バむトの終わりからSSがアップするたでに少なくずも2usが必芁であり、SSが費やすこずができる最短期間は2.5usです。したがっお、各バむトは次の状態で送信されたす。SSがダりン、バむトがSPIモヌド0で送信され、SSがアップです。はい、もちろん、SSはバむトごずに反転したす。



すべおのトランザクションの長さは3〜4バむトです。最初のバむトはトランザクションのタむプを瀺し、最䞋䜍ビットはトランザクションの方向を指定したす。れロはデバむスぞの曞き蟌みを意味し、1はデバむスからの読み取りを意味したす。0x02



/ コマンド 0x03



 ã¯ã€é€šä¿¡ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’開始するために䜿甚されたす。プログラマヌは3バむトのwrite  02 BA A5



を送信し、次に読み取り、最初にreadコマンドず "address"を03 BA



送信FF



し、  マスタヌはを受信しながら送信 し A5



たす。これが機胜する堎合、通信が確立されたす。



コマンド  0x12



/ 0x13



 CPUの特殊目的レゞスタSFRの読み取り/曞き蟌みに䜿甚されたすこれはより難しいず思いたしたが、この堎合、順序はそれほど重芁ではありたせん。 INFOBLOCKを遞択するには、SFR  0xD8



 ã‚’に蚭定する必芁があり 0x80



たす。メむンフラッシュ領域を遞択するには、に蚭定する必芁がありたす 0x00



。 vvの倀をレゞスタrrに曞き蟌むには、SPIデヌタが必芁です  12 rr vv



。倀が読み取られたこずを確認するには、最初に読み取りコマンドず「アドレス」を送信するこずで倀を読み戻すこずができたす。  13 rr



その埌、マスタヌはFF



を受信しながら送信  し  vv



たす。



フラッシュメモリの読み取りは簡単です。これを行うには、適甚したす 0x09



、4バむトのコマンド。コマンドバむトの埌、アドレスが送信されたす。最初に䞊䜍バむト、次に䞋䜍バむトです。次に、マスタヌはを送信  FF



し、その間に読み取られたバむトを受信したす。はい、そうです。各バむトを読み取るには、個別のコマンドが必芁です。曞くのも簡単です。このために、コマンドが䜿甚され 0x08



たす。これは4バむトのコマンドです。コマンドバむトの埌、アドレスが送信されたす。最初に䞊䜍バむト、次に䞋䜍バむト、次に曞き蟌たれるバむトです。各バむトを曞き蟌むには、個別のコマンドも必芁です。録音する前に必ず消去しおください。 INFOBLOCKを消去するには、4バむトのシヌケンスが1぀だけ必芁です  48 00 00 00



。メむンフラッシュメモリの消去は、コマンドを䜿甚しお実行され 88 00 00 00



たす。



これで、ZBS24xを簡単にプログラムするのに十分な知識が埗られたした。



仕事を始める







8051甚プラむマヌ



すでに8051に粟通しおいる堎合は、 ã“のセクションをスキップしおも問題ありたせん  。



8051 ã¯ã€å€ãã‹ã‚‰Intelによっお蚭蚈された  叀いマむクロコントロヌラです。䜜業するのはひどい手間ですが、ラむセンスが安い実際には無料ため、今でもかなり頻繁に䜿甚されおいたす。䜕が問題なの 8051にはいく぀かの個別のメモリスペヌスがありたす。 CODE



 ã‚³ãƒŒãƒ‰ç”šã«äºˆçŽ„ã•ã‚ŒãŠã„ã‚‹ãƒ¡ãƒ¢ãƒªã®é ˜åŸŸã§ã™ã€‚æœ€å€§ã‚µã‚€ã‚ºã¯64KB16ビットアドレスです。最新の蚭蚈では、これはフラッシュメモリです。コヌドは、特別な呜什movc



 ïŒˆ "MOVe from Code"を䜿甚しお、ここからバむトを読み取るこずができたす 。  XRAM



 ã€Œå€–郚」メモリです。぀たり、コアの倖郚です。いろいろなものを収玍できたすが、それ以倖にはほずんど圹に立ちたせん。このようにこのメモリで実行できる操䜜は、曞き蟌みず読み取りのみです。最倧サむズは64KB16ビットアドレスです。 16ビット幅のアドレスを持぀8ビットアドレスのアドレスメモリはどのように機胜したすか非垞に遅いこずがわかりたした。コマンド movx



 ïŒˆ "MOVe to / from eXternal"はこのタむプのメモリにアクセスしたすが、16ビットアドレスをどのように指定したすかこのために、DPTR



 ïŒˆ "Data PoinTeR"ず呌ばれる特別なレゞスタ  が䜿甚され、呜什を操䜜するためにも䜿甚されたす movc



。  DPTR



 äžŠäœãƒ¬ã‚žã‚¹ã‚¿  DPH



 ãšäž‹äœãƒ¬ã‚žã‚¹ã‚¿ã§æ§‹æˆã•れたす  DPL



..。したがっお、それぞれにアドレスの半分を曞き蟌むこずで、倖郚メモリずコヌドメモリをアドレス指定できたす。ご想像のずおり、このプロセスはすぐに遅れ始めたす。たずえば、セクションを倖郚メモリから倖郚メモリにコピヌするにはDPL



 ã€ãšã®  間の倀を繰り返しシャッフルする必芁があるため DPH



です。このため、8051のより高床なバヌゞョンの䞀郚には倚くのレゞスタ  DPTR



がありたすが、すべおではなく、すべおが同じ方法で実装されおいるわけではありたせん。



Intelは、倖郚メモリのサブセットにアクセスするためのより高速な方法を远加したした。この堎合、アむデアはレゞスタ R0



 ãš  R1



 ãƒã‚€ãƒ³ã‚¿ãƒ¬ã‚žã‚¹ã‚¿ãšã—お。しかし、それらはサむズが8ビットですが、アドレスの他の8ビットはどこから来おいるのでしょうか。それらはレゞスタ P2



 ïŒˆGPIOピンのポヌト2も制埡したすからのものです。明らかに、この方法は、ポヌト2を... GPIOに䜿甚する際の邪魔になりたす。この状況をスムヌズにする方法はいく぀かありたすが、今はそれに぀いお話しおいたせん。したがっお、䜿甚可胜なメモリの量は256バむトに制限されたすポヌト2を動的に倉曎しない限り、おそらく実行したくないでしょう。通垞、このメモリはず呌ばれ PDATA



たす。同様のメモリアクセスも呜什を䜿甚しお行われたす  movx



。次の行は SFR



-ペリフェラルを構成するためのさたざたな構成レゞスタ。このメモリ領域には盎接アクセスするこずしかできたせん。これが状況です。アドレスは呜什に盎接゚ンコヌドする必芁があり、ポむンタレゞスタを介したアクセスはありたせん。 128バむトありたす SFR



。次の衚は、SFR



8051暙準に埓っお䜿甚可胜なリストを瀺しおい たす。灰色のボックスにはSFR



、ビット単䜍のコマンドを䜿甚しお個別にアクセスできるビットが含たれお いたす。これは、ポヌトピンをアトミックに割り圓おるずき、割り蟌み゜ヌスをアクティブ化/非アクティブ化するずき、たたはいく぀かのステヌタスをチェックするずきに圹立ちたす。



8051の内郚メモリは少し泚意が必芁です。最新の8051はすべお、256バむトです。最埌の128バむト  0x80-0xff



 ã¯ ã€ãƒ¬ã‚žã‚¹ã‚¿ ãš  を介しお間接的に  のみ䜿甚できたす  が、倖郚メモリの堎合ずは異なり、読み取りず曞き蟌みだけでなく、珟圚も䜿甚できたす。増加 rement、枛少 rement、加算 、およびその他の予想される操䜜のほずんどを実行できたす。実際、 すべおの å†…郚RAMは、これらのポむンタレゞスタを介しお間接的にアクセスされたす。最䞋䜍128バむト R0



R1



inc



dec



add



0x00-0x7f



 ç›ŽæŽ¥åˆ©ç”šã™ã‚‹ã“ずもできたすアドレスは、操䜜するずきず同じように、呜什自䜓に盎接゚ンコヌドされ SFR



たす。範囲内の16バむトのメモリ 0x20-0x2f



 ã‚‚、ビット凊理呜什を䜿甚しおビットアドレス指定できたす。ブヌル倀の倉数を栌玍するのに䟿利です。この郚分。最䞋䜍32バむト  0x00-0x1f



 ã¯4぀のバンクレゞスタを構成し  R0



たす... R7



ステヌタスレゞスタ  PSW



 ã«ã¯ã€çŸåœšäœ¿ç”šã•れおいるバンクを遞択できるビットがありたすが、実際には、通垞、内郚メモリ領域が䞍足しおいるため、コヌドはほずんどの堎合、メモリの1぀のバンクのみを䜿甚したす。



8051は、䞻に単䞀のオペランドで動䜜するように蚭蚈されたマシンです。぀たり、ほずんどの操䜜で、バッテリヌは゜ヌスの1぀ずしお䜿甚され、堎合によっおは宛先ずしお䜿甚されたす。レゞスタは、倚くのすべおではない操䜜にも䜿甚できたす。たた、䞊蚘のように、䞀郚の操䜜では内郚RAMぞの間接アクセスが蚱可されたす。スタックは空のアップストリヌムでアドレス指定可胜であり SFR



、呌び出さ  sp



 ã‚ŒãŠå†…郚RAMにのみ配眮され、最倧サむズは256バむトに制限されおいたすが、実際にははるかに小さくなっおいたす。 



8051 ROMむメヌゞは、実行する初期コヌドぞのゞャンプず割り蟌みハンドラヌを含むベクタヌテヌブルで始たりたす。 8051では、歎史的に、リセットベクトルは次の堎所にありたす。 0x0000



、および割り蟌みハンドラはアドレス0x0003



 ã‹ã‚‰å§‹ãŸã‚Šã€ãã®åŸŒ8バむトごずに始たり たす。この呜什 reti



 ã¯å‰²ã‚ŠèŸŒã¿ã‹ã‚‰ã®åŸ©åž°ã«ã®ã¿äœ¿ç”šã•れるため、特定の関数が割り蟌みハンドラであるかどうかを簡単に怜出するために䜿甚できたす。



Cコンパむラチャネルをこれらすべおで満たしお、パフを取りたしょう 



このアヌキテクチャに適したCコンパむラが存圚したすKeilのC51。しかし、それは安くはありたせん。オヌプン゜ヌスコンパむラもありたす SDCC。たあたあですが、無料です。このプロゞェクトを行っおいるずきに、2぀の倧きなバグしか芋぀かりたせんでした。これは、バむパスするこずによっおのみ克服できたした。オヌプン゜ヌスプロゞェクトにずっおはたったく悪いこずではありたせん。



分析を始めたしょう



void prvTxBitbang(u8 val)
                  __naked {
  __asm__(
    "  setb  PSW.5       \n"
    "  jbc   _EA, 00004$ \n"
    "  clr   PSW.5       \n"
    "00004$:             \n"
    "  clr   C           \n"
    "  mov   A, DPL      \n"
    "  rlc   A           \n"
    "  mov   DPL, A      \n"
    "  mov   A, #0xff    \n"
    "  rlc   A           \n"
    "  mov   DPH, A      \n"
    "  mov   B, #11      \n"
    "00001$:             \n"
    "  mov   A, DPH      \n"
    "  rrc   A           \n"
    "  mov   DPH, A      \n"
    "  mov   A, DPL      \n"
    "  rrc   A           \n"
    "  mov   DPL, A      \n"
    "  jnc   00002$      \n"
    "  setb  _P1_0       \n"
    "  sjmp  00003$      \n"
    "00002$:             \n"
    "  clr   _P1_0       \n"
    "  nop               \n"
    "  nop               \n"
    "00003$:             \n" 
    "  nop               \n"
    "  nop               \n"
    "  nop               \n"
    "  djnz  B, 00001$   \n"
    "  mov   C, PSW.5    \n"
    "  mov   _EA, C      \n"
    "  ret               \n"
  );  }

      
      





GPIO構成から始めるのは簡単です。原則ずしお、いく぀かの䞀臎するビットに出くわしたす。これらのビットは、連続する耇数のレゞスタで蚭定たたは消去されたす。これは論理的です。アクティブ化たたは非アクティブ化するずきは、通垞、ピンをGPIOからの関数ずしお䜿甚し、入力たたは出力ずしお蚭定し、その倀を蚭定たたは読み取る必芁があるためです。䜜業の最初に、この皮のコヌドに出くわす必芁がありたす。そこに䜕があるか芋おみたしょう...暙準レゞスタ P0



が  P1



あり、  P2



 å®Ÿéš›ã«ãã®ã‚ˆã†ã«äœ¿ç”šã•れおいるこずがわかりたす。レゞスタGPIOの凊理方法です。どのレゞスタがそれらの呚りに曞き蟌たれ、次にそれらのビットに䜕が起こるかそれらが読み取り入力たたは曞き蟌み出力のどちらであるかを調べるこずにより、レゞスタが  AD



、  AE



、  AF



 ã€Œæ©Ÿèƒœã€ã™ã‚‹ã‚ˆã†ã«èš­èšˆã•れおい-そしお察応するビットが蚭定されおいるGPIOは、GPIOずしお䜿甚されおいない、そしお実際にGPIOずしお䜿甚されるすべおのGPIOは、これらのレゞスタのうちの1぀にのみ察応するビットの埌にそう䜜業を開始するこずが衚瀺されたすクリアされたす。私はそれらに名前を付けたした。 PxFUNC



ここで、xはポヌト番号です。その埌、我々はそれを結論付けるこずができ  B9



、  BA



、  BB



 æ–¹å‘を制埡したす。それらの1぀にビットが蚭定されおいる堎合は垞に、察応するGPIOは読み取りのみであり、ビットがクリアされるず、察応するGPIOは曞き蟌み専甚になりたす。したがっお、これらのレゞスタがGPIOの方向を制埡するこずを理解しおいたす。名前を付けたした  PxDIR



ここで、xはポヌト番号です。だから今、理論的には、私はGPIOを制埡するこずができたした。それらのどれが䜕



をするかを知っおいれば...  プログラミングヘッドの「テストパッド」を制埡するもの、たたはおそらくURXパッドずUTXパッドを芋぀けるたで、それらすべおを続けお詊すこずにしたした。ずにかく、実際には...ポヌト1のピン0 P1.0



が「TEST」、  P0.6



 ã“れが「UTX」、  P0.7



 ã“れが「URX」であるこずがわかりたした。制埡されたGPIOを䜿甚するず、生掻を簡玠化できたすが、異なるGPIOを切り替えおデバッグを凊理できる堎合に限り、飜きるたでです。これを緎習する時間がありたした 



printfがありたす



この関数を䜿甚しお、ビットバン方匏を䜿甚しお「TEST」パッドを通垞の8n1シリアルポヌトに倉換し、ロゞックアナラむザヌを䜿甚しお出力を収集したした。 USB-シリアルアダプタケヌブルが凊理できるボヌレヌトが埗られるたで、それをいじりたした。私はすでにアセンブラヌでprintfの8051実装を持っおいたした。1時間、この即垭のシリアルポヌトから耇雑なデバッグ行を出力する緎習をしたした。悪いスタヌトではありたせん、間違いなく、これはあなたが効果的に前進するために行動する必芁がある唯䞀の方法です 



この時点で、私はりィンドりにすべおの倀を衚瀺したした SFR



、少なくずもこれらの倀が䜕であるかをナビゲヌトしたす。さらなる研究にはただいく぀かの問題がありたした。そもそも、りォッチドッグタむマヌWDTはデフォルトでしか蚭定されおおらず、実行の1秒埌にチップをリセットするように芋えたので、すべおの実隓は1秒以内に収たらなければなりたせんでした。WDTの操䜜方法がただわからなかったので、しばらくこの制限に我慢したした。ずはいえ、1秒は倚くのサむクルです 



アクセスの拡倧



コヌドを確実に実行しお結果を出力できたので、ティックコントロヌルがどこにあるかを把握するこずにしたした。ほずんどすべおのレゞスタには、異なる速床少なくずもCPUの速床を制埡する少なくずも1぀のレゞスタず、さたざたなモゞュヌルのクロックレヌトたたはリセットを制埡する別のレゞスタがありたす。それらは通垞、次のように怜出されたす。最初のレコヌドは通垞 ã€åˆæœŸãƒ­ãƒŒãƒ‰ã®éžåžžã«æ—©ã„段階で蚘録され 、その埌はほずんど觊れられたせんあるずしおも。 2぀目は通垞、ペリフェラルの構成を開始する前にビットセットクロックサむクルたたはビットクリアがありたす。さたざたな呚蟺機噚がどこに構成されおいるかはわかりたせんが、通垞はセットです  SFR



同様の番号のは呚蟺機噚に察応したす。では、芋おみたしょう。確かにケヌスがありたす、この説明に適合しおください B7



。SFR



同じような番号のいく぀かが曞き蟌たれる前に、䞀床に1ビットず぀蚭定され、SFR



同じような番号のいく぀かの呌び出しが停止した埌、その䞭のビットがクリアされる こずがわかり  たす。たた0x2F



、最初はずしお蚘録されおいる  ので、ここでは事前に含たれおいる呚蟺機噚を扱っおいたす。 å‘šèŸºæ©Ÿå™šã®åˆæœŸåŒ–ず芋なす前にビットが蚭定されおいるように芋えるので、 このレゞスタを呌び出したす。 CLKEN



..。このレゞスタのビットを倉曎しおみたしたが、クリアしおも䜕も起こらなかったようです。私は呚蟺機噚を䜿甚しないので、原則ずしおこれは論理的です。



近くに曞き蟌たれた別のレゞスタ通垞、文字コヌドはすべおのクロック操䜜を䞀緒に初期化したすは、その埌曞き換えられたせんが、これ 8E



です。圌はに曞き蟌みたす  0x21



。私はそれが速床に関係しおいるかもしれないず提案したした。私は実隓したした。どうやら、最䞋䜍4ビットは仕事でたったく反映されおいないので、なぜそれらが蚭定されおいるのかわかりたせん  0b0001



、しかし、次の3ビットは、おそらくCPU速床をかなり倧幅に倉曎したすドリフトの圱響を受けるUARTの速床から刀断できる限り。最䞊䜍ビットは呚波数を少し倉えおいるように芋えたので、内郚RC回路ず倖郚氎晶の切り替えを担圓しおいるず思いたした。私が分呚噚ずしお機胜するず仮定した3ビットは、クロック速床を等しく芋えるように蚭定したした 16M / (1 + )



。このレゞスタに名前を付けたした CLKSPEED



。その結果、最高速床は倀0x01



で達成され、最䜎速床はで達成されたす 。  0xf1







タむマヌを機胜させる



倚くのメヌカヌは8051であらゆる皮類のものを構築しおいるため、ここでは暙準化がほずんどありたせん。ただし、ほずんどの堎合、タむマヌ0やタむマヌ1などの8051の通垞の機噚には觊れたせん。泚意これは経隓則ではありたせん。たずえば、TIはCCシリヌズチップのタむマヌを倧幅に倉曎したす。このチップでは、通垞は暙準の8051タむマヌを構成するこずになっおいるレゞスタが近くで発生しおいるように芋え、割り蟌みハンドラ1もそれらに圱響を䞎えおいるように芋えるこずに気付きたした。できたすか暙準タむマヌ私はそれを詊したした...それはうたくいきたした。完党に暙準で、元の仕様ずたったく同じように芋えたす。レゞスタをチェックした  CLKEN



 ãšã“ろ、ビット0マスク  0x01



タむマヌを機胜させる。暙準レゞスタIEN0



 ã‚‚期埅どおりに動䜜し、番号1ず3が実際にタむマヌ0ずタむマヌ1の割り蟌みを駆動するこずを確認したした 。タむマヌは、16MHzで動䜜する暙準の8051で予想されるずおり、16MHzのちょうど1/12で動䜜しおいるように芋えたす。これたでのずころ、この呚波数を倉曎する方法は芋぀かりたせんでした。私たちが知っおいるこずは、今のレゞスタを明らかにし  TL0



、  TH0



、  TL1



、  TH1



、  TMOD



、  TCON



これで、高粟床タむマヌが機胜するようになりたした。



タむマヌ2が実際に暙準80528051の続線に実装されおいるかどうかを確認するのは面倒ではありたせんでした。いいえ、そうではありたせん。 



それずもUART



void uartInit(void) {
    // 
    CLKEN |= 0x20;
 
    //  
    P0FUNC |= (1 << 6) | (1 << 7);
    P0DIR &=~ (1 << 6);
    P0DIR |= (1 << 7);
 
    // 
    UARTBRGH = 0x00;
    UARTBRGL = 0x89;
    UARTSTA = 0x12;
}
 
void uartTx(u8 ch) {
    while (UARTSTA_1));
    UARTSTA_1 = 0;
    UARTBUF = ch;
}

      
      





OTAモゞュヌルにはいく぀かの行がありたした。圌らが䜕かに関係しおいるのは理にかなっおいたすよね倚分デバッグシリアルポヌトこれは、「UTX」および「URX」キヌポむントを持぀ボヌドに適しおいたす。このコヌドは少し耇雑でしたが、ある皮のバッファにバむトを栌玍しおいるように芋えたした。コヌドは間違いなく暙準のリングバッファのように芋えたした。このバッファが読み取られおいる堎所を調べたした。割り蟌み0のハンドラヌにあるこずが刀明したした。ああ、面癜い。 UART割り蟌みハンドラヌでしょうかコヌドは、ステヌタスレゞスタレゞスタ98



に䌌た領域のビット1をチェックしおいる  ようで、蚭定されおいる堎合は、リングバッファからバむトを読み取り、レゞスタに曞き蟌みたした。 99



..。前述のステヌタスレゞスタに別のビット0が蚭定されおいる堎合は、レゞスタ99



 ã‚’読み取り、  その結果を...別の埪環バッファに挿入したす。たあ、これは私がUART割り蟌みハンドラヌに期埅するものずかなり䞀臎しおいたす次は䜕をするの 



各埪環バッファには、読み取り甚ず曞き蟌み甚の2぀のポむンタがありたす。バッファが䜕かに䜿甚される前に、それらを初期化する必芁があるこずは理にかなっおいたす。したがっお、これらのむンデックスが初期化される堎所がわかれば、UARTがむンストヌルされおいる堎所も芋぀かるでしょう。間違いなくこのように芋えたす。 UARTを初期化する機胜では、我々はGPIOこずを確認  P0.6



 ã—、  P0.7



機胜モヌドに蚭定し、  P0.7



 ã¯å…¥åŠ›ã«ã€P0.6



 -は出力に配眮さ  れたす。さらに2぀のレゞスタ  9A



 ãš  9B



 ã¯0x00



 ã€0x89



 ãã‚Œãžã‚Œãšã§  曞き蟌たれ  たす。私のバヌゞョンによれば、状態で動䜜するレゞスタレゞスタ  98



はずしお曞き蟌たれ  0x10



、その䞭のビット0ず1がクリアされたす。次に、CLKEN



 ãƒ“ット5がに蚭定され  、IEN0



 ãƒ“ット0がに蚭定され たす。原則ずしお、必芁なのはこれだけです。 



したがっお、レゞスタに名前を付ける  ず、レゞスタはに  ãªã‚Š  たす。私達はこずを知っおいたす  99



  UARTBUF



98



UARTSTA



UARTSTA



 ã“のブロックを機胜させるには、0x10に蚭定する必芁がありたす。ビット0は、UARTのTX FIFOキュヌに空きバむトがあるこずを意味し、ビット1は、UARTのRXFIFOキュヌにバむトがあるこずを意味したす。CLKEN



 ãƒ“ット5がUARTのクロックを有効にし、割り蟌み番号0がUART割り蟌みハンドラヌに察応するこずがわかっおい たす。それは単なる情報の宝庫です。これを知っお、コヌドで動䜜するUARTドラむバヌを䜜成し、目的の「UTX」ピンに送信メッセヌゞを送信するこずができたした。このピンは、珟圚わかっおいるように、ポヌト0のピン6 P0.6



にありたす。たた、「URX」キヌポむントがに接続されおP0.7



おり、これがUARTのRXラむンであるこずも孊び  たした。 UARTは115,200bps、8n1でデヌタを送信しおおり、レゞスタの圱響を受けたせんでした。 CLKSPEED



..。では、これらの魔法の意味を䞎えるこれら2぀の他の䞍思議なレゞスタヌは䜕ですか 



私は残りの2぀のレゞスタをいじくり回すこずを詊みた、  9A



 ãš  9B



。圌らが䜕のためにあるのかがすぐに明らかになりたした。これらは分呚噚です。ボヌレヌトにどのように圱響するかを確認するために、いく぀かの倀をプラグむンしたした。それは単玔であるこずが刀明したした。  9A



 ïŒˆä»¥äž‹ã€  UARTBRGL



は䞋䜍バむト、 9B



 ïŒˆä»¥äž‹  UARTBRGH



は䞊䜍バむト䞊䜍4ビットは無芖されおいるようです。ボヌレヌトは単玔にずしお蚈算され  16M / (UARTBRGH:UARTBRGL + 1)



たす。これは、魔法のように芋えた倀を完党に説明しおいたす-それらは115,200ボヌに察応したす。



明らかに、小さなバグは、FIFOに圱響を䞎えるこずなくプログラムでステヌタスビットをクリアできるずいう事実に関連しおいるため、誀っお「TX FIFOに空き領域がある」UARTSTA



.1を意味するビットをクリアするず 、割り蟌みが発生したす。発生するこずはなく、ビットはロヌのたたになりたす。



䞍思議なこずに、これらの堎所は、8051シリアルポヌトレゞスタであるSCON



 ãšã®  正しい8051アドレスず䞀臎したす  SBUF



。ビット0、1、および2は、8051UARTSTA



 ã®èª¬æ˜Žã«  実際に適合したす  SCON



が、ここで類䌌性は終わりです。 8051のUARTでは、ビット7ず6を蚭定する必芁がありたす  SCON



0ず1では、この方法でのみ通垞のUARTになりたす。この堎合、このチップには0ず0が必芁です。さらに、8051 UARTには通垞、ボヌ分呚噚がなく、代わりにタむマヌ1が䜿甚されたす。



りォッチドッグタむマヌず「芋お」



この時点で、デフォルトのりォッチドッグ構成によっお保蚌された1秒の実行制限が私を悩たせ始めおいたした。りォッチドッグがどこでどのように構成されおいるかを調べるこずにしたした。通垞、りォッチドッグタむマヌは独自の機胜の䞀郚ずしお構成されおおり、小さいです。もちろん、これが垞に起こるずは蚀いたせんが、ほずんどの堎合、このように芋えたす。私にはいく぀かの候補があり、それぞれから順番にレゞスタの曞き蟌みをテストプログラムにコピヌしようずしたしたが、りォッチドッグは道を譲りたせんでした。毎秒チップを正しくリセットする必芁がありたした。



それをしおいるず、ずおも奇劙な機胜に気づきたした。どうやら、圌女は番号の䞋のレゞスタヌを読み、 FF



そこに䜕かを曞き、そしおリセットした P1DIR



、他のレゞスタに曞き蟌んだ埌、レゞスタの元の倀を埩元したした  FF



。奇劙なこずに ã€ãƒãƒŒãƒˆ1のすべおのピンがピンに蚭定されおいたした 。これはナンセンスです。他のモデルでは、ポヌト1に耇数のピンが入力ずしお構成されおいたす。さらに、このようなレゞスタは通垞、呜什anl



論理積およびorl



論理積  を䜿甚しおビットごずに操䜜されたす  。レゞスタヌ党䜓ぞのそのような倧たかな曞き蟌みは、䞀床に反発的に芋えたした。FF



バックアップず埩元が必芁なレゞスタに぀いおはどう ですかずおも奇劙に芋えたした 



調査するこずにしたした。レゞスタ倀をコン゜ヌルにダンプする堎合 FF



、それはれロであるこずが刀明したしたが、もちろん、それは私には合いたせんでした。ファヌムりェア党䜓を怜玢したずころ、ほずんどすべおの堎所に蚘録があり、次にバックアップがあり、その埌元の倀が埩元されおいるこずがわかりたした。私はたた、曞くこずはほずんど垞に倀で起こり0x04



、めったに起こらないこずに気づき  たした  0x00



..。このレゞスタは、さらに埩元するためにバックアップ䞭にのみ読み取られたした。この倀に察しお他のアクションは実行されたせんでした。これはどのような機胜を瀺しおいたすか基本的に、これはメモリバンキングコントロヌルが通垞どのように機胜するかですアドレス空間に収たらないほど倚くの情報がある堎合は、切り替える必芁がありたす。このアクセスパタヌン倉曎前のバックアップずその埌の埩元は、このような実際的な状況では䞀般的です。しかし、圌らは䜕を保存できたすかこれでいいのこれらの狂人はメモリスペヌス自䜓を過負荷にしおいたす SFR



か



私はすべおSFR



、すべお128の倀を衚瀺できるプログラムを曞きたした。  それから私はビット0x04



 ã‚’に倉え  たした  FF



  SFR



そしお再びすべおのスペヌスを取り出したした SFR



。次に、プログラムはこのビットをラップバックし、すべおの倀を再床衚瀺したした。党胜の神そこにはレゞスタのビット2は、  FF



 å®Ÿéš›ã«ã‚¹ãƒšãƒŒã‚¹ã‚’節玄したす SFR



。このビットが蚭定されるず、衚瀺される倀が倉化するこずは間違いありたせん。どうやら、これはすべおのアドレスSFR



に圱響を䞎えたわけではありたせんが、倚くのアドレスに圱響を䞎えたした  。このレゞスタに名前を付けたした CFGPAGE



。



今こずを  CFGPAGE



私が敎理されたず思った、私はれロに私の神秘的な機胜、に戻りたした P1DIR



。この堎合はれロにリセットされない  こずをすでに知っおいたす P1DIR



が、別のペヌゞにある圌の奇劙ないずこ SFR



、このコヌドをプログラムにコピヌしようずしたした。信じられないかもしれたせんが、WDTを無効にするコヌドに偶然出くわしたした!!!



通垞、バむナリ内の関連する関数は互いに隣接しおいるため、この関数を取り巻くコヌドを調査したした。確かにCFGPAGE



 ã€éš£æŽ¥ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚‚アクセスしおアクセスする いく぀かの機胜が近くにありたした P1DIR



。数時間の詊行錯誀の末、りォッチドッグの仕組みの詳现を完党に理解したした。蚭定の4ペヌゞ目には、アドレス BF



がりォッチドッグタむマヌの有効化ずリセットを制埡しおいるように芋えたす。このレゞスタの最䞊䜍ビットは、りォッチドッグタむマヌのチップリセット機胜を有効たたは無効にしたす。名前を付けたした WDTCONF



。䜏所  BA



 ïŒˆ  P1DIR



 èš­å®šãƒšãƒŒã‚ž0にありたすはりォッチドッグむネヌブルレゞスタです。ここでのビット0は、りォッチドッグタむマヌ自䜓を有効たたは無効にしたす。名前を付けたした WDTENA



。



この時点たで、私はただりォッチドッグタむマヌを飌いならす方法を考えおいたした。少し時間がかかりたしたが、結局わかりたした。レゞスタ  BB



 ïŒˆçŸåœšã®åå‰  WDTPET



をれロに曞き蟌んで、りォッチドッグタむマヌを調敎できたす。間のアドレス空間に穎が明確にあったので、それは、りォッチドッグタむマの遅延を蚭定する方法を芋぀け出すために私には数分以䞊かかりたした BB



 ã—、  BF



..。カりンタヌは24ビット長で、飌いならされるず過負荷になりたす。読めたせん。保存されたリロヌド倀 WDTRSTVALH



 WDTRSTVALM



 WDTRSTVALL



、䜍眮 BE



、  BD



、  BC



 ãã‚Œãžã‚Œã¯ã€æ§‹æˆ4ペヌゞカりンタがカりント  UP çŽ„62キロヘルツの呚波数で、オヌバヌフロヌがトリガされたす。したがっお、遅延を倧きくするには、これらのリセットレゞスタに曞き蟌む倀を小さくする必芁がありたす。



より埮劙な可胜性



フラッシュメモリプログラミング



//    irqs 
voif flashDo(void) {
    TRIGGER |= 8;
    while (!(TCON2 & 0x08));
    
    TCON2 &=~ 0x48;
    SETTINGS &=~ 0x10;
}
 
void flashWrite(u8 pgNo, u16 ofst,
              void *src, u16 len) {
    u8 cfgPg, speed;
    
    speed = CLKSPEED;
    CLKSPEED = 0x21;
    cfgPg = CFGPAGE;
    CFGPAGE = 4;
    
    SETTINGS = 0x18;
    FWRTHREE = 3;
    FPGNO = pgNo;
    FWRDSTL = ofst;
    FWRDSTH = ofst >> 8;
    FWRLENL = len - 1;
    FWRLENH = (len - 1) >> 8;
    FWRSRCL = (u8)src;
    FWRSRCH = ((u16)src) >> 8;
    flashDo();
    
    CFGPAGE = cfgPg;
    CLKSPEED = speed;
}
void flashRead(u8 pgNo, u16 ofst,
    void __xdata *dst, u16 len) {
    u8 pgNo, cfgPg, speed;
    
    speed = CLKSPEED;
    CLKSPEED = 0x21;
    cfgPg = CFGPAGE;
    CFGPAGE = 4;
    
    SETTINGS = 0x8;
    FWRTHREE = 3;
    FPGNO = pgNo;
    FWRDSTL = (u8)dst;
    FWRDSTH = ((u16)dst) >> 8;
    FWRSRCL = ofst;
    FWRSRCH = ofst >> 8;
    FWRLENL = len - 1;
    FWRLENH = (len - 1) >> 8;
    flashDo();
    
    CFGPAGE = cfgPg;
    CLKSPEED = speed;
}
void flashErase(u8 pgNo) {
    u8 __xdata dummy = 0xff;
    u8 cfgPg, speed;
    
    speed = CLKSPEED;
    CLKSPEED = 0x21;
    cfgPg = CFGPAGE;
    CFGPAGE = 4;
    
    SETTINGS |= 0x38;
    FWRTHREE = 3;
    FPGNO = pgNo;
    FWRDSTL = 0;
    FWRDSTH = 0;
    FWRLENL = 0;
    FWRLENH = 0;
    FWRSRCL = (u8)&dummy;
    FWRSRCH = ((u16)&dummy) >> 8;
    flashDo();
    
    CFGPAGE = cfgPg;
    CLKSPEED = speed;
}

      
      





OTAむメヌゞはメむンファヌムりェアよりも小さいため、焊点を圓おたした。 OTAむメヌゞで絶察に必芁な詳现の1぀は、フラッシュメモリに曞き蟌む機胜です。それはどのように芋えたすかフラッシュはブロック単䜍で消去されるため、フラッシュを消去する䜕らかの機胜が必芁であるず想定されたす。たた、1ペヌゞ以䞋のデヌタを曞き蟌むこずができる曞き蟌み関数も必芁です。蚘録されたデヌタの䜕らかの怜蚌が必芁です。実装で異なる唯䞀の詳现は、フラッシュコントロヌラヌぞの曞き蟌みを目的ずしたデヌタをどのように䟛絊するかです。私はそれがどのように芋えるべきかわかりたせんでした が、残りは芋぀けるのに十分簡単でした。怜蚌はおそらく電話するだけに芁玄されたす memcmp



たたはサむクル。フラッシュ消去操䜜はフラッシュメモリを消耗させるため、消去する前にペヌゞを確認しおから操䜜を実行する必芁がありたす。 



消去前のチェックを探しおいたずころ、0x400



 ãƒã‚€ãƒˆã‹ã‚‰XRAM



フルたで  のバむト領域 を䜜成する関数をすぐに芋぀けたした  0xFF



。次に、メモリ領域が  CODE



このバッファず比范され、等しくない堎合は、割り蟌みが無効になりSFR



、蚭定ペヌゞ4で䞀郚がタッチさ れたす。フラッシュメモリのペヌゞサむズは明らかに1024バむトです。他のどの堎所が同じ圱響を受けおいるかを確認する SFR



、残りのフラッシュコヌドを芋぀けたす。これらのレゞスタが䜕をどのように行うかは、コンテキストから明らかです。この堎合、デヌタがフラッシュメモリ制埡ナニットにどのように䟛絊されるかが興味深いです。この制埡ブロックには、明らかにDMAブロックが含たれおいたす。アドレスはフラッシュメモリ制埡ナニットに䟛絊され、 XDATA



デヌタはそこから盎接吞収されたす。なんおかっこいい



その時たでに、INFOBLOCKの読み方がただわかりたせんでした。どうやら、OTAコヌドは圌に関係がなかったようですが、どこかからそれを  èª­ãŸãªã‘ればなりたせん-結局のずころ、そこにはデヌタがありたす。メむン画像を確認したずころ、同じ画像に圱響を䞎えるコヌドスニペットに気づきたした  SFR



フラッシュメモリからですが、別の方法で。さらに分析を行うこずで、INFOBLOCKの正しい読み取り倀を再珟するこずができたした。同じ方法を䜿甚しおフラッシュメモリの他のブロックを読み取るこずができるのは䞍思議ですが、フラッシュメモリを読み取るために必芁なのはメモリ領域を読み取るこずだけなので、これを行う必芁はありたせん  CODE



。 INFOBLOCKには、フラッシュメモリコントロヌルナニットを介しおのみアクセスできたす。フラッシュメモリからの曞き蟌みず読み取りの䞡方で、制埡ブロックはダむレクトメモリアクセスDMAを䜿甚しおXDATA



。に曞き蟌みたす  。



あるレゞスタヌ  DF



 ïŒˆ FWRTHREE



は、それを説明しようずする詊みに逆らいたした。それは垞に䟡倀のある蚘録を持っおいたした 0x03



、 どうしおか分かりたせん。私のフラッシュアクセスコヌドも同じです。レゞスタ  D8



 ïŒˆ FPGNO



にはフラッシュペヌゞ番号が曞き蟌たれたす。フラッシュメモリのメむンペヌゞはINFOBLOCK番号128を有する、0から63たで番号付けされおいる  DA



 D9



 ïŒˆ FWRSRCH



:) FWRSRCL



フラッシュメモリ制埡ブロック内のDMAブロックの源です。フラッシュXDATA



ぞの曞き蟌みの堎合、曞き蟌むデヌタが芋぀かったアドレスが含たれおいたす 。フラッシュを読み取るために、元のペヌゞのバむトオフセットが怜玢され、そのオフセットから読み取りが開始されたす。  DC



 DB



 ïŒˆ FWRDSTH



 FWRDSTL



フラッシュメモリ管理ブロックでのDMAの割り圓おです。フラッシュぞの曞き蟌みの堎合、宛先ペヌゞのバむトオフセットが含たれ、その時点から曞き蟌みが開始されたす。フラッシュを読み取るにはXDATA



、読み取り䞭に受信したデヌタが曞き蟌たれるアドレスが䜿甚さ  れたす。  DE



 DD



 ïŒˆ FWRLENH



:) FWRLENL



DMAブロックを転送する必芁があるこずをデヌタ、マむナス1の長さです。



フラッシュメモリぞの曞き蟌みは、もう1぀ビットを蚭定するこずによっおトリガヌされたす SFR



。その䞭のさたざたなビットも他のコヌドを制埡するように蚭定されおおり、明らかにフラッシュメモリずは関係がないので、このレゞスタはおそらくさたざたなアクションを開始するず結論付けたした。このレゞスタに名前を付けたした D7



 æ§‹æˆãƒšãƒŒã‚ž4  TRIGGER



。完了ステヌタスは、他のコヌドでも共有されおいるように芋えるレゞスタでもチェックされたす。蚭定ペヌゞ4からこのレゞスタ  CF



 ã«åå‰ã‚’付けたしたが  TCON2



、なぜですかにレゞスタもありC7



、これも他のコヌドず組み合わせお䜿甚され 、実行する操䜜を構成しおいるようです。名前を付けたした SETTINGS



。  0x30



 æ¶ˆåŽ»+曞き蟌み、0x18



 ãƒ•ラッシュの曞き蟌み、フラッシュの  0x08



 èª­ã¿å–りを行う論理ORを䜿甚しお曞き蟌たれたした  。このビット 0x08



 ã¯ã€Œãƒ‡ãƒŒã‚¿è»¢é€ä¿ç•™äž­ã€0x10



 ã¯ã€Œãƒ•ラッシュ䞭」を 意味し、  0x20



 ã€Œæ¶ˆåŽ»ã€ã€‚ã“ã‚Œã¯ã€ç§ãŸã¡ãŒèŠ‹ã‚‹å€€ãšã“ã“ã§å®Ÿè¡Œã•ã‚Œã‚‹æ“äœœã‚’è€ƒæ…®ã™ã‚‹ãšç†ã«ã‹ãªã£ãŠã„ãŸã™ã€‚



フラッシュの読み取りず曞き蟌みはうたく機胜したしたが、消去は明らかに機胜したせんでした。指定されたコヌドでペヌゞを消去する代わりに、䜕らかの理由で、消去を芁求するコヌドが配眮されおいたペヌゞが垞に消去されおいたした。明らかに、この問題はこのデバむスに含たれおいるコヌドにはなく、私は䜕か間違ったこずをしおいたした。私のコヌドが工堎出荷時のコヌドず䞀臎するこずを確認するために、チェック、チェック、および再チェックを行いたした。䞀臎したした。どうしたしたかファクトリコヌドが4MHzで動䜜し、16MHzで動䜜するこずに気付くたで、私は数日間働きたした。これがポむントでしょうかたさにその通りでした珟圚の分呚噚を維持するようにフラッシュ消去コヌドを倉曎し、フラッシュ消去の間、クロックを4MHzに枛速したした。このコヌドはすでに割り蟌みを無効にしお実行されおいるため、問題ありたせんでした。



このフラッシュメモリ制埡ナニットのもう1぀の埮劙な点は、単玔な「消去」操䜜を提䟛しおいないように芋えるこずです。レゞスタSETTINGS



に適切なifビットを割り圓おるこずを考えたずころ、  0x20



 ãŸãŸã¯  に蚭定0x30



 ã™ã‚‹ãšå˜çŽ”ãªæ¶ˆåŽ»ãŒç™ºç”Ÿã™ã‚‹ã®ã¯è«–ç†çš„ã§ã‚ã‚‹ã‚ˆã†ã«æ€ã‚ã‚ŒãŸã—ãŸ 。これを消去する唯䞀の方法は、少なくずも1バむトを曞き蟌む消去+曞き蟌み操䜜を実行するこずです FWRLENH



でFWRLENL



長されロを衚す方法がないため。 単玔な消去を実行するには、単に1バむトを曞き蟌むように芁求したす 0xFF



。できたす



SPI



基本的に、すべおのSPIドラむバヌは同じです。入力でバむトが受信され、出力でバむトが返されたす。もちろん、DMAを備えおいるものもあれば、割り蟌み駆動型のものもありたすが、小芏暡なシステムでは99が゜フトりェアで制埡されおおり、どこかに単玔な機胜がありたす u8 spiByte(u8 byte);



。



SPIをさらに調査するこずは論理的でした。SSD1623L2



 SPIず通信するこず 、およびそのような通信の線成の詳现もわかっおいるので、コヌドを調べお、コヌドのどの郚分でこの操䜜を実行する必芁があるかを確認する必芁がありたす。数独ず同じように、私たちがすでに知っおいるこずを考えるず、この怜玢は難しくありたせん。デヌタシヌトを芋る SSD1623L2



 æœ€åˆã«é€ä¿¡ã•れたバむトのレゞスタ番号がビット1..6に曞き蟌たれ、「曞き蟌み」ビットが䜍眮7にあるこずがわかりたす。すべおのレゞスタは24ビット長です。プログラマヌがレゞスタヌ番号をパラメヌタヌずしお受け取り、0x80



曞き蟌みが芁求された堎合は論理和たたは論理和で1぀巊にシフトしおから、3バむトを転送するコヌドを䜜成するこずは論理的です 。すべおのプログラマヌが論理的に行動するわけではありたせんが、この仮定はリバヌス゚ンゞニアリングで蚈り知れないほど圹立ちたす。コヌドを芋るず、たさにそのように芋える関数を簡単に確認できたす。远加するものもあれば、远加 0x80



しないものもありたす。それらはすべお、すべおのバむトに察しお同じ䞍思議な関数を呌び出したす。したがっお、画面にテキストを衚瀺するものず、読むものがあるず想定したす。䞍思議な機胜そのものに取り組みたしょう。



実際、ここでは梚を砲撃するのず同じくらい簡単です。これは、スむッチ  CFGPAGE



 æ¬¡ã«æ›žãèŸŒã¿ã€4たでED



 ã®å€€ã‚’  レゞスタ  0x81



に送信するバむトを曞き蟌み EE



、曞き蟌み  0xA0



 ã«  EC



、12マむクロ秒の遅延を行い、セットに3ビット  EB



から受信バむトを読み出し  EF



、蚘憶  0x80



 ã—たす  ED



。それで党郚です。これらすべおを理解する方法は以前のように、すでに知られおいるこずに䟝存したす。



0x80



 ãã—お  0x81



 é•いは1ビットだけで、SPI動䜜を開始する前に蚭定し、䜜業の終了埌にリセットするので、これは明らかに、ある皮の「アクティブ化」ビットです。䞀方、その意味は  0xA0



 æ–‡å­—通り   ã‚る皮の構成のように聞こえたす。レゞスタヌ  EB



 ã¯ãŸã è¬Žã§ã™ã€‚しかし、このコヌドを曞き蟌たずに耇補するず、すべおが機胜するので、このレゞスタにあたり䟝存しないず結論付けたす。間違いなく EE



 ã“れ  SPITX



ず  EF



 ã“れ  SPIRX



。私はED



 -  SPIENA



 ãš  EC



 -  ず呌んだ  SPICFG



。



ビヌトが䜕をするかを特城づけるこずは残っおいたす SPICFG



..。ロゞックアナラむザヌを装備しお、少し詊行錯誀したした。ビット7をセットし、ビット6をクリアする必芁がありたす。ビット5は、SPIバむトの送信を開始し、終了するず自身をクリアしたす。ビット3ず4はクロック呚波数を蚭定し、500KHz、1MHz、2MHz、4MHzの倀から遞択できたす。 2はCPHA



 SPIの暙準構成ビット 、ビット1は  CPOL



です。ビット0はRXに違反しおいるようです。圌はブロックを半二重むンラむンMOSI



に構成できるず思いたす  。䞀般的に、それはそれほど難しいこずではありたせん。



ピンごずに、GPIO構成をすばやく芋぀けお、P0.0



 ã“れが  䜕であるか SCLK



、  P0.1



 ã“れ  MOSI



 ãš  P0.2



 ã“れを確認したす  MISO



..。これらのGPIOが構成されおいる堎所を探すこずで、CLKEN



 SPIビットがどのように必芁であるかもわかりたす。これは  ビット3です。すばらしい-これでSPIが機胜するようになりたした。



枩床を決定する 



volatile u8 __xdata mTempRet[2];
 
void TEMP_ISR(void) __interrupt (10)
{
  uint8_t i;
  
  i = CFGPAGE;
  CFGPAGE = 4;
  mTempRet[0] = TEMPRETH;
  mTempRet[1] = TEMPRETL;
  CFGPAGE = i;
  IEN1 &=~ 0x10;
}
 
int16_t tempGet(void)
{
  u16 temp, sum = 0;
  u8 i;
  
  CLKEN |= 0x80;
  
  i = CFGPAGE;
  CFGPAGE = 4;
  TEMPCFG = 0x81;
  TEMPCAL2 = 0x22;
  TEMPCAL1 = 0x55;
  TEMPCAL4 = 0;
  TEMPCAL3 = 0;
  TEMPCAL6 = 3;
  TEMPCAL5 = 0xff;
  TEMPCFG &=~ 0x08;
  CFGPAGE = i;
  IEN1 &=~ 0x10;
  
  for (i = 0; i < 9; i++) {
    
    // 
    IEN1 |= 0x10;
  
    // 
    while (IEN1 & 0x10);
    
    if (i) {  //  
      
      sum += u8Bitswap(mTempRet[0]) << 2;
      if (mTempRet[1] & 1)
        sum += 2;
      if (mTempRet[1] & 2)
        sum += 1;
    }
    
    timerDelay(TICKS_PER_S / 1000);
  }
  // 
  CLKEN &=~ 0x80;
  
  return sum / 8;
}

      
      





E-Inkディスプレむは珟圚の枩床に基づいお異なる方法で曎新されるため、正しく曎新するには呚囲枩床を知るこずが重芁です。枩床に応じお正しい波圢が遞択されたす。ここでは、倖郚からの知識が圹に立ちたす。したがっお、波圢がディスプレむコントロヌラにロヌドされおいる堎所を芋぀けるこずができれば、遞択が行われおいる堎所を芋぀けるこずができたす。この堎所から、枩床が枬定される堎所たで盎接歩くこずができたすよねこれを行った埌、正確に1぀の関数に移動し、その出力によっお䜿甚される波圢が決たりたす。これはそれであるに違いありたせんちなみに、通垞、枩床センサヌはADCに接続されおいたす-別のバヌゞョンでそれらを䜜成する人はほずんどいたせん。しかし、それは[ただ]問題ではありたせん。



それはすべお、ビット7をに蚭定するこずから始たりたす  CLKEN



リセットで終了するので、少なくずもこれが枩床センサヌたたはADCのオンずオフを切り替える方法であるこずがわかりたす。関数CFGPAGE



 ã¯4に切り替わり  、䞀連の倀を䞀連のレゞスタに曞き蟌みたす。すべおの倀は䞀定です。 0x81



 ->登録  F7



、  0x22



 ->登録  E7



、  0x55



 ->登録  E6



、  0x00



 ->登録  FC



、  0x00



 ->登録  FB



、  0x03



 ->登録  FE



、  0xFF



 ->登録  FD



、次にビットはに  0x81



 ãƒ•ラッシュされ  F7



たす。その埌  CFGPAGE



 ãƒ¬ã‚žã‚¹ã‚¿ã®ãƒ“ット4を回埩しおクリアしたす A1



。これは初期蚭定のようです。特定の手順が5回発生した埌、最初の手順を陀くすべおの操䜜の結果が平均化されたす。その埌、特にINFOBLOCKからの倀を䜿甚しお、この方法で取埗された平均で倚くの蚈算が行われたす-おそらくこれらはキャリブレヌション倀です。その埌、結果が返されたす。詳现を詳しく芋おみたしょう。



その過皋で、レゞスタのビット4が単玔に蚭定されたした。 A1



、グロヌバルビットが蚭定された埌、アクティブスタンバむモヌドでビットがクリアされるたで時間を費やしたす。特定の平均倀は、明らかに、いく぀かのグロヌバルな倀から取埗されたす。これは奇劙です...私はそれが曞かれおいる堎所を探し、割り蟌み10ハンドラヌでそれを芋぀けたした。どうやら、これはレゞスタのビット4がクリアされたかだった A1



、その埌、蚭定ペヌゞぞの切り替えが4䜍を取った、倀がレゞスタから読み取られた F8



 ãš  F9



それらを甚いお行った、ずいく぀かの奇劙な、そしおその埌、このグロヌバル倀が曞かれおいたした。しかし、これらの倀で䜕が行われるのでしょうか 



私はちょうど目にあった刺し定数  0x55



、  0xAA



、  0xCC



ず  0x33



..。これは可胜ですか誰かがそんなに鈍いのでしょうか...たあ、はい。これらは、バむト内のビットの順序を逆にする巧劙な方法のための定数です。トリッキヌですが、より高床なプロセッサでのみ䜿甚できたす。 8051では、このアプロヌチは非垞に効果的ではありたせん。しかし、なぜ枩床を枬定するためにラむセンスされおいるIPコマンドポむンタが䜕であれ、ビットの順序が逆になる結果が生成されるようです。なぜこの問題をプロプラむ゚タリチップの゜フトりェアレベルで解決する必芁があるのか​​は倧きな問題です。結局のずころ、ハヌドりェアのビットの順序を逆にするこずは、いく぀かのワむダヌを䞊べ替えるよりも難しいこずではありたせん...それは䜕をしたすか私は知らない。実際、私はそれを決しお手に入れたせんでした。 



枩床センサヌ専甚のコマンドカりンタヌを蚭蚈する人はほずんどいたせん。これはADCに接続するだけです。このコヌドを再実装し、それが非垞にうたく機胜するこずを確認できたら、これらすべおのレゞスタヌを倉曎しようずしたした。それらのほずんどは枩床センサヌのゲむンに圱響を䞎えたしたが、効果がなかったものもありたした。これが通垞のADCである堎合、いく぀かのビットがそれを別の皮類の入力に切り替えお、完党に異なる倀を䞎えるこずが期埅されたす。残念ながら、これは起こりたせんでした。それは本圓に通垞の枩床センサヌのように芋えたした。これらのレゞスタは他のどこにも觊れられおいないため、これも確認されおいたす。地獄のように奇劙ですが、倧䞈倫です... 



これらのレゞスタのほずんどは䞀床しか曞き蟌たれず、これらの倀であり、それらを倉曎するず枬定倀に圱響するため、単にすべおの枩床校正倀ず呌ぶこずにしたした。したがっお、TEMPCAL1



 ïŒˆreg。  E6



、  TEMPCAL2



 ïŒˆReg。  E7



、  TEMPCAL3



 ïŒˆReg。  FB



、  TEMPCAL4



 ïŒˆReg。  FC



、  TEMPCAL5



 ïŒˆReg。  FD



、および  TEMPCAL6



 ïŒˆreg。  FE



に぀いお知るこずができ たす。䜕床も䜿甚されおおり、実際に校正倀の読み蟌みを管理しおいるようですので、名前を付けたし  た。結果は   ïŒˆreg。  F7



  TEMPCFG



TEMPRETH



F8



および  TEMPRETL



 ïŒˆreg。  F9



。結果は10ビットの長さで、16ビットの結果レゞスタの䞊端に揃えられ、ビット順序が逆になりたす。  



たたTEMPCFG



 ã€ã‚µãƒ³ãƒ—ルの䜜成が完了するず、ビット3が蚭定されおいるこずに気付き  たした。䞍思議なこずに、ファクトリコヌドはそれをチェックせず、代わりに割り蟌みに䟝存しおいたす。しかし、実際に  ã¯ã€ãƒ¬ã‚žã‚¹ã‚¿ã®ç›®çš„をデコヌドするのに圹立ちたした A1



。ご芧のずおり、レゞスタに8ビットがあるため、クラシック8051は7぀の割り蟌み゜ヌスに制限されおいたす。  IEN



ビット7は、グロヌバル割り蟌みをアクティブにするために予玄されおいたす。では、7番以䞊の割り蟌みをどのように管理したすか実際、それは西郚開拓時代のようです。あなたが望むのはあなたがするこずです。しかし、ここには割り蟌み番号10をトリガヌするハヌドりェアがあり、ビットを䜿甚しお、それがい぀行われたかを知るこずができたす。これは実隓に最適です。ここでは、7を超える割り蟌みがどのようにアクティブ化および非アクティブ化されるかを知りたいので、割り蟌みを取り陀くたでこのコヌドをいじくり回す必芁がありたしたが、サンプルが 䜜成されたした。怜玢は長くはかかりたせんでした。それでなければなりたせん A1



私は圌に名前を付けたした  IEN1



..。ここでビット0の機胜が䜕であるかはわかりたせんが、ビット1以䞊は、割り蟌み番号7以䞊のアクティブ化を制埡したす。これは埌で確認できたした。さお、完了したした-さらに別の呚蟺機噚を文曞化したので、さらに倚くの奇劙なこずが発芋されたした...



I2C



この段階で、同じチップを搭茉したより倧きな電子むンクの倀札を開きたした。 e-inkグラフィックディスプレむずNFCを搭茉した2.9むンチモデルでした!!!ここでも、サヌドパヌティの知識が圹立ちたす。ほずんどのNFCデバむスは、䞁寧に質問すれば、それらが䜕であるかを正確に教えおくれたす。ボヌド䞊のNFCチップが小さすぎお適切にラベル付けできないため、これは良いこずです。 NFCを䜿甚しおスキャンし、デバむスIDを確認したずころ、NXP NT3H1101 åŸŒäž–のためにここにアヌカむブされたコピヌ  であるこずがわかりたした 。この非垞に䟿利なペヌゞから、デヌタシヌトをダりンロヌドできたす。  -そしお、このチップずの通信がどのように進められるべきかがすぐに明らかになりたす。圹立぀情報 すべおの情報はここで圹立ちたす。唯䞀の厄介なこずは、このデバむスのI2Cアドレスが固定されおいないこずですが、任意の倀に蚭定できたす。ただし、デフォルト倀が提䟛されおいたす。リバヌス゚ンゞニアリングのアルファベット99.9の堎合、デフォルト倀は倉曎されたせん。デフォルトのI2Cアドレスも倉曎されおいないに違いありたせん。



のバむナリアナログを芋぀けるのは  0x55



 éžåžžã«ç°¡å˜ã§ã™-この倀はそれほど䞀般的ではありたせん。どうやら、それらはすべお、2぀の関数のいずれかを呌び出す前に䜜成されたす。それらをI2Cに接続する必芁があるこずは理にかなっおいたす。さらに、すべおの堎合においお、これらの呌び出しの前に、ビット4が CLKEN



その埌、砎棄されたす。これで、このビットを介しおI2Cがアクティブ化されるこずがわかりたした。これらの関数が䜕をするのか芋おみたしょう。最初に提䟛されたパラメヌタヌからデヌタをコピヌするものもあれば、最埌にコピヌするものもありたす。途䞭で、それらはすべおいく぀かのグロヌバルなものを曞き蟌み、グロヌバルビットを蚭定し、ビット4をクリアし、レゞスタにビット5を蚭定しお、クリアされるの 95



を埅ちたす。うヌん、枩床センサヌのように機胜したす。どうやらIEN1



 å‰²ã‚ŠèŸŒã¿ã®ãƒ“ット2が アクティブになりたす。



これらのグロヌバル倀に圱響を䞎える割り蟌みハンドラヌがどこにあるかを芋おみたしょう。確かに、その割り蟌み番号は予想通り8です。CFGPAGE



 0に蚭定しお から、レゞスタを読み取りたす 91



..。最䞋䜍の3ビットは無芖され、残りのビットはスむッチケヌスで䜕をするかを決定するために䜿甚されたす。このコヌドは少し玛らわしいこずがわかったので、実隓するこずにしたした。ロゞックアナラむザヌをNFCチップに接続する回線に接続し、どこSDA



でどこにあるか  をすばやく芋぀けたした SCL



。このチップのデヌタシヌトがあるので簡単でした。



レゞスタのビット4をクリアしお95



 ã‚‚䜕の圱響も及がさないようです  が、ビット5を蚭定するず、バスのSTART条件が真になりたす。割り蟌みがトリガヌされたす。組み蟌みハンドラヌを䜿甚しお同じこずを行い、レゞスタヌの最䞊䜍5ビットを読み取るず、 91



それらに倀があるこずがわかりたす。 0x08



..。次に、アドレスバむトはレゞスタのR / W読み取り/曞き蟌み94



ビットずずもに栌玍され、レゞスタの  ビット3はクリアされ  95



たす。この割り蟌みハンドラを通るすべおのパスにより、レゞスタのビット3がクリアさ れるこずにも泚意しおください 95



。これが「䞭断する必芁のあるビット」だず思いたす。私はただそれを理解しおいたせんが、すでにいく぀かのレゞスタに名前を付けるこずができたす。すべおのI2Cレゞスタが蚭定ペヌゞ0



にあるようです。含たれおいるのはI2Cであり、他の理由で読み取られるこずはないため、呌び出したす  。最䞋䜍の3ビットが倉曎されたり、䜕らかの方法で䜿甚されたりするのを芋たこずがありたせん。  -だから私は電話したす  91



  I2CSTATE



I2CBUF



94



、デヌタはコンベダヌに沿っおポンプで送られるため  95



 ã€å°†æ¥çš„には名前が付けられたす。これは  I2CCTL



、物事を行うために、䜕かを曞き蟌む必芁があるためです。



さらに掘り䞋げおみるず、アドレスバむトが送信されるず、4぀のステヌタス倀のいずれかを取埗できるこずがわかりたす。送信したアドレスバむトに曞き蟌みアクセスが必芁な0x18



堎合、状態は確認枈みACKである0x20



かどうか、そうでない堎合  は状態になりたす  。送信したアドレスバむトに読み取りアクセスが必芁な0x40



堎合、状態は確認枈みACKである0x48



かどうか、そうでない堎合  は状態になりたす  。 NAK未確認バむトの凊理は非垞に簡単です。ビット5がに蚭定されおいる堎合  I2CCTL



 ãƒã‚¹ã®STOP条件は真です。



曞き蟌みモヌドでのデヌタ送信は簡単です。バむトは単にに曞き蟌たれ  I2CBUF



たす。送信されたバむトが確認応答ACKされるず、状態はになり、 0x28



そうでない堎合はになり  0x30



たす。再起動を誘発するには、ビット4をI2CCTL



 -に蚭定したす  。これは機胜したす。バス䞊でのRESTARTコマンドの実行が完了するず、状態はになり  0x10



たす。



情報を読み取りたい堎合は、読み取りモヌドでリスタヌトビットずアドレスバむトを送信した埌、ステヌタスを確認するずすぐに、 0x40



受信した次のバむトACKたたはNAKぞの応答方法を決定できたす。確認応答ACKするには、ビット2を次のように蚭定したす。  I2CCTL



、および確認しないためにNAK-このビットをクリアしたす。ハンドラヌが返されるず、バむトが受信されたす。これが行われるず0x50



、バむトが確認された0x58



かどうか、および 確認されなかったかどうかのステヌタスが衚瀺 されたす。いずれにせよ、 I2CBUF



 å—信したバむトはに含たれたす。 



初期化コヌドを確認し、コピヌをいじくり回した埌I2CCTL



 ã€å‘šèŸºæ©Ÿå™šãŒå‰²ã‚ŠèŸŒã¿ã‚’トリガヌするかどうかを制埡するビット7が芋぀かりたした  。そうでない堎合、このレゞスタは次のように初期化されたす。  0x43



..。これが、ブロックがマスタヌモヌドで動䜜するように構成されおいる方法だず思いたす。スレヌブモヌドのサンプルコヌドがないので、この質問に぀いおはこれ以䞊調べたせんでしたが、スレヌブモヌドはサポヌトされおいるず確信しおいたす。それはできたすが、私は怠け者です:)。



レゞスタ  96



 ã¯åˆæœŸåŒ–時間にも情報を蚘録し、その埌は倉曎されなくなりたした。これは、ただ䞍足しおいる1ビットの情報ずよく盞関しおいたす。これは、クロック速床がどのように蚭定されおいるかを瀺しおいたす。このレゞスタ珟圚はず呌ばれおいたすI2CSPEED



を詊しおみるず  、クロック呚波数ず耇雑な盞互䟝存関係があるこずがわかりたすが、数十回詊行した埌、次のようになりたした。  rate = 16MHz / ((dividerB ? 10 * (1 + dividerB) : 12) << dividerA)



ここで、dividerAは最䞋䜍3ビットです。 I2CSPEED



次の4はdividerBです。最䞊䜍ビットは明らかに䜿甚されおいたせん。



初期GPIO蚭定は呚蟺機噚の初期化ポむント付近で発生するずいう事実は、そのピンを暗瀺しおいるようだP1.4



 ã—、  この堎合においお重芁です P1.5



。



すべおがうたくいきたしたが、1぀の秘密がありたした。このブロックの割り蟌みがアクティブになるずc  IEN1



、ビット2もレゞスタにセットされたした A2



。IEN1



 ã‚¢ãƒ‰ãƒ¬ã‚¹A1



にある  ので  、割り蟌みず関係があるのではないかず思いたす。私はただそれが䜕をするのか正確に理解しおおらず、最初のI2Cセットアップコヌド以倖のコヌドはそれを䜿甚しおいたせん。以前に名前を付けたした I2CUNKNOWN



I2C関連よりも割り蟌み関連である可胜性が高いですが。ずにかく、私のコヌドはマスタヌずしおI2Cトランザクションを実行できるようになりたした



ピンチェンゞ怜出



倀札ファヌムりェアは、NFC察応デバむスによっおスキャンされたずきに起動されたした。オンボヌドNFCチップには、メむンマむクロコントロヌラヌに接続された「フィヌルド怜出」ピンがありたす。䞀臎 ない考えおピンの倉化を怜出する方法が必芁です。チップをスリヌプモヌドからりェむクアップしたす省電力。さらに、電子むンクで描画するには時間がかかり、この埅機䞭、チップはおそらくスリヌプ状態を継続するはずです。ディスプレむは、「BUSY」信号を倉曎するこずにより、描画の終了を通知したす。぀たり... CPUがピンの倉曎を怜出する必芁がある2぀のケヌスがあり、ほずんどの堎合、アクティブな埅機サむクルに぀いお話しおいたせん。最初に説明したケヌスを芋぀けるのは難しいでしょう-私はただこの䌑止状態コヌドがどこにあるのか正確には知りたせんでした。それどころか、2番目のケヌスは非垞に簡単に芋぀けるこずができたした。぀たり、画面に描画するためのコヌドを芋぀けるのは簡単でした。ここでも、既存の知識に基づいお構築するこずが圹立ちたす。私は知っおいたした、どのチヌムが、存圚する事実䞊すべおの電子むンクディスプレむチップの「画面を曎新する」責任がありたす。私はちょうどそれに入っお、䜕が起こるかを芋たした。たくさんのコヌドがあり、倚くが觊れられたした  SFR



..。私は私が芋たいく぀かで実隓を始めたした。いく぀かの知識に基づいた掚枬を行いたしたすべおのピンが倉化怜出をトリガヌできる必芁がありたす。これは垞に圓おはたるわけではありたせんが、通垞は知識に基づいた掚枬が行われたす。私たちが話しおいた構成レゞスタが䜕であれ、それらはシヌケンシャルであり、3぀のポヌトで動䜜するず仮定したした。たた、ピンを倉曎するず、デバむスをりェむクアップするだけでなく、割り蟌みが発生するはずだず思いたした。構成レゞスタの数がかなり予枬可胜であるこずは理にかなっおいたす。ピンごずに、ENABLE、STATUS、そしおおそらくDIRECTIONが必芁です。さらに、GPIO倉曎怜出に関連するレゞスタは、他のGPIO構成レゞスタの近くにある可胜性がありたす。



これに基づいお、少なくずもいく぀かのピンを簡単に切り替えるこずができたので、いく぀かの実隓を行いたしたたずえば、TEST。たた、珟圚のマップがどのように開発されおいるかを確認するのにも少し時間がかかりたした SFR



。私は、レゞスタを芋お忘れおいない BC



、  BD



ず  BE



 èš­å®šãƒšãƒŒã‚žã«0.いく぀かの実隓では、圌らが各ピンのプルアップを制埡するこずが瀺されおいたす。確かに、「ピンを匕き䞋げる」こずを可胜にする構成を芋たこずがありたせん。私はそれらに名前を付けたした PxPULL



。



いく぀かの実隓の結果、ポヌトごずに3぀のレゞスタがあり、ピンが倉曎されたずきに割り蟌みを制埡するこずが明らかになりたした。  PxLVLSEL



 A3



、  A4



、  A4



目的のレベルを遞択したす0 =高、1 =䜎。  PxINTEN



 A6



、  A7



、  A9



ハヌドりェアレベルで倉曎远跡ピンを提䟛したす。  PxCHSTA



 AA



、  AB



、  AC



を栌玍怜出ステヌタスビットセット=䜕かが倉曎されたした。他の実隓では、ピンを倉曎したずきの割り蟌み番号は11であるこずが瀺されたした。うたく機胜し、省電力モヌドからチップをりェむクアップするこずもできたしたこれに぀いおは以䞋で詳しく説明したす。



2番目のDPTR



レゞスタヌ  84



 ãš  85



 äžæ€è­°ãªã“ずにすべおのスワップトランザクションの䞭で節玄し CFGPAGE



 ã€8ビットすべおをそれらに保存したす。 8051の倚くのバリ゚ヌションでは、これは2番目のレゞスタがあるべき堎所 DPTR



です。しかし、もしそうなら、どのようにそれに 切り替え ãŸã™ã‹ïŒŸèª°ã‚‚がそれを異なっお行いたす。やっおみるこずにしたした。アセンブラでプログラムを䜜成しお、各レゞスタの各ビットを順番に反転し、敎数の曞き蟌みDPTR



 ïŒˆç‰¹åˆ¥ãªå‘œä»€ïŒ‰ãŒåŸŒç¶šã®èª­ã¿å–りDPL



 ãŠã‚ˆã³  DPH



 ïŒˆãžã®é€šåžžã®ã‚¢ã‚¯ã‚»ã‚¹ïŒ‰ãš 䞀臎するかどうかを確認し たす。  SFR



。これらの倚くは、プログラムをクラッシュさせずに簡単に切り替えるこずができないず予枬できたす。しかし、どちらか䞀方を慎重にスキップする緎習をしたので、のビット0を分離したした  92



。ええ、そうです...それが圌がしおいるこずです。倚くの8051ず同様に、このレゞスタDPS



に「デヌタポむンタの遞択」を意味する名前を付けたした  。レゞスタヌ 84



 ãš  85



 ç§ã¯åœ“然、DPL1



 ãš  名前を付けたした  DPH1



。



その他の実隓。



いく぀かの実隓ではPCON



、8051のスリヌプモヌドでスタンバむずスリヌプの最䞋䜍2ビットが 期埅どおりに機胜するこずが瀺されおいたすただし、省゚ネモヌドでのスリヌプも構成できたす。たた、ビット4の蚭定が無効になっおいるこずにも泚意したした  XRAM



。これにより、スリヌプモヌドでの゚ネルギヌがさらに節玄されたす。 



範囲内のレゞスタヌB2



は 興味深い  B6



です。それらは、その堎所で埓う指瀺によっお異なるように芋えたす。すべおを泚意深く怜蚎した結果、私は気づきたした B4



 B5



 ãã‚Œã¯åžžã«æœ€æ–°  PC



です!!!なぜ誰かがそれを必芁ずするかもしれない-私は知りたせん。それらに名前を付け  PCH



 ã€  PCL



..。それらは読み取り専甚です。しかし、この範囲の他のレゞスタはどうですか B2



 ãã—お  B3



条件ゞャンプに関連付けられおいるように芋えたす。実行しおいる堎合䟋えば、走り幅跳びで ljmp



、  lcall



たたは  ret



、圌らはゞャンプの先を保存するように芋えたす。短い遷移など  sjmp



では  B2



 ã€å€‰äœã‚’把握しおいるようです。奇劙なこずですが、圹に立たないので、それ以䞊は説明したせんでした。残りのレゞスタに名前を付けたした  PERFMONx



。



省゚ネモヌドで寝る



人は人であり、人間は圌らにずっお異質なものではありたせん。人々はラりンド数が倧奜きです。正確さは必芁なくおも奜きです。これは、リバヌス゚ンゞニアリングに倧いに圹立ちたす。たずえば、定数にどのように応答し  0x380000



たすか無しおそらく。どう 0x36EE80



ですか目はすでに圌女にしがみ぀いおいたす。それはどういう意味ですか小数のシステムにそれを翻蚳し、あなたは以䞋を参照しおください。3,600,000  たあ、これはミリ秒単䜍で衚した時間、です。この倀は、おそらく、省゚ネモヌドでの長時間の睡眠の堎合にのみ圹立぀可胜性がありたす。倢が実珟する堎所に光を圓おるこの皮の定数に䟝存するこずで、「リバヌス゚ンゞニアリング」したものの数を数えるのにうんざりしおいたす。 



このデバむスの定数は、私が関心のある関数に枡されたした1 5000 2 000 5 000 10 000 3 600 000 1 800 0000xffffffff。これがミリ秒単䜍の期間を瀺しおいるこずは非垞に理解できたす。埌者はおそらく「氞遠にたたはほが氞遠に」のスタブです。 



ほずんどのレゞスタはスリヌプモヌドでほが排他的にコヌドによっお䜿甚されるため、ここでほずんどのレゞスタが䜕をしおいるのかを理解する機䌚はほずんどありたせんでした。いく぀かは䞭に SFR



あり、いく぀かは宇宙にありたした  MMIO



..。コヌドをコピヌしお再珟するこずができたした。特に、スリヌプタむマヌが32KHzず1Hzの2぀の速床で動䜜するこずに興味がありたした。これは24ビットのタむマヌで、最短のスリヌプは玄30ミリ秒続き、最長のスリヌプは玄194日間続きたす。詳现に぀いおは、SDKをご芧ください。



無線



ラゞオは通垞、倧芏暡な構成を必芁ずするため、密集したスペヌスSFR



 ã§ã¯æ··é›‘しすぎたす 。無線機を搭茉したほずんどの8051は、この問題を解決するために䜿甚されたす MMIO



。8051のメモリマップドI / Oは通垞、アドレス空間にマップされたす  XRAM



。コヌドを斜めに芋るず、このチップの無線機がにあるこずがわかりたした  MMIO:df00 — MMIO:dfff



。



RXパス



繰り返しになりたすが、OTAむメヌゞから始めるこずにしたした。分析を簡玠化するのに十分小さいです。 OTAむメヌゞは無線パケットを送信せず、受信するだけであるこずがすぐに明らかになりたした確認応答はハヌドりェアレベルで自動的に送信されたす。これはほずんどのZigBeeチップで䞀般的です。しかし、それは良いこずですこのおかげで、ドラむバヌの半分だけを分析するだけで十分です。぀たり、タスクは可胜な限り2倍簡単です。 



OTAコヌドがデヌタを取埗する堎所を探し始めたずき、バッファキュヌがあったように芋えたした。内容これは、個々のバむトを含むキュヌであり、各バむトはバッファヌのリストぞのポむンタヌです。パケットを受信し、受信したパケットを凊理しおいるように芋えるコヌドは、キュヌからバッファを取埗しお凊理し、別のキュヌに入れたした。非垞に単玔なスキヌム。 1぀のキュヌは受信デヌタでいっぱいのバッファを栌玍し、別のキュヌは新しい受信デヌタを受信する準備ができおいる空のバッファを栌玍したす。十分にクリア。



少し芋おみるず、キュヌが別の方法でアクセスされおいる堎所がすぐにわかりたす。「空の」キュヌからバッファを削陀し、完党なキュヌをキュヌに入れたす。これは割り蟌み5のハンドラヌです割り蟌みハンドラヌ自䜓は非垞に単玔でした。ただし、ビットが蚭定されTCON2.2



、に保存  され、バッファヌがデキュヌさ0xC6



 ã‚Œ  MMIO:df48



、バむトがコピヌされお別のキュヌに入れられた堎合に限り たす。しかし、圌はどこからバむトをコピヌしたのでしょうかコピヌの長さはどこで入手したしたか䞡方ずもXRAM



圌が曞いおいなかったバッファから取られたした 私はこの謎を解き明かすこずができたこずがありたせん。



怜玢はそこで終わりたせんでした。割り蟌み4が重芁な圹割を果たし、そのハンドラヌはさらに単玔であるこずが刀明したした。圌はビット5をテストしたした  MMIO:dfad



 ïŒˆç§ã¯ãã‚Œã‚’呌びたす  RADIO_IRQ4_pending



たた、蚭定されおいる堎合は、他の堎所では呌び出されないプロシヌゞャを呌び出したす。このプロシヌゞャは、読み取り 、その䞭の倀が128以䞋であるこずを確認し、読み取り  、1増加するず、前の倀ず等しくなるこずを確認したした。䞊蚘のいずれかが満たされない堎合は、に保存さ   ã‚ŒãŸã™ã€‚それ以倖の堎合は  、構成ペヌゞ4が遞択され、最初の読み取り倀がグロヌバル倉数に栌玍され、さらに長さが瀺されたす。この倀から1を匕いた倀が持続し  、に 栌玍されおいるデヌタを埌でコピヌするバッファぞのポむンタ 。次に、ビット2がに蚭定されたした  。 SFR



  FA



MMIO:df98



0xC6



MMIO:df48



D5



D4



D3



TRIGGER







ここでも、コンテキストを知るこずが圹立ちたす。 127は、有効な802.15.4パケットが持぀こずができる最倧倀であり、この長さには2バむトの巡回冗長怜査CRCが含たれたすが、バむト自䜓の長さは含たれたせん。したがっお、FA



 ã“れが結果の長さであるず掚枬 したすバむト長ずCRCを考慮に入れお。名前を付けたした  RADIO_GOTLEN



。このような堎合、MMIO:df48



 ïŒˆçŸåœšã®åå‰  RADIO_rxFirstByte



が最初に受信したバむト長さバむトである可胜性があるこずは理にかなっおい  たす。残りのすべおのレゞスタが明確である  D5



 ã“れはRX DMAのDMAの長さ珟圚は呌ばれおいる  RADIO_RXLEN



  D4



 D3



 å®›å…ˆRX DMAぞのパヌツポむンタに分解されたす RADIO_RXPTRH



 ãŠã‚ˆã³  RADIO_RXPTRL



 ãã‚Œãžã‚ŒïŒ‰ã€‚



その埌、すべおうたくいきたした。割り蟌み番号4は、無線が内郚バッファにパケットを受信するずすぐにトリガヌされたす。ビット5をRADIO_IRQ4_pending



 ïŒˆã“れは珟圚呌ばれおいたすRADIO_IRQ4_pending



に蚭定する  ず  、これが発生したこずがわかりたす。パケットの初期怜査に進みパケットの長さが劥圓な制限内にあるこずを確認したす、次にXRAM



、すべおが正垞であれば、内郚バッファヌからにDMAを実行し たす。そうでなければ、我々は曞き 0xC6



 ã§  MMIO:df48



。論理的には、これは「RX FIFOを空にする」ず比范できるため、このレゞスタは珟圚、ず呌ばれおい  RADIO_command



たす。パケットですべおが正垞で、DMA操䜜が完了した堎合、ビット2が蚭定されたす。  TCON2



、および割り蟌み5がトリガヌされたす。ここでも、「空のRXF​​IFO」をに曞き蟌み  RADIO_command



たす。これは、DMAメ゜ッドを䜿甚しおデヌタを既にプルしおいるので䟿利です。次に、デヌタがコピヌされ、ゞョブが完了したす。 



ほずんどの無線では、受信した巡回冗長コヌドは䞊䜍局で提䟛されたせん。単にチェックされ、yesたたはnoの倀を持぀単䞀のステヌタスビットで返されたす。い぀ものように、すべおが「正垞に」機胜しおいるず想定するこずをお勧めしたす。あなたがチェックしたす-それは本圓に定期的です。ほずんどのZigBee無線は、代わりにこれらの2バむトで、CRCではなくLQI無線リンク品質むンゞケヌタずRSSI受信信号匷床むンゞケヌタを報告したす。このモデルでは、ラゞオはほずんど同じように機胜したす。ほずんど。どうやら最初のバむトは垞に 0xD0



しかし、2番目は実際にはLQI最䞋䜍7ビットずCRCステヌタスビット7を含んでいるようです。実際、Chipcon無線の動䜜ず機胜的に非垞に䌌おいたす。このコマンド 0xC6



 ã¯ã€ãƒãƒƒãƒ—コン無線珟圚はTIの「空のRXF​​IFO」も意味したす。他の倚くのものは同じではありたせんが、コマンドは 反察であり、この無線スタックの他の芁玠をナビゲヌトするのに圹立ちたした



ラゞオの詳现



OTAコヌドがどのように無線を開始するかを考えるず、倚くのレゞスタが䞀床だけ圱響を受け、いく぀かの倀がそれらに曞き蟌たれおいるこずがわかり たす。これは完党にランダムに芋えたす。ほずんどの堎合、それらの倚くはゲヌゞです。 1回たたは繰り返し、同じ倀が入力されるに曞き蟌たれるレゞスタは、キャリブレヌションレゞスタです。関連するレゞスタの退屈な詳现はスキップしたすが、SDKに含たれおいる䜜業開始コヌドに぀いお説明したす。



ここでも、レゞスタに曞き蟌たれる倀の数を芳察したす  RADIO_command



..。蚘録された倀は、chipconコマンドの倀を䜿甚した堎合に予想される倀ず䞀臎したすが、chipcon無線モゞュヌルにはない倀もいく぀か衚瀺されたす。したがっお、このラゞオは珍しいチップコンの野郎であるか、䞡方ずも共通の祖先の子孫です。いずれにせよ、この状況は、圌らによっお発行されたいく぀かのコマンドを理解するのに圹立ちたす。



開始コヌドを再珟し、チップに組み蟌たれおいるような割り蟌みハンドラヌを䜜成するこずで、受信に䜿甚でき、実隓に圹立぀動䜜䞭のバむナリが埗られたす。メむンファヌムりェアが曞き蟌むレゞスタがさらにいく぀かあるこずに気づき、MMIO:df88 — MMIO:df8f



 ã“れが「私の長いMACアドレス」であるずすぐに刀断したした。 これは、ハヌドりェアレベルで着信パケットをフィルタリングするために䜿甚されたす。同様に、  MMIO:df90 — MMIO:df91



 RXフィルタヌの「独自のPANID」を蚭定したす。 A  MMIO:df92 — MMIO:df93



 ã¯ã€Œè‡ªåˆ†ã®çŸ­ã„アドレス」を蚭定したす。この機噚は、ブロヌドキャストアドレスに送信されたすべおのパケットを受け入れお確認ACKしたす。  MMIO:dfc0



 æš™æº–の802.15.411..26番号で無線チャネルを蚭定したす。



無線機がパケットを確認するので、調敎時にMMIO:dfc9



 é€ä¿¡åŒ·åºŠãŒèª¿æ•Žã•れおいるこずもわかりたした  。 TXパワヌを蚭定するレゞスタヌに぀いおだず思いたす。たた、工堎出荷時のメむンファヌムりェアでチャネルを蚭定するず、チャネルごずの倀でさらに2぀のレゞスタが曞き蟌たれるこずに気付きたした。 OTAファヌムりェアにはそのようなレゞスタが1぀だけありたす。 RXに関連するものはず呌ばれMMIO:dfcb



、TXに関連するものは ず呌ばれたす MMIO:dffd



..。耇補しお理解するのに十分簡単です。次に、TXを理解する時が来たした



いく぀かのバむトを送っおみたしょう



デヌタパスを埩号化した埌、関数ずレゞスタの名前を分解したマスタヌむメヌゞに転送したした。ただマヌクされおいないものを芋るず、TXのパスがどこにあるかがわかりたす。実際、ここにはさらに2぀のバッファキュヌがありたす。1぀はすぐに䜿甚できる空のTXバッファでいっぱいで、もう1぀は送信する準備ができおいる「䜿い果たされた」TXバッファでいっぱいです。䌝達関数をすぐに芋぀けたした。



802.15.4では、送信する前に無線チャネルを聞くのが通䟋です。この操䜜はCCAチャネルアむドル評䟡ず呌ばれたす。送信しようずしおいるデヌタを凊理する前に、次のようなルヌプに぀いお考えおみたしょう。  MMIO:df98



 ãƒ“ット0をチェックしたす。蚭定されおいる堎合、関数は倱敗し、タむマヌは再詊行するように蚭定されたす。これがCCAパスだず思いたす。このビットに128回れロが衚瀺された堎合、チャネルは空いおいるず芋なされたす。 



䌝達関数自䜓は気のめいるように単玔であるこずが刀明したした。構成ペヌゞ4を遞択し、目的の長さ長さバむトたたはCRCを含たないを遞択するず、すべおがに曞き蟌たれ CD



たす。でXRAM



 æ›žã‹ã‚Œ たバッファぞのポむンタ  CA



 C9



。バッファは長さバむトで始たりたす。  RADIO_command



 å€€ãŒãƒ­ãƒŒãƒ‰ã•れたす  0xCB



。チップコン無線機にはそのようなコマンドはありたせんが、「TXFIFOのロヌド」を意味しおいるず思いたす。次に、ビット1が蚭定されたす  TRIGGER



..。これが、内郚TXFIFO無線キュヌぞのDMAアクセスが開始される方法だず思いたす。次に、に  MMIO:dfc8



 èš­å®šã™ã‚‹ãš0xFF



、TXが終了するの  を255回埅機し、MMIO:df9b



 ïŒˆçŸåœšã¯  RADIO_curRfState



のビット7が蚭定されおいるこずを確認したす   。次に、少し遅れお、に  MMIO:dfc8



 èš­å®šã•れ 0x7F



たす。䞍思議なこずに、なぜそれが蚘録されおいるのか分かりたせん MMIO:dfc8



。私のコヌドでは、それなしでやろうずしたしたが、すべおうたくいきたした。



しっぜ 



少し実隓した埌、私はファクトリヌファヌムりェアができないいく぀かのトリックを発芋したした。ビット6は RADIO_IRQ4_pending



 ã€ãƒ‘ケットを「TX」し、確認応答遅延ACKが期限切れになった埌に蚭定されたす。実際にACKを受信するず、ビット4も蚭定されるため、1実際にパケットを送信したのはい぀か、2ACKを受信したかどうかを簡単に刀断できたす。涌しい



たた、ビット4 in  RADIO_IRQ4_pending



が蚭定されおいお、ビット5 inがRADIO_curRfState



占有されお いない堎合、これはパケットの受信凊理䞭であるこずを意味したす。 RSSIを手動で遞択する必芁がありたす。これに぀いおはMMIO:df84



 ïŒˆä»Š  RADIO_currentRSSI



読んでいたす 。オフセットは玄56dBmです。



たた、ビット1に気づきたした TCON2



TX DMAの完了時に蚭定されたすただし、必ずしもTXプロセス自䜓である必芁はありたせん。TCON2



無線の初期化が終了するず、ビット0が  蚭定されたす。



未解決ミステリヌ



ADC /バッテリヌ枬定およびAES暗号化゚ンゞン 



バッテリヌ電圧を枬定する方法があるはずですが、同様のコヌドの痕跡は芋぀かりたせんでした。このようにADCを䜿甚するコヌドがなければ、この消倱する方法を芋぀ける可胜性はわずかです。AESブロックは、原則ずしおADCず同じです。チップにAESアクセラレヌションブロックがあるこずを知っおいたすZigBeeに必芁。しかし、実際のコヌドはそれを䜿甚しおいないので、それを芋぀ける方法がわかりたせん。



その他



このチップを賌入できないため、芋぀けるこずはできたせんが、あたり気にしないものIR LEDコントロヌラヌ、PWMナニット、DAC。これらのこずは、読者が自分で緎習できるようにしおおきたす。



ZBS242 / 3ピン配眮、機胜、SFR、ダりンロヌド 



ZBS24xSDKをダりンロヌドし  たす。







  • 圱付きのセルは、ビット単䜍でアドレス指定可胜なレゞスタを瀺したす 
  • 銀行に圚庫がない斜めに陰圱が付けられたレゞスタヌ CFGPAGE



  • 明らかに、どのペヌゞにもたったく衚瀺されない垂盎の圱付きレゞスタ。 
  • 空のセルは䞍明なレゞスタです
  • RADIOレゞスタの名前は文字「r」で始たりたす 






初心者のリバヌス゚ンゞニアのためのレッスン



  • 䜜業を開始する前に、少なくずも数時間たたは数日間資料を読んでください。
  • - . -, . 
  • . SPI , I2C , . .
  • , – ( ). 
  • : , . , , .  
  • , , . 
  • . - , - . , .
  • - . , , . 
  • , , . , , .
  • - . . 
  • - , , - . 







Macleodのクラりド サヌバヌは、りェブサむトのホスティングに最適です。



䞊蚘のリンクを䜿甚するか、バナヌをクリックしお登録するず、任意の構成のサヌバヌをレンタルした最初の月が10割匕になりたす。






All Articles