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
変更し、を変更しUSIDIV
てUSIDIV_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)]
書き込みの終わりを検出できるように見えます(角かっこで区切られていると思います)が、データはデコードされたままです。波形の見栄えがよくなったので、私はそれほど心配していませんが、バス海賊が混乱している理由を知っておくとよいでしょう。
while(1);
main()の最後にa または同等のものがないので、終了してランダムな処理を行いません。