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.

[参考译文] MSP430F5529:与 CC2500 进行的 SPI 通信 — 未接收到正确的数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1535383/msp430f5529-spi-communication-with-cc2500---not-receiving-proper-data

器件型号:MSP430F5529
主题:CC2500 中讨论的其他部件

工具/软件:

大家好、我需要帮助、我尝试通过 SPI 通信读取 CC2500 模块的芯片 ID(如下图所示)、以便在线路下进一步使用它。  

这是 CC2500 的写入和读取操作:




以下是尝试读取和写入 CC2500 的代码:P1.0 LED 永远不会亮起

#include "intrinsics.h"
#include "msp430f5529.h"
#include <msp430.h>
#include "msp430f5xx_6xxgeneric.h"
#include <stdint.h>

uint8_t Dados = 0x00;

void send();

void read();

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  
  P1DIR |= 0x01;                            // P1.0 output
  P4DIR |= BIT7;                           // P4.7 output

  // LED desligados
  P1OUT &= ~BIT0;
  P4OUT &= ~BIT7;

  // SPI init - UCB0
  UCB0CTL1 |= UCSWRST;

  UCB0CTL0 |= UCMST + UCSYNC + UCMODE_0; // Master mode + Slave enabled - CS low

  UCB0CTL1 |= UCSSEL_3; // SMCLK

  // Bit rate
  UCB0BR0 = 1;
  UCB0BR1 = 0;

  // Port SPI init - 3.0, 3.1, 3.2 e 2.7
  P3SEL |= BIT0 + BIT1 + BIT2;
  P2DIR |= BIT7;
  P2OUT |= BIT7;

  //UCB0IE |= UCTXIE + UCRXIE;
  

  UCB0CTL1 &= ~UCSWRST;

  //__bis_SR_register(GIE);       // enable interrupts
  send();

  while (1)
  {

    read();

    // Verificar leitura do registo - ID do modulo RF
    if (Dados == 0x80)
    {
      P4OUT |= BIT7;
      //__delay_cycles(160000);
    }
    else
    {
      P4OUT &= ~BIT7;
      //__delay_cycles(160000);

    }
  }
}

void send()
{
  P2OUT &= ~BIT7;
  __delay_cycles(50);

  while(!(UCB0IFG & UCTXIFG));
  UCB0TXBUF = 0x30;

  P2OUT |= BIT7;
}

void read()
{
  //UCB0IFG &= ~(UCTXIFG + UCRXIFG);
  
  //UCB0IE |= UCRXIE;

  P2OUT &= ~BIT7;
  __delay_cycles(50);

  while(!(UCB0IFG & UCTXIFG));
  UCB0TXBUF = 0xC0 | 0x30;
  
  while(!(UCB0IFG & UCRXIFG));
  volatile uint8_t dummy = UCB0RXBUF;

  while(!(UCB0IFG & UCTXIFG));
  UCB0TXBUF = 0x00;
  while(!(UCB0IFG & UCRXIFG));
  Dados = UCB0RXBUF;

  P1OUT |= BIT0;

  //__bis_SR_register(GIE);
  //__bis_SR_register(LPM0_bits + GIE);
  //__no_operation();
  P2OUT |= BIT7;
}


这就是我在逻辑分析仪上看到的结果:


如果有人能帮助我尝试和找出什么错误,我会很高兴地感谢它谢谢!

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

    CC2500 先执行 SPI MSB。 您还没有为此配置 MSP430。

    由于从 send () 留下的设置 RXIFG、您的读取代码将失败。

    对于 SPI 模式的轮询 I/O、我更喜欢使用简单的读取/写入函数、而不是将 TXIFG 轮询分散在整个代码中。它会传输一个字节并返回接收到的任何数据。 非常简单。 将数据写入 TXBUF。 (如果这是访问 TXBUF 的唯一方式、则无需轮询 TXIFG。) 等待 RXIFG。 读取并返回 RXBUF。

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

    除了大卫提到的:

    > UCB0CTL0 |= UCMST + UCSYNC + UCMODE_0;//主模式+从模式启用 — CS 低电平

    数据表 (SWRS0440C) 图 7 表明 CC2500 预计 CPHA=0。 UCCKPH 的定义与 CPHA 相反、因此请尝试改用:

    > UCB0CTL0 |= UCMST + UCMSB + UCCKPH + UCSYNC + UCMODE_0;//主模式、MSB 在前、CPHA = 0、(CPOL = 0)

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

    谢谢大卫,这帮了我! 我现在有了它的工作!

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

    谢谢你 Bruce 这也帮助了我! 我现在有了它的工作! 认为这是它有时在沟通中卡住的原因... 非常感谢!