Other Parts Discussed in Thread: MSP430FR2110, MSP430FR4133
主题中讨论的其他部件: 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)。
我做错了什么?






















