SPIはMSP430で文字化けしているようです


9

Launchpadボードに接続されたバス海賊から賢明なビットを取り出そうとしています(Sparkfunケーブルを使用:オレンジはP1.6、黄色はP1.5です。MOSIとMISOを混同していない限り、これは正しいはずです。 ...)。バス海賊を使用して何かを監視しているだけなので、CSを接続していません。

バス海賊は、SPI、125KHz、クロック極性アイドルLOW、出力クロックエッジアクティブからアイドル、入力サンプルフェーズ中央、/ CS、出力は正常に設定されています。

Launchpadには、外部クリスタルのないMSP430G2231があります。Code Composer Studioを使用すると、次のようになります。

#include  "msp430g2231.h"
volatile unsigned char value=0;

#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
    value+=1;
    USISRL=value;
    USICNT=8;
}
void main(void){
    WDTCTL = WDTPW + WDTHOLD;

    BCSCTL1 = CALBC1_1MHZ;                    // Set range
    DCOCTL = CALDCO_1MHZ;
    BCSCTL2 &= ~(DIVS_3);

    USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;
    USICTL1 |= USIIE;
    USICKCTL = USIDIV_3 + USISSEL_2;
    USICTL0 &= ~USISWRST;
    USISRL=value;
    USICNT = 8;

    __bis_SR_register(LPM0_bits+ GIE);  
}

これのほとんどはさまざまなサンプルから一緒に石畳です。データシートをよく読んだ後、USIクロックは125KHz(1MHzのSMCLKを8で割った値)で動作するように設定されているようですが、これを測定する余地はありません。

実行すると、バスの海賊から本質的にごみが出ます。PはUSI割り込みベクトルの最初の行にブレークポイントを配置し、それを3回通過させたので、バスの海賊から0、1、2を得たはずです。

0x00(0x00)0x00(0x00)][0x40(0x00)]

そして、それをフリーランさせて、私はこのようなものを手に入れます:

[0xFF(0x00)][0x3F(0x00)][0x7F(0x00)][0xBF(0x00)][0xC0(0x00)0x00(0x00)][0x40(0x00)0x80(0x00)]

それでも私が期待しているものとは何も似ていません。

私はほとんどの夜をチップのユーザーガイドに費やしてきましたが、それでも困っています。

これを書いているときに、バスパイレーツをロジックアナライザー(LogicSnifferを使用)として使用できることを発見し、そのように設定しました。そして、0x55をに書き込むようにプログラムをUSISRL変更し、を変更しUSIDIVUSIDIV_4、処理速度をもう少し遅くし、結果は次のとおりです。 ここに画像の説明を入力してください

クロック信号は良さそうです、LogicSnifferはそれが約285KHzであると報告しています...そしてMOSIは...特別です。私は0x55を書き込んでいるので、素晴らしい代替パターンを期待しますが、それはそれ以外です。

誰かが私が間違っているかもしれないことについて何か考えを持っていますか?チップの不良?他に何か?

編集:わかりました、私の側のマイナーな量。割り込みでSPIに書き込まれる値を変更していません。これを行うと、予想されるパターンが得られます。

ここに画像の説明を入力してください

しかし、インクリメントするバイトを書き出そうとすることに戻ると、私はガベージになります。 ここに画像の説明を入力してください

だから、私はまだ問題を抱えています、思ったほど大きくはありません...

編集2:以下のコメントのおかげで、以前は接続されていなかったバス海賊ケーブルのアース線を電源(Sparkfunのブレッドボード電源)のアースに結びました。以前は、彼らが共有した最も近い地面は、私がこのすべての機器を吊り下げているUSBハブに戻っていました。

これにより、カウンタープログラムの実行時にMOSIのグリッチが削除され、LogicSnifferが独自にバイトを正しくデコードできるようになりました。 ここに画像の説明を入力してください

監視モードのバス海賊はまだ奇妙な結果を報告しています:

[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]

書き込みの終わりを検出できるように見えます(角かっこで区切られていると思います)が、データはデコードされたままです。波形の見栄えがよくなったので、私はそれほど心配していませんが、バス海賊が混乱している理由を知っておくとよいでしょう。


3
最後の図は、MOSIラインにグリッチがあるように見えますが、clkからのクロストークの可能性があります。オシロスコープはありますか?配線はどのようなものですか。BusPirateとMSP430の間にしっかりとした短い接地がありますか?
Martin Thompson、

2
@MartinThompsonに同意します。MOSIラインに問題があり、バス海賊が混乱しています。2番目の画像に少し目を細めて、バス海賊が見たと考えているものを無視すると(Windowsの計算機に表示されるバイナリを入力し、16進数に変換しただけです)、6B-6C-6Dが得られます。バス海賊とMSP間の配線をクリーンアップする必要があります。
embedded.kyle

while(1);main()の最後にa または同等のものがないので、終了してランダムな処理を行いません。
Oli Glaser

2
@OliGlaser、シートを正しく読んでいる場合、LPM0に入ると、割り込みが発生するまで実際にCPUの実行が停止します。すべてではありませんが、ほとんどのTIのサンプルがこれを使用しています。MSP430を低電力部品として宣伝しているため、ビジーループは電力にあまり適していません。
Matt Sieker

1
ああ、私はこれが1歳を超えていることに気づきました。
apalopohapa 2013年

回答:


3

MSP430は、CPHA命名規則を逆にしたMCUの例であるため、標準のSPIの説明とは異なります。TIMSP430は、CPOLの代わりにUCCKPLという名前を使用し、そのUCCKPHはCPHA のです。2つのチップを接続する場合は、クロック位相の初期化値を慎重に調べて、正しい設定を使用していることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.