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.

[参考译文] MSP430F5659:与非TI器件的SPI通信

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430F5659, LMX2571

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/580657/msp430f5659-spi-communication-with-other-device-not-from-ti

部件号:MSP430F5659
主题中讨论的其他部件: LMX2571

您好,

我目前正在使用msp430f5659设备。 我要做的是使用SPI从其它设备接收数据。 我的设备是FSK接收器模块,输出为0~1.5 或0~1.8 数字数据摆动。

是否可以使用来自其他器件而不是TI的这些数据?

谢谢

Jongchan Woo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好Jongchan!

    当然,您可以将MSP430与非TI部件配合使用。 您必须注意信号水平- MSP的电源电压是多少? 当然,最好是传感器和微控制器在相同电压水平下工作。 否则可能需要级别转换程序。 查看下表了解阈值电压:

    传感器也是如此-如果它使用1.8V电压供电并接收3.3V的SPI信号,则过大的电流可能会流入器件。 在某些情况下,您可以使用简单的串联电阻器。 也许您想告诉您要使用的传感器和电源电压。

    Dennis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Dennis!

    感谢您回答我的问题。 我使用的是用于MSP的3.3V电源和用于接收器设备的1.8V电源。

    我要使信号为1.8V,为0,为0V。

    我不完全理解您向我展示的表格,所以可以将我的设备与MSP配合使用吗?

    谢谢
    Jongchan Woo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该表指出,在最坏情况下(取决于设备),MSP在3V电压下的逻辑电平可能高达2.1V。 在3.3V电压下,这将会更高。 1.8V可能起作用,但不能保证。 您可能会遇到传感器的问题,它可能不希望在1.8V的电压下由3.3V驱动-您可能需要使用电平转换器或自行执行一些电平转换。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢! 我要试试
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Dennis

    我还有另一个问题。 由于我的FSK接收器设备没有处理器,此设备唯一能做的就是将模拟信号连续转换为数字信号。 我认为SPI通信中的RXBUF是8位大小,因此MSP430连续只能读取8位。 因此,在读取两个缓冲区的数据之间必须有一些丢失的信号。 如何解决此问题?

    谢谢
    Jongchan Woo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SPI是每个传输8位-您将看到从属设备通常有8位或8位的倍数来读取或写入。 例如,对于16位ADC结果,您必须接收2倍8位的数据,并将数据组合到控制器内的16位字中。 24,32或64位数据也是如此。

    一个16位字可能如下所示:

    MSB -> 1101 1001 1011 0000 <- LSB

    如果您请求数据,通常首先获得MSB,这样您就可以执行如下操作:

    //数据:MSB -> 1101 1011 0000 <- LSB
    
    uint8_t data_buffer[2];
    uint16_t data_word = 0;
    
    data_buffer[0]=<请求MSB>;//1101 data_buffer[1]=
    <请求LSB>;// 1011 0000
    
    data_word = data_buffer[0]; // 0000 0000 1101 1001
    数据字<<=8; // 1101 1001 0000 data_word
    |= data_buffer[1];// 1101 1001 1011 0000 

    Dennis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的意思是,两个8位数据之间的读/写之间存在显著延迟,如上图所示。

    图中显示了SPI通信中的clk信号。只有在进行数据传输时,CLK才会上升和下降,因此每个黄色条对应于8位数据传输。

    在此图中,每个条之间存在相当大的延迟,这意味着MSP此时无法获取任何数据。 由于我们的接收器设备不断地将模拟数据转换为数字数据,因此应该会有一些数据丢失。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这取决于您从从属设备接收/写入数据的方式。 您可能永远不会有100 % 连续数据流。 是否使用中断?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我目前不使用寄存器读写功能作为以下功能。 您能推荐一个更快的功能吗?

    unsigned short LMX2571_ReG_Read (unsigned char ReG_address)

    volatile unsigned char dummy_rx;
    unsigned char SPI_Rx_buf[2];
    无符号短RetVal;
    RetVal=0;
    P4OUT (P4OUT)&=~BIT3; //为变速箱设置STE Low (STE低)

    UCA2TXBUF =(无符号字符)(0x80+注册地址); //将第一个字节发送到TX缓冲区:寄存器的地址
    ((UCA2STAT & UCBUSY)); // USSCI_B1 TX缓冲器就绪?
    虚拟处方= UCA2RXBUF;
    UCA2TXBUF = 0; //将第二个字节发送到TX缓冲区:虚拟数据
    ((UCA2STAT & UCBUSY)); // USSCI_B1 TX缓冲器就绪?
    SPI_Rx_buf[1]= UCA2RXBUF; //读取Rx buf:数据[23:16]
    UCA2TXBUF = 0; //将第二个字节发送到TX缓冲区:虚拟数据
    同时((UCA2STAT & UCBUSY)); // USSCI_B1 TX
    SPI_Rx_buf[0]= UCA2RXBUF; //读取Rx buf
    //读取Rx buf:数据[7:0]
    // __delay_cycles (10万);
    P4OUT || BIT3;//在变速箱末端将STE设置为HIGH (高)

    RetVal = SPI_Rx_buf[1];
    RetVal =(RetVal << 8)| SPI_Rx_buf[0];
    //RetVal =(SPI_Rx_buf[1]<16)|(SPI_Rx_buf[2]<8)|(SPI_Rx_buf[3]);
    __DELAY周期(5);
    返回 RetVal;
    }


    Void LMX2571_ReG_Write (无符号字符REG_ADDRESS,无符号短数据)

    volatile unsigned char dummy_rx;
    P4OUT (P4OUT)&=~BIT3; //为变速箱设置STE Low (STE低)
    UCA2TXBUF =(无符号字符)(REG_ADDRESS); //将第一个字节发送到TX缓冲区:寄存器的地址
    ((UCA2STAT & UCBUSY)); // USSCI_B1 TX缓冲器就绪?
    Dummy _Rx = UCA2RXBUF; // Dummy Read Rx buf
    UCA2TXBUF =(unsigned char)(data >>8); //将第二个字节发送到TX缓冲区:Data[23:16]
    ((UCA2STAT & UCBUSY)); // USSCI_B1 TX缓冲器就绪?
    Dummy _Rx = UCA2RXBUF; // Dummy Read Rx buf
    UCA2TXBUF =(无符号字符)(DATA和0x00FF); //将第三个字节发送到TX缓冲区:Data[15:8]
    同时((UCA2STAT & UCBUSY)); // USI_B1 TX缓冲器就绪?
    虚拟处方= UCA2RXBUF; //虚拟读取Rx buf
    P4OUT || BIT3;//变速箱末端SEN高

    __DELAY周期(3);
    }



    我使用LMX2571作为发射器,其功能名称来自。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    速度有问题吗? 不需要使用中断-您只想在程序不会被可以在后台执行的操作所阻止时使用它们。 您必须传输哪种数据?数据的传输量和接收频率如何?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我遇到了速度问题。 我想做的是FSK调制,使用LMX2571和msp430f5659作为发射器,另一个使用我的片外设备作为接收器的msp430f5659。 目标FSK频率约为500kHz bps。 我使用20MHz和40MHz信号作为FSK频率,通过写入与输出信号频率相关的寄存器。 (我已经在 e2e.ti.com/.../212.8701万上询问了几个有关此问题 的问题)。 但是,在当前设置中,FSK调制的bps大约为150kHz,即使我在MSP和LMX之间使用16MHz SPI clk,如上载的图所示。 我认为造成这种延迟的主要原因是我的注册代码的编写效率很低。 所以我尝试优化我的注册代码。

    简而言之,我想以比现在更快的速度写入LMX寄存器值,使FSK调制频率达到500kHz。

    另外,我想解调设备中接收的数据。 应使用SPI通信将解调数字数据传输到MSP。 在此部分中,问题是我的设备只会根据接收的频率"持续"生成0V或1.8V的数字数据。 因此,如果接收器设备和MSP之间的SPI通信与传输部件的通信相似,则会出现一些数据丢失。