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.

[参考译文] MSP430FR2110:MSP与ESP8266之间的SPI通信故障

Guru**** 2616675 points

Other Parts Discussed in Thread: MSP430FR2110, MSP430FR4133

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/661754/msp430fr2110-trouble-with-spi-communication-between-msp-and-esp8266

部件号:MSP430FR2110
主题中讨论的其他部件: MSP430FR4133

您好,

我正在尝试在MSP430FR2110 (从属)和ESP8266 (主)之间建立SPI通信。 目标是从MSP430读取ADC通道值并在ESP8266中使用。

下面是我的MSP430的代码(未定义ADC_ENABLE):

/**
* main.c
*请参阅:msp430fr211x_ADC10_10.c和msp430fr211x_euscia0_SPI_12.c
*/


#include <MSP430.h>//#define

ADC_enable

unsigned char Data =0;

unsigned RXADC_result[3]; // 8位ADC转换结果数组
无符号字符I;

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

#ifdef ADC_ENABLE
//配置ADC A0~2引脚
P1SEL0 || BIT0 + BIT1 + BIT2;
P1SEL1 || BIT0 + BIT1 + BIT2;
#endif

P1SEL0 || BIT4 | BIT5 | BIT6 | BIT7; //将4-SPI引脚设置为第二个函数

UCA0CTLW0|= UCSWRST; //**将状态机置于复位**
// 4引脚,8位SPI从UCA0CTLW0
|= UCMODE_2|UCSTEM|UCSYNC|UCMSB;// UCCKPL

//时钟极性高,MSB
// UCA0CTLW0 |= UCSSEL__ACLK; // ACLK
// UCA0BR0 = 0x02; // BRCLK = ACLK/2
// UCA0BR1 = 0; ////
UCA0MCTLW = 0; //无调制

UCA0CTLW0 &=~UCSWRST; //**初始化USCI状态机**
UCA0IE |= UCRXIE; //启用USI_A0 RX中断

PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式
//激活先前配置的端口设置
#ifdef ADC_ENABLE
//配置ADC
ADCCTL0 |= ADCSHT_2 | ADCMSC | ADCON; // 16ADCclks,MSC,ADC开
ADCCTL1 || ADCSHP | ADCCONSEQ_1 | ADCSSEL_1; // ADC时钟ACLK,采样计时器,软件触发,单序列
ADCCTL2 &=~ADCRES_1; // 8位转换结果
ADCMCTLS0 || ADCINCH_2 | ADCSREF_0; // A0~2 (EOS);ADCSREF_0 = Vref=ACC;ADCSREF_1 = Vref=1.5V
ADCIE |= ADCIE0; //启用ADC连接完全中断

//配置参考
PMMCTL0_H = PMMPW_H; //解锁PMM寄存器
PMMCTL2 |= INTREFEN; //启用内部参考
__DELAY周期(400); //参考确定延迟
//__no_operation();
#endif

	while (1)
	{
#ifdef ADC_ENABLE
		I =2;
		while (ADCCTL1 & ADCBUSY); //等待ADC内核处于活动
		状态ADCCTL0 |= ADCENC | ADCSC; //开始采样和转换
__bis_sr_register (LPM0_BITS | GIE); //输入LPM0,启用中断
		__no_operation(); //对于调试,保留在LPM0
		__DELAY_CYCLES (5000)中; //下一次传输前的延迟
#endif
		UCA0IE |= UCTXIE; //启用TX中断
		__bis_sr_register (LPM0_bits | GIE); //输入LPM0,启用中断
		__no_operation(); //对于调试,保留在LPM0中
	//__delay_cycles (200); //下一次传输前的延迟
		// TXData++;

	}//__bis_sr_register (LPM0_bits
| GIE); //输入LPM0,启用中断
}

#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector=USI_A0_vector
__interrupt void UISR_A0_A0(void)
#Elif defined(__GNU___)
#void_attribute_(interrupt (USCI_void_is_error_usiver);


