2022年12月29日

新しいPICに搭載のSPIモジュール

最近はMSSP(Master Synchronous Serial Port)から、より機能性が増えた、新しいSPIモジュールが搭載されてたチップが増えてきている。
そのため新しいSPIモジュールではアプリケーション側手順も違ってます。
どちらが搭載されているかはデータシートを見ないと、パラメトリック検索では分からないです。
ただ、PPS(Peripheral Pin Select)が搭載されている事で可能になった部分も大きいので
PPSが無いものは従来のMSSPの可能性が大きいです。
(全てのチップを調べたわけではないのでデータシートを確認してください)

○MSSP(もっと古いPICではSSP)の動作概要
・SPIかI2Cを切り替えて使い、I/Oピンが共通である。(SDI/SDA , SCK/SCLとなっている)
・シフトレジスタが1つでループになっている SDI→[SSPSR]→SDO
・バッファ(SSPBUF)に書き込むと転送開始され、完了と同時にSSPSRからSSPBUFに読まれる
・完了するとSSPIF(Interrupt flag)がセットされる(SSPIFをリセットして転送完了)

○SPIモジュールの動作概要(HOST動作)
・SPIモジュールはI2Cと独立しており、どちらもPPSでI/Oピンを選択できる
・シフトレジスタが独立しておりループになっていない SDI→[RX Shift Register] / [TX Shift Register]→SDO
・バッファは送信、受信とも2段のFIFOになっており、送信FIFO、受信FIFO、または両方のFIFOを使用するかセレクトできる
・転送は8ビット以外にも設定出来るため、可変長ビットの転送も可能(7ビットや14ビットなど)
・送信ではTXRをセットし、転送するデータサイズを設定して、FIFOへ書き込むと転送が開始される
・受信ではRXRをセットし、転送するデータサイズを設定すると転送が開始される
・送受信ではTXRとRXRをセットし、転送するデータサイズを設定して、FIFOへ書き込むと転送が開始される
・転送状況のステータスは SPIxTXIF, SPIxRXIF ,SRMTIFのなどのフラグで構成されている


○各種フラグについて

・SPI Transmit (SPIxTXIF)
送信FIFOが空きがあるとセットされるので、フルになるとリセット状態になる(Read Onlyでリセットは不要)
連続して書き込む場合はこのフラグを確認し、空いていたらで連続して書き込める

・SPI Receive (SPIxRXIF)
受信FIFOにデータがあるとセットされるので、データがない間だけリセット状態(Read Onlyでリセットは不要)
セットされるとデータの受信が完了している事を示すため、このフラグがセットされていたら読み込みをする

・Shift Register Empty (SRMTIF)
転送が完了するとセットされる、転送が始まるとリセットされるがソフトウェア側でリセットが必要。
転送の終わり(FIFOがゼロかつシフトレジスタが空)の場合にセットされる。

・TXWE (Transmit Buffer Write Error)
送信FIFOがフルの状態でFIFO(SPIxTXB)へ書き込むと、FIFOへデータの書き込みされずにこのフラグがセットされる。
クリアはソフトウェアで行う必要がある。

・TXBE (Transmit Buffer Empty)
送信FIFOが空の状態でセットされる(Read Only)

・RXRE (Receive Buffer Read Error)
受信FIFOが空の状態でFIFO(SPIxRXB)を読み込むと、ゼロのデータが読み込まれ、このフラグがセットされる。
クリアはソフトウェアで行う必要がある。

・RXBF (Receive Buffer Full)
受信FIFOがフルでセットされる。(Read Only)


○送受信の動作(FullDuplex)

SPIxCON2bits.TXR = 1; // Transmit Data-Required Control
SPIxCON2bits.RXR = 1; // Receive FIFO Space-Required Control
SPIxTCNT = 1; // Set to SPI Transfer Counter Register
SPIxTXB = Data; // Load data into SPI Transmit Buffer
while (PIRnbits.SPIxRXIF == 0); // Check for any SPIx Receive Interrupts; 0 is FIFO Empty; flag is read-only.
return SPIxRXB; // Read Data from SPI Receive Buffer Register;

○送信の動作(Transmit Only)

SPIxCON2bits.TXR = 1; // Transmit Data-Required Control
SPIxCON2bits.RXR = 0; // Receive FIFO Space-Required Control
SPIxTCNT = 2; // Set to SPI Transfer Counter Register 2 Byte
SPIxTXB = Data1; // Load data into SPI Transmit Buffer

// 連続して書き込む場合などでバッファをチェックする場合
while (PIRnbits.SPIxTXIF== 0); // Check for any SPI Transmit Interrupts; 0 is FIFO Full; flag is read-only.
SPIxTXB = Data2; // Load data into SPI Transmit Buffer

// 転送ブロックの終了待ちをする場合
while(SPIxINTFbits.SRMTIF==0); // 1 = The data transfer is complete (Shift Register Empty Interrupt Flag)
SPI1INTFbits.SRMTIF = 0; // must be cleared in software.

