SPI在MSP430上似乎出现乱码


9

我正在尝试从连接到启动板的Bus Pirate中获取明智的信息(使用Sparkfun电缆:橙色变为P1.6,黄色变为P1.5。除非我对MOSI和MISO感到困惑,否则这应该是正确的...)。我没有连接CS,因为我只是在使用海盗车监视任何东西。

总线盗版设置为SPI,125KHz,时钟极性空闲低,输出时钟边沿有效到空闲,输入采样相位中间,/ CS,输出正常。

在启动板上,我有一个没有外部晶体的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变得困惑仍然很高兴。


3
最后一张图看起来像MOSI线上的毛刺,可能是来自clk的串扰。你是示波器吗?您的接线是什么样的-BusPirate和MSP430之间是否有良好的短路接地?
马丁·汤普森

2
我同意@MartinThompson。MOSI生产线出现故障,并且海盗车迷糊了。如果您在第二张图片上斜视一下,而忽略了Bus Pirate认为的内容(我只是在Windows计算器中输入了我看到的二进制文件并转换为十六进制),您将得到6B-6C-6D,并按需要递增。您需要清理Bus Pirate和MSP之间的接线。
Embedded.kyle

我看不到while(1);main()末尾的或等价物来阻止它退出并做随机的事情。
奥利·格拉泽

2
@OliGlaser,如果我没看错,进入LPM0实际上会暂停CPU执行,直到发生中断。TI的大多数(如果不是全部)样本都使用此方法。这是有道理的,因为它们将MSP430吹捧为低功耗部件,并且繁忙的环路对电源的要求不是很高。
Matt Sieker

1
哦,我的,我刚刚注意到这是> 1岁。
apalopohapa13年

Answers:


3

MSP430是一个MCU示例,它颠倒了CPHA命名约定,因此与标准SPI描述有所不同:TI MSP430使用名称UCCKPL代替CPOL,其UCCKPH 与CPHA 相反。将两个芯片连接在一起时,请仔细检查时钟相位初始化值,以确保使用正确的设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.