#endif
{
// while (!(UCA0IFG&UCTXIFG)); // USI_A0 TX缓冲器就绪?
// UCA0TXBUF =(UCA0RXBUF); //回波接收数据

	开关(__偶 数_in_range(UCA0IV,USI_SPI_UCTXIFG)){
	
	案例USI_NONE:中断; //矢量0-无中断
	CASE USI_SPI_UCRXIFG:
		RXData = UCA0RXBUF;
		UCA0IFG &=~UCRXIFG;
		__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//唤醒以设置下一个TX
		中断;
	案例USI_SPI_UCTXIFG:
#ifdef ADC_ENABLE
		如果(RXData == 0x01)
			UCA0TXBUF = ADC_result[2]; //传输字符
		否则,如果(RXData == 0x02)
			UCA0TXBUF = ADC_result[0];
		否则,如果(RXData == 0x03)
			UCA0TXBUF = ADC_Result [1];
		否则
			UCA0TXBUF = 0x0F;
#else
		如果(RXData == 0x01)
			UCA0TXBUF = 0x03; //传输字符
		否则,如果(RXData == 0x02)
			UCA0TXBUF = 0x01;
		否则,如果(RXData == 0x03)
			UCA0TXBUF = 0x02;
		否则
			UCA0TXBUF = 0x0F;
#endif

		UCA0IE &=~UCTXIE;
	中断;
	默认:break;
	}


#ifdef ADC_enable
// ADC中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector=ADC_vector
__interrupt ADC_ISR(void)
#Elif defined(__GNUC__)
void __attribute__)((vector Isr_error_ad_use)


#endif
{
SWITCH(__EIV_IN_RANGE(ADCIV,ADCIV_ADCIFG))
{
案例ADCIV_NONE:
中断;
Case ADCIV_ADCOVIFG:
中断;
Case ADCIV_ADCTOVIFG:
中断;
Case ADCIV_ADCHIIFG:
中断;
Case ADCIV_ADCLOIFG:
中断;
Case ADCIV_ADCINIFG:
中断;
问题ADCIV_ADCIFG:
ADC_result[i]= ADCMEMM0;
如果(i = 0)
{
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //存在LPM0
}
否则
{
i -;
}
中断;
默认:
中断;
}
}
#endif

ESP8266的SPI主代码为attached.e2e.ti.com/.../SPI_5F00_Master_5F00_ESP8266.cpp

问题是我在ESP8266上总是收到15。 当我尝试调试具有调试 点的MSP430时,它位于行 UCA0IE |= UCTXIE;中断需要很长时间才能达到此点。  

RXData似乎也是随机的(有时为0x03,但大多数时间为0x82),因此15为TXed ​

我检查了相位和极性,并将其与ESP8266匹配。 这是示波器 捕获(紫色为CS,黄色为CLK,蓝色为MOSI,粉色为miso)。

我做错了什么?

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

    从显示的示波器捕获中,从(FR2110)向主中继器发送了0x0F,这意味着代码正在运行到线路116。 其指示为RXData不是0x01,0x02或0x03。 但是,显示0x02的MOSI数据。

    您应检查ESP8266上的SPI主配置,以匹配FR2110上的从配置。 并在FR2110的第94行的调试点处停止,以确保接收到的数据正确无误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    赵日廷

    [引述用户="Wei.Jetim Zhao")

    您应检查ESP8266上的SPI主配置,以匹配FR2110上的从配置。 并在FR2110的第94行的调试点处停止,以确保接收到的数据正确无误。

    [/引述]

    我已经这样做了几次。 对于前几次交易,接收到的RXData 与从主中继器发送的数据匹配。 当我在第110或112行保留断点时,它确实会停止,但这只发生几次。 不确定如何使其可靠运行

    如示波器捕获所示,ESP8266上的SPI配置与FR2110中的配置匹配(CKPL和CKPH)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否可以在第94行的RXData = UCA0RXBUF中检查接收到的数据? 如果失败,收到了哪些数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Wei,

    我在ESP8266中将每次SPI传输之间的延迟更改为10秒,以便我可以截屏。 我进行了几次测试并观察到以下情况:

     我开始用第95行的断点进行调试。

    我观察到,对于'2'的Tx, RXData 为'6';对于治疗为'3', RXData 为'7';对于'1' 的TX,RXData 为'3'。 这意味着位1附加在 UCA0RXBUF的MSB上。

    我意识到问题是由时钟相位引起的,所以我设置了UCCKPH 位。

    UCA0CTLW0 |= UCMODE_2|UCSTEM|UCSYNC|UCMSB|UCCKPH;// UCCKPL 

    之后我能够收到正确的值。


    但新的问题是ESP8266 (Master)仅在调试FR2110时接收正确的数据。 当FR2110未调试时,ESP8266未接收到正确的数据。

    注意:

    我已更改FR2110中的if-else语句以发送不同的值:

    		如果(RXData == 0x01)
    			UCA0TXBUF = 0x09; //传输字符
    		否则,如果(RXData == 0x02)
    			UCA0TXBUF = 0x07;
    		否则,如果(RXData == 0x03)
    			UCA0TXBUF = 0x08;
    		否则
    			UCA0TXBUF = 0x0F; 

    如以上屏幕截图所示,我只能在调试模式下从FR2110接收正确的数据。 在正常模式下,它会发送意外数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    看起来FR2110可以正确接收数据。 我建议您确定SOMI信号的范围,以确保线路上的数据显示正确的值,您可以判断FR2110输出数据或ESP8266输入是否有问题。

    此外,我再次建议您检查主中继器和从中继器之间的SPI协议配置。 对于FR2110部件,您可能需要注意UCAxCTLW0寄存器中的所有位,以确保它与ESP8266配置相匹配。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vijayentiran Subramaniam您好!

    我将从明天开始休农历新年假期。 由于访问E2E的限制,我的回复将会延迟。

    但请随时回复您的调试进度。 我们的MSP专家将跟进您的主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Wei,

    享受您的假期。 我正在发布我的进度。

    [引述用户="Wei.Jetim Zhao")

    我建议您确定SOMI信号的范围,以确保线路上的数据显示正确的值,您可以判断FR2110输出数据或ESP8266输入是否有问题。

    [/引述]

    我根据你的建议进行了探探探,但结果与上述相同。 不在“调试”模式时,SOMI数据行始终为30 (十进制)。  在调试会话时,SOMI数据行发送正确的值。 (如下图所示)。  它是否与编译器优化有关? 我读到在调试时目标的大多数时钟的行为不同。 在这种情况下,这是否会产生影响?  

    [引述用户="Wei.Jetim Zhao")


    我再次建议您检查主中继器和从中继器之间的SPI协议配置。 对于FR2110部件,您可能需要注意UCAxCTLW0寄存器中的所有位,以确保它与ESP8266配置相匹配。

    [/引述]

    我仔细检查了一下。 我在配置中找不到任何不匹配。 此外,如果存在任何不匹配,则在调试会话中,SOMI数据将出错。

    调试会话之前和之后:

    示波器图像:

    将以上6幅图像组合 为gif,以便于可视化

     

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

    你好,Vijayentiran,

    您是否可以在以下交换机中设置GPIO标志以确认设备在不调试的情况下运行哪条线路?


    #否则
    如果(RXData == 0x01)
    UCA0TXBUF = 0x03; //传输字符
    否则,如果(RXData == 0x02)
    UCA0TXBUF = 0x01;
    否则,如果(RXData == 0x03)
    UCA0TXBUF = 0x02;
    否则
    UCA0TXBUF = 0x0F;
    #endif 

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

    您的问题是否有任何更新? 我已经有几天没有听到过。 如果您对此仍有疑问,请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Wei,

    非常抱歉回复太晚。 我在不同的位置工作,没有设置来测试。

    正如您所建议的,我在switch语句中添加了GPIO分析,如下所示:

    如果(RXData == 0x01)
    {
    	P1OUT |= BIT2;
    	UCA0TXBUF = 0x09; //传输字符
    	P1OUT &=~BIT2;
    }
    ELSE IF (RXData == 0x02)
    {
    	P1OUT |= BIT3;
    	UCA0TXBUF = 0x07;
    	P1OUT &=~BIT3w;
    }
    ELSE IF (RXData == 0x03)
    {
    	P2OUT |= BIT0;
    	UCA0TXBUF = 0x0
    	;
    UPBXOUT =~
    = PB1UIT0;UPBXOUT == PB1UPB0
    
    	
    	
    	P2OUT &=~BIT1;
    } 

    GPIO切换仅在调试模式下正确发生。 但是,如果不进行调试,则不会切换GPIO引脚。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在同一个项目中测试了更多芯片?

    您能否与我分享您的整个CCS项目以及CCS版本? 我想在我这边测试一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    wei.jetim hai 说:
    您是否在同一个项目中测试了更多芯片?

    我还没有尝试过。 将在尝试后很快通知您结果。

    [quote user="wea.jetim hahao"您能否与我分享您的整个CCS项目以及CCS版本? 我想在我这边测试一下。[/QUOT]

    请检查附件。

    CCS: 版本:7.3 .0.0.0019万  

    编译器版本:TI v 16.9 .6.LTS

    e2e.ti.com/.../ADC_5F00_SPI_5F00_Project_5F00_Files.zip

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

    我提出了两个奇怪的看法。

    当MSP430通过 MSP430FR4133 Launchpad (用于编程)从外部供电时,ESP8266将开始接收零,大约2分钟后,它将开始接收正确的值。

    显示测试设置:

    ESP8266上的串行监视器:

    当MSP430直接由ESP8266板供电时,ESP8266将开始接收固定值30,半小时后也不会发生任何事情。 我随机打开示波器,然后ESP8266开始接收正确的值。 当我关闭示波器时,也会发生同样的情况。

    我将尝试以不同的顺序打开MSP430和ESP8266的电源,并将更新结果,因为我认为在ESP8266启动通信后MSP430需要重置。