我正在尝试从连接到 Launchpad 板上的 Bus Pirate 中获取明智的信息(使用 Sparkfun 电缆:橙色连接到 P1.6,黄色连接到 P1.5。这应该是正确的,除非我对 MOSI 和 MISO 感到困惑...)。我没有连接CS,因为我只是使用公共汽车海盗来监视任何东西。
总线盗版设置为SPI,125KHz,时钟极性Idle low,输出时钟沿Active to idle,输入采样相位中间,/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)]
这看起来仍然不像我所期待的那样。
晚上的大部分时间我都在阅读芯片的用户指南,但我仍然很难过。
在写这篇文章时,我发现我可以将 Bus Pirate 用作逻辑分析器(使用 LogicSniffer),并将其设置为这样做。并将程序修改为将 0x55 写入USISRL
,并将 更改为USIDIV
以USIDIV_4
进一步减慢速度,结果如下:
时钟信号看起来不错,LogicSniffer 报告说它大约是 285KHz……而 MOSI 是……特别的。我希望有一个很好的交替模式,因为我正在写出 0x55,但这不是。
有人对我可能做错了什么有任何想法吗?芯片坏了?还有什么?
编辑:好的,我的白痴数量很少。我没有更改在中断中写入 SPI 的值。这样做会产生预期的模式:
然而,回到试图写出一个递增的字节让我很垃圾:
所以,我仍然有一个问题,只是没有我想象的那么大......
编辑 2:多亏了下面的评论,我将以前未连接的 Bus Pirate 电缆上的地线连接到我的电源(Sparkfun 的面包板电源)上。以前,他们共享的最近的地面是我将所有这些设备挂在上面的 USB 集线器。
这消除了运行计数器程序时 MOSI 上的故障,LogicSniffer 现在可以自行正确解码字节:
监控模式下的总线盗版仍然报告奇怪的结果:
[0x00(0x00)][0x04(0x00)][0x06(0x00)][0x10(0x00)][0x10(0x00)][0x10(0x00)][0x12(0x00)][0x18(0x00)]
它似乎确实能够更好地检测写入的结束(我假设这是方括号分隔的内容),但是解码的数据仍然关闭。我现在不太担心波形看起来更好,但是知道为什么 Bus Pirate 会感到困惑仍然很高兴。