送信専用モードではSPIxTCNTを設定しなくても転送可能でSPIxTXBへ書き込んだ時点からクロックがスタート。
書き込みと同時にSPIxTCNT=0はディクリメントされて最大値になる。
そのため、SPIxTXIFをチェックしながら送信が終わるまでデータを書き続けることで連続送信が出来る。
(ただし全ての転送が終わる(SRMTIF)がセットさせる前にデータをSPIxTXB へセットする必要ががある。)
FIFOが空になるとクロックが停止し転送が終了する。


○受信の動作(Recieve Only)

SPIxCON2bits.TXR = 0; // Transmit Data-Required Control
SPIxCON2bits.RXR = 1; // Receive FIFO Space-Required Control
SPIxTCNT = 1; // Set to SPI Transfer Counter Register
//SPIxTXB = Data; // Load data into SPI Transmit Buffer
while (PIRnbits.SPIxRXIF == 0); // Check for any SPIx Receive Interrupts; 0 is FIFO Empty; flag is read-only.
return SPIxRXB; // Read Data from SPI Receive Buffer Register;

 受信をする場合、FIFOがフルになると、クロックが一時停止する。SPIxRXBを読み込み、FIFOが空くと転送継続される。
 受信専用モードではSPIxTCNT に書き込んだ時点でクロックが開始される。
 データをSPIxTXBに書き込むと転送はされるがFIFOの占有率は変化しない。(FIFOの最初のデータが繰り返し出力される)
 送信FIFOにデータが無い場合は最後に受信したデータが送信される。(ループ動作)

○転送OFFの動作(Transfer-Off)

SPIxCON2bits.TXR = 0; // Transmit Data-Required Control
SPIxCON2bits.RXR = 0; // Receive FIFO Space-Required Control
SPIxTCNT = 1; // Set to SPI Transfer Counter Register
SPIxTXB = Data; // Load data into SPI Transmit Buffer

転送はされないが(クロックは停止)、送信FIFOに書き込まれ、RXR がセットされると送信される。
送信データを最初にセットすることが可能。
posted by Sugi at 16:45| Comment(0) | TrackBack(0) | 電子回路

2021年11月30日

MCP23008/MCP23S08

データシート所々間違っているので注意が必要

・日本語訳にはI-温度品,E-温度品とあるが、製品自体はそのバリエーションはない。
(全て-40℃〜+125℃品の製品)
・英文はI-Temp,E-Tempでレンジを記号で表してる(I温度=-40℃ 〜 +85℃ 、E温度=-40℃ 〜+125℃)
・その上で英文データシートでは次のようになっている
供給電圧は 1.8V〜5.5V (条件なし)
(1)-40℃ 〜 +85℃ (I) の範囲で 1.8V〜5.5V の電圧では I2C は 100 kHz, SPI は 5 MHz
(2)-40℃ 〜 +85℃ (I) の範囲で 2.7V〜5.5V の電圧では I2C は 400 kHz, SPI は 10 MHz
(3)-40℃ 〜+125℃ (E) の範囲で 4.5V〜5.5V の電圧では I2C は 1.7 MHz, SPI は 10 MHz
データシート上の特性要件はこれら(1)〜(3)の条件でテストしている
ただしEの条件は特性だけで、100%のテストはしてないですよん、とのこと

電圧が下がると、高速動作しなくなり、温度が高くても動作条件が変わるのですが
I2Cで1.7MHzで動作させたり、E温度を考慮するならば4.5V以上が必要ということです。

3.3Vかつ(I)の温度域で使えば、I2Cは400kHz、SPIは10MHzがMaxとなる。
各特性値も上記I,Eと電圧をテスト条件として記述されてます。

ちなみに秋月の商品説明も4.5V〜5.5Vとなっているが、実際は1.8V〜5.5Vが動作電圧です。
(MCP23017/MCP23S17と同じ)

posted by Sugi at 16:35| Comment(0) | TrackBack(0) | 電子回路

2021年11月17日

マキシムのLEDドライバ 備忘録

○MAX7219/MAX7221
・5V駆動の8桁(8×8 Matrix)カソードコモンLEDドライバ SO-24pin
・No-Decode Digit または Code B Fontのデコード(デコード有効桁を任意に設定可能)
・VIHが3.5VminのCMOS入力。TTL,LVCMOSから入力できない。(レベルシフター必要)
・SourceとSinkが独立(16ピンで8×8を駆動)

・MAX7219はシフトとラッチが独立で標準ロジックのシリアル-パラレル動作
 →Loadの状態は関係なくCLKの立ち上がりでシフトイン、Loadの立ち上がりエッジでラッチ。(CLKは常に有効)
 LOADをクロック同期で連続書き込みというようなことをするとか(もちろんSPIでも問題ない)

 SEGxは出力ドライバ(Source)はオフになるとGNDにプルダウン。(ISEG=5mA)
 DIGxは出力ドライバ(Sink)はオフ、で V+にプルアップ。(IDIGIT=-2mA)
 PushPull出力ということ

