This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于msp430 spi输出数据的问题

Other Parts Discussed in Thread: MSP430F5341

请教各位老师

我使用msp430f5341搭建加速度计数据采集模块,由于spi四线制存在问题,改选用三线制,手动控制片选端置低,spi选用B0组,P2.7引脚为B0组spi片选,下面是我的读数据过程,0x80为加速度计某个寄存器的地址,希望将读回的数据存在temp中备用。

现在的现象是时钟片选可以看到置低,但是0x80发送到第六位的时候片选就置高了,这是为什么呢?

我的时钟端经过测试没有问题,数据输出端也能发出理想的数值。

我的spi配置程序也附在后面,请您看一下这样有什么不妥吗?

谢谢

while(1)

{

P2OUT = 0x00;

while (!(UCB0IFG&UCTXIFG)); //询问B0TXbuffer 是否准备好

UCB0TXBUF = 0x80; // 把地址写入振动传感器,最高位置1,写好后为0,发送完毕置1

while (!(UCB0IFG&UCTXIFG)); // 看是否发送完毕

while (!(UCB0IFG&UCRXIFG)); // 看RXBUF是否接收完毕

temp = UCB0RXBUF; // TX -> RXed character,发出数据

P2OUT = 0x80;

__delay_cycles(80);

}

spi初始化过程:

P3SEL |= BIT0+BIT1; // P3.0,1,2,选为外围模式。

P3SEL |= BIT2; // P3.2 SPI时钟

UCB0CTL1 |= UCSWRST; // **Put state machine in reset**,软件复位使能,时钟选为SMCLK。 // it is not yet in SPI mode

UCB0CTL1 |= UCSSEL__ACLK; // 时钟选为SMCLK。

UCB0CTL0 |= UCCKPL+UCMSB+UCMST+UCSYNC; // mode1=0x40,3-pin, 8-bit SPI master,片选为低电平有效。

                                                                                                 // UCSYNC=1同步模式使能,UCCKPL=1下降沿触发,UCMST=1主模式,UCMSB=1MSB先高后低八位。

P2SEL &= ~BIT7;

P2DIR |= BIT7;

UCB0BR0 = 0x02; // /2,必须倍频,BR0控制低8,BR1控制高8位

UCB0BR1 = 0;

UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**

UCB0IE |= UCRXIE; // Enable USCI_A0 RX interrupt,接收中断使能

  • 你好,

    非常感谢你把问题描述的这么详细。

    我看完之后也觉得奇怪,初始化看起来没有问题的。

    但是while循环里面逻辑上没有问题,程序实现在我有几个改进:

    1. P2OUT &= ~BIT7

        P2OUT |= BIT7;

    用来代替你的片选信号直接操作GPIO管脚。

    2.片选之后,经过微秒级延时在对SPI进行操作。

        拉高片选时,同样等待一会再拉高电平。

    3.进行完一个数据读取之后经过毫秒级延时再进行下一次操作。

    如果还是不行,把你SPI波形截取出来。四根信号我都需要。

  • 现在开发板出了点问题没有在我的手上,无法给您截取波形,等过些日子我再询问您吧。

    非常感谢您的解答和建议,希望可以保持联系。

    祝好!

  • 好的,

    保持联系,欢迎继续发帖支持deyisupport.

    TI永远欢迎各路朋友提问问提~

  • 我按照您说的方式修改了一下程序,得到了如下结果:

    通过spi发送0xA1出去,系统时钟8MHz,SPI时钟1.6kHz

    在片选后加入微秒延时,发数后加入毫秒延时可以出现正确的时序结果,如图1和图2,图1为系统时钟与输出端口信号,图2为片选与输出端口信号。

    但是如果将发数后的毫秒级延时去掉,现象就如图3所示,片选端出现错位现象。

    试了很多次,发现片选端的错位的确是与发送数据后的毫秒级延时直接相关。

    但是如果时钟通过延时1ms以上来保证数据的正确性,似乎传输速度就比较局限了,而且这样片选端的置高置低似乎不是通过发送BUF标志位控制的,而是通过延时控制的了,这是为什么呢?

    我的发数程序如下:

    while(1)
    {

    P2OUT &= ~BIT7;

    __delay_cycles(40);

    while (!(UCB0IFG&UCTXIFG));     //询问B0TXbuffer 是否准备好

    UCB0TXBUF = 0xA1;

    __delay_cycles(10000);

    P2OUT |= BIT7;

    __delay_cycles(40);

    }

    感谢您的指导!

  • 你好,

    我看到你spi时钟信号是1.6kH?

    这个时钟信号是不是太慢了,你能不能把时钟提上来再尝试一下?

    另外你程序的逻辑需要修改一下:

    while(1)
    {

    P2OUT &= ~BIT7;

    __delay_cycles(40);

    while (!(UCB0IFG&UCTXIFG));     //询问B0TXbuffer 是否准备好

    UCB0TXBUF = 0xA1;

    __delay_cycles(40);

    P2OUT |= BIT7;

    __delay_cycles(100000);/////一帧数据结束,休息一会!

    }