请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430G2553 您好!
我正在尝试在2553 (主器件)和2231 (从器件)之间建立 SPI 通信、以便能够切换从器件上的 P1.0 LED。
我找到了 TI 提供的一些代码、因此大多数后续代码都是通过这些代码获得灵感的。
由于我没有几个从器件,所以我只使用:MOSI 和 CLK。
实际上、当两个 LaunchPad 都插入到计算机中时、它就可以工作了。 但是、当其中一个设备插入另一台计算机或电池时、SPI 通信停止(失败)。
我假设这是一个接地问题、因此我将一个接地端连接到另一个接地端、但即使两个接地端都插入同一台计算机、通信仍然失败...
这是调试的一天、我找不到任何解决方案。
有人可以帮帮我吗?
以下是代码:
主设备:
void init_SPI (void){ P1DIR |= BIT5; P1SEL |= BIT5 + BIT7; P1SEL2 |= BIT5 + BIT7; UCB0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC; UCB0CTL1 |= UCSSEL_2; // SMCLK UCB0BR0 |= 0x02; ///2 UCB0BR1 = 0; // UCB0CTL1 &=~UCSWRST; //**初始化 USCI 状态机** __DELAY_CYCLES (75); //等待从器件初始 化} void init_timer_1s (void) { TA0CTL = tassel_2 | ID_3 | MC_3; TA0CCR0 = 0xFFFF; } void timer_wait (void) { TA0R = 0x00; while (!(TA0CTL 和 TAIFG)) ; TA0CTL &=~TAIFG; } void main (void){ WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 BCSCTL1 = CALBC1_1MHz; //将 DCO 设置为1MHz DCOCTL = CALDCO_1MHz; //将 DCO 设置为1MHz init_spi (); init_timer_1s (); __enable_interrupt (); while (1){ while (!(IFG2 & UCB0TXIFG)) ; UCB0TXBUF =数据; timer_wait(); while (!(IFG2 & UCB0TXIFG)) ; UCB0TXBUF =数据; Timer_wait(); }
从属方:
void init_SPI (void) { USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIOE;/*端口、SPI 从器件* USICTL1 |= USIIE;/*计数器中断、标志保持置位*/ USICTL0 &=~USISWRST;/* USI 被释放以进行操作*/ USISRL = P1IN;//初始化加载数据*/ USICNT = 8;/* init-load 计数器:NB DE BITS A Recevoir */ } void main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器*/ init_spi(); P1DIR |= 0x01; _enable_interrupt (); while (1) { // } } #pragma vector=USI_vector __interrupt void universal_serial_interface (void) { 开关(USISRL) { 情况0xA1: P1OUT |= 0x01; 中断; 情况0xB1: P1OUT &=~0x01; 中断; } USISRL = P1IN;//重新加载数据 USICNT = 8;//重载计数器