・MAX7221はSPI,Mircrowire互換のインターフェースに加え、EMI対策でセグメントドライバにスルーレート制限あり
 →CS=Lの後、CLKの立ち上がりでシフトインされ、CSの立ち上がりエッジでラッチ。(CS=Lの場合だけCLKが有効)

 SEGxは出力ドライバ(Source)はオフになると、ハイインピーダンス。
 DIGxは出力ドライバ(Sink)はオフになると、ハイインピーダンス。
 スルーレート制限のためオープンドレイン(オープンコレクタ)

両者ともDOUTはハイインピーにはならない

interface.png

○MAX6950/MAX6951
・2.7V〜5V駆動の5桁(MAX6950)/8桁(MAX6951)(n×8 Matrix)カソードコモンLEDドライバ SO-16pin EPあり
・低電圧駆動,Segment blinkingが必要な場合はこちらを選択
・P0,P1の二つのDigitレジスタで点滅表示、交互表示が可能(4MHz時0.5s/1sで切替)
・No-Decode Digit または Hexadecimal のデコード(デコード有効桁を任意に設定可能)
・VIHが2.3Vmin 5V駆動でも TTL,LVCMOS入力可
・OSCピンによりドライバの駆動周波数を設定可能、また外部からTTL/CMOSクロックを供給し同期駆動が可能
・SourceとSinkが共用(9ピンで8×8を駆動、接続マトリクスあり)
 →ピンが少なくなる利点と引き換えに桁とセグメント出力が共用で結線がちょっとややこしい
 SEGx/DIGxの出力ドライバ(Source/Sink)はオフになると、ハイインピーダンス。
(ハイサイドとローサイドでピン共用)
・LEDのVf+0.6V以上ヘッドルームが電源電圧に必要とのこと


こちらは3.3Vマイコンで直接接続出来ますし、Vfが3.3VのLEDだと電源4.5V位で駆動させたら扱いが良さそうです。
posted by Sugi at 19:17| Comment(0) | TrackBack(0) | 電子回路

2012年06月12日

WavePlayer3.0が公開されました

VectorにWavePlayer3.0が公開されました。

今回のバージョンからウィンドウドッキングをサポートしており
ウィンドウ表示中の配置を自由に構成できます。
もちろん従来通り、関連づけ起動は別途表示状態を設定できますので
お好みの動作で起動されます。

またタスクトレイアイコンを自由に設定できますので好きなキャラアイコンを
アニメーションさせるといったカスタマイズも出来ます。


ダウンロードはこちらです。

http://www.vector.co.jp/soft/dl/winnt/art/se267960.html

posted by Sugi at 01:03| Comment(2) | TrackBack(0) | ソフトウェア

2012年06月06日

WavePlayer 新バージョン

長らくお待たせいたしました。(待ってる人は居るのかな?汗)
WavePlayer Ver3をリリースいたします。

Vectorには申請中ですので近日公開されるかと思います。

新バージョンではコアを一新して、軽量さを維持しながら色々機能を強化しております。
また旧バージョンではVista,7での関連づけをアプリから行えない事もあり
今回からOS仕様に沿った関連づけ方法へ変更しております。

wma,flacの対応、wavはRF64のサポートもされております。

以前要望のあったUnicode版として作成されておりますので、S-JISで対応できないファイル名の物も再生できるかと思います。
(そのためV3.0から9x系OSは未サポートとなりました)

その他アナウンスは追い追いしていきます。

このアプリも生まれて10年を過ぎたと思いますが、今後ともWavePlayerをよろしくお願いします。
posted by Sugi at 22:26| Comment(0) | TrackBack(0) | ソフトウェア

2008年06月10日

PIC16F 6番台

Overview
オシレータ搭載、コンパレータあり
630/676を除きnanoWattテクノロジー

○PIC16F627A/628A/648A

16I/O、18ピン
INTOSC 4MHz内蔵
A/D無し
AUSARTあり


Type価格Prog
Word
ROMRAM
PIC16F627A\1601k128224
PIC16F628A\2002k128224
PIC16F648A\2004k256256


○PIC16F630/676(SOIC-14ピンのみ販売)


12I/O、16ピン
INTOSC 4MHz内蔵
コンパレータあり(これらだけ1ch)

630はA/D無し

Type価格Prog
Word
ROMRAM
PIC16F630\1301k256128
PIC16F676\1502k256128


○PIC16F631/677/685/687/689/690
(AKIPROG未対応)


18I/O、20ピン
INTOSC 8MHz/32KHz内蔵
10BitA/Dあり(631除く)

Type価格Prog
Word
ROMRAMRemariks
PIC16F677\1702k256128I2S/SPI
PIC16F685\1904k256256ECCP1
PIC16F687\1802k256128EUSART,I2S/SPI
PIC16F689\1804k256256EUSART,I2S/SPI
PIC16F690\2104k256256EUSART,I2S/SPI,ECCP1


○PIC16F688(AKIPROG未対応)


12I/O、14ピン
INTOSC 8MHz/32KHz内蔵
10BitA/Dあり

PIC16F689の14ピン的タイプ
ただしI2S/SPIがない

Type価格Prog
Word
ROMRAMRemarks
PIC16F688\1604k256256EUSART

posted by Sugi at 02:33| Comment(0) | TrackBack(0) | 電子回路