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.

[参考译文] CCS/MSP430FR6989:MSP430-FR6989 (MSP430-EXP-FR6989)和加速计 LIS2DH (STEVAL-MKI)之间的 SPI 通信、以读取 WAND_AM_I 虚拟寄存器值

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/604997/ccs-msp430fr6989-spi-communication-between-msp430-fr6989-msp430-exp-fr6989-and-accelerometer-lis2dh-steval-mki--to-read-who_am_i-dummy-register-value

器件型号:MSP430FR6989

工具/软件:Code Composer Studio

我完全不熟悉 MSP430系列、只在这4天内开始工作。 我使用的是 MSP430-EXP-FR6989 launchpad,我的目标是>>使用 SPI 接口将 LIS2DH 加速计评估板(STEVAL-MKI)连接到 MSP430板,并读取 WHO _AM_I 寄存器的值并 在 UART 中打印该值。>>>

下面我附上了我的代码。

当我运行代码而不是虚拟寄存器 WAND_AM_I (即0011 0011 = 0x33)中存储的默认值时、我在 USCAA0RXBUF 上获得的值为0xFF。 当我发送请求使用 USCAA0TXBUF 读取 SIMO 线路上 WO_AM_I 寄存器的内容时。 我使用的是 CCS_STUDIO_v7。 对于 UART、也为 USCI-A1设置了。  

请原谅我的编码错误以及您在扫描时可能看到的所有错误、但请毫不犹豫地纠正我的错误。

-I 包含了许多用于测试目的的非活动变量<sorry about that too :\  

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include
#include

volatile unsigned char RXData = 0;
volatile unsigned char TXData;
uint8_t pVal;

int main (空)

WDTCTL = WDTPW | WDTHOLD;

P1SEL1 |= BIT5;  
P2SEL0 |= BIT0 | BIT1;  
PJSEL0 |= BIT4 | BIT5;
//P2SEL0 |= BIT5;
P4DIR |= BIT4;//表示 XT1
P4OUT |= BIT4;
PM5CTL0 &=~LOCKL;
CSCTL0_H = CSKEY >> 8;  
CSCTL1 = DCOFSEL_0;  
CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;  
CSCTL4 &=~LFXTOFF;
操作

CSCTL5 &=~LFXTOFFG;  
SFRIFG1 &=~OFIFG;
} while (SFRIFG1&OFIFG);  
CSCTL0_H = 0;
UCA0CTLW0 = UCSWRST;  
UCA0CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;
UCA0CTLW0 |= UCSSEL_ACLK;  
UCA0BR0 = 0x02;  
UCA0BR1=0;  
UCA0MCTLW = 0;  
UCA0CTLW0 &=~UCSWRST;  
UCA0IE |= UCRXIE;  
// TXData = 0x1;  
TXData = 0x0F;  

while (1)

UCA0IE |= UCTXIE;
//_ bis_SR_register (LPM0_bits | GIE);  
_bis_SR_register (GIE);
_DELAY_CYCLES (2000);  
UCA0TXBUF = TXData;


#pragma vector = USCI_A0_vector
_interrupt void USCI_A0_ISR (void)

开关(__evo_in_range (UCA0IV、USCI_SPI_UCTXIFG))

USCI_NONE 案例:  
中断;

USCI_SPI_UCRXIFG 案例:
RXData = UCA0RXBUF;
UCA0IFG &=~UCRXIFG;
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);  
中断;

USCI_SPI_UCTXIFG 案例:
accReadReg (TXData);
UCA0IE &=~UCTXIE;
中断;

默认值:
中断;

void accReadReg (uint8_t reg,uint8_t rec)

P4OUT = 0;
_DELAY_CYCLES (10);
spiWriteByte (reg);
spiWriteByte (0x00);
REC = UCA1RXBUF;
pVal = rec;


void WritspieByte (uint8_t write)
{  
UCA0IFG &= UCTXIFG;  
UCA0TXBUF =写入;
while (!(UCA0IFG&UCTXIFG));  

void spiReadByte (uint8_t *读取、uint8_t write2)


UCA0IFG &= UCTXIFG;
UCA0TXBUF =写入2;
while (!(UCA0IFG&UCTXIFG));
*读取= UCA0TXBUF;

void UART_init (void)  

WDTCTL = WDTPW | WDTHOLD;
P3SEL0 |= BIT4 | BIT5;
P3SEL1 &=~(BIT4 | BIT5);
PM5CTL0 &=~LOCKLPM5;
CSCTL0_H = CSKEY >> 8;
CSCTL1 = DCOFSEL_3 | DCORSEL;
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;
CSCTL0_H = 0;
UCA1CTLW0 = UCSWRST;
UCA1CTLW0 |= UCSSEL_SMCLK;
UCA1BR0 = 52;
UCA1BR1 = 0x00;
UCA1MCTLW |= UCOS16 | UCBRF_1 | 0x4900;
UCA1CTLW0 &=~UCSWRST;
UCA1IE |= UCTXIE | UCRXIE;
pVal = UCA0RXBUF;
// pVal ='1';
UCA1TXBUF = pVal;
//UCA1TXBUF = UCA1RXBUF;
//_bis_SR_register (LPM3_bits | GIE);
_bis_SR_register (GIE);
__no_operation();
while (!(UCA1IFG&UCTXIFG));

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

    Anate、您好!

    我建议查看 MSP430 MCU 上 eUSCI 和 USCI 串行通信常见问题解决方案的 SPI 部分。 此外、我注意到您正在从 SPI ISR 中调用多个函数。 绝不建议从 ISR 中调用函数。 相反、您应该在 ISR 中设置一个标志、然后在主循环中对其做出反应。  

    最后、您能否使用逻辑分析仪或示波器探测 SPI 总线并验证是否将正确的数据发送到 LIS2DH?

    此致、  
    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我一直没有听到您的声音、我将在我们的跟踪矩阵中关闭此线程。 您回来后仍可以在此处发送消息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的...当然...问题得到了解决 与一些代码重